dalvik / CleanSpec.mk:47:***缺少分隔符。停止。 AOSP建设的错误

时间:2013-12-05 23:07:02

标签: android makefile

我知道这个*** missing separator.是非常常见的makefile错误,主要发生在SPACE被滥用而不是TAB时。 但这种情况发生在AOSP构建期间,其他人很好地构建。

根据Ubuntu13.10的一些指南,我尝试了AOSP构建。

一开始,我收到以下错误

  

dalvik / CleanSpec.mk:47: * 缺少分隔符。停止。

/dalvik/CleanSpec.mk

41 # For example:
42 #$(call add-clean-step, rm -rf $(OUT)/target/common/obj/APPS/AndroidTests_intermediates)
43 #$(call add-clean-step, rm -rf $(OUT)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
44 #$(call add-clean-step, find $(OUT) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
45 #$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
46 #$(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
47 $(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
48 $(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
49 $(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
50 $(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
51 $(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
52 $(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)
53 $(call add-clean-step, rm -rf $(OUT)/obj/SHARED_LIBRARIES/libdvm*)

http://androidxref.com/4.4_r1/xref/build/core/cleanbuild.mk

define _add-clean-step
  $(if $(strip $(INTERNAL_CLEAN_BUILD_VERSION)),, \
      $(error INTERNAL_CLEAN_BUILD_VERSION not set))
  $(eval _acs_makefile_prefix := $(lastword $(MAKEFILE_LIST)))
  $(eval _acs_makefile_prefix := $(subst /,_,$(_acs_makefile_prefix)))
  $(eval _acs_makefile_prefix := $(subst .,-,$(_acs_makefile_prefix)))
  $(eval _acs_makefile_prefix := $(_acs_makefile_prefix)_acs)
  $(if $($(_acs_makefile_prefix)),,\
      $(eval $(_acs_makefile_prefix) := $(INTERNAL_CLEAN_BUILD_VERSION)))
  $(eval $(_acs_makefile_prefix) := $($(_acs_makefile_prefix))@)
  $(if $(strip $(2)),$(eval _acs_id := $($(_acs_makefile_prefix))),\
      $(eval _acs_id := $(_acs_makefile_prefix)$($(_acs_makefile_prefix))))
  $(eval INTERNAL_CLEAN_STEPS += $(_acs_id))
  $(eval INTERNAL_CLEAN_STEP.$(_acs_id) := $(1))
  $(eval _acs_id :=)
  $(eval _acs_makefile_prefix :=)
endef
define add-clean-step
$(eval # for build/core/cleanspec.mk, dont use makefile path as part of step id) \
$(if $(filter %/cleanspec.mk,$(lastword $(MAKEFILE_LIST))),\
    $(eval $(call _add-clean-step,$(1),true)),\
    $(eval $(call _add-clean-step,$(1))))
endef

/build/core/cleanspec.mk

subdir_cleanspecs := \
    $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git . CleanSpec.mk)
include $(subdir_cleanspecs)
subdir_cleanspecs :=

如果我绕过了上述错误,则会再次在其他模块中发生同样的错误。

似乎有些我自己的配置可以用一些SPACE取代TAB,但我不知道这个错误的确切原因?

提前致谢。 :)

3 个答案:

答案 0 :(得分:4)

TL; DR请在新的shell窗口中执行make操作,而不是在配置模型后在同一个shell中。

[错误]配置模型后,在相同的shell窗口中执行make。

$. build/envsetup.sh 
including device/generic/x86/vendorsetup.sh
including device/generic/mips/vendorsetup.sh
including device/generic/armv7-a-neon/vendorsetup.sh
including device/asus/tilapia/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/asus/deb/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including device/lge/mako/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including sdk/bash_completion/adb.bash

$ lunch

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_x86-eng
     3. aosp_mips-eng
     4. vbox_x86-eng
     5. mini_x86-userdebug
     6. mini_mips-userdebug
     7. mini_armv7a_neon-userdebug
     8. aosp_tilapia-userdebug
     9. aosp_flo-userdebug
     10. aosp_grouper-userdebug
     11. aosp_deb-userdebug
     12. aosp_manta-userdebug
     13. aosp_mako-userdebug
     14. aosp_hammerhead-userdebug

Which would you like? [aosp_arm-eng] 14

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4
TARGET_PRODUCT=aosp_hammerhead
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=krait
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-14-generic-x86_64-with-Ubuntu-13.10-saucy
HOST_BUILD_TYPE=release
BUILD_ID=KRT16M
OUT_DIR=out
============================================

$ make -j4
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4
TARGET_PRODUCT=aosp_hammerhead
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a-neon
TARGET_CPU_VARIANT=krait
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-14-generic-x86_64-with-Ubuntu-13.10-saucy
HOST_BUILD_TYPE=release
BUILD_ID=KRT16M
OUT_DIR=out
============================================
dalvik/CleanSpec.mk:47: *** missing separator.  Stop.

[确定]在新的shell窗口中执行make。

$ . build/envsetup.sh 
$ lunch

// Launch new shell window
$ make -j4
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.4
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
TARGET_CPU_VARIANT=generic
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.11.0-14-generic-x86_64-with-Ubuntu-13.10-saucy
HOST_BUILD_TYPE=release
BUILD_ID=KRT16M
OUT_DIR=out
============================================
including ./abi/cpp/Android.mk ...
including ./art/Android.mk ...
including ./bionic/Android.mk ...
including ./bootable/diskinstaller/Android.mk ...
including ./bootable/recovery/Android.mk ...
including ./build/libs/host/Android.mk ...
including ./build/target/board/Android.mk ...
including ./build/tools/Android.mk ...
including ./cts/Android.mk ...
...

其实我并不确切知道,但这正是我所观察到的 make构建是否应该在新shell中执行?

答案 1 :(得分:0)

我遇到了同样的错误。在我的情况下,这是由于一个shell别名回应文字Android没有期待;特别是,我的" cd"命令被别名以回显新工作目录的完整路径(几年前更常见的行为)。我相信这也会发生在使用CDPATH环境变量的人身上,这会产生类似的输出。

Android构建系统中的build / envsetup.sh脚本最终调用以下函数:

# Get the value of a build variable as an absolute path.
function get_abs_build_var()
{
    T=$(gettop)
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP." >&2
        return
    fi
    (cd $T; CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core \
      make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-abs-$1)
}

" cd"呼叫将与来自" make ...的回声相结合... dumpvar-abs- $ 1"调用以生成从函数返回的换行符分隔的字符串,而不是单个路径。这会导致顶级make命令失败并显示错误。

虽然我认为可以更好地编写Android构建函数来返回内部" make"的结果,但我保留了代码并修改了我的" cd&# 34;别名仅在输出路径为stdout时回显结果:

cd () 
{ 
    builtin cd "$@"
    status=$?
    # only echo if stdout goes to a terminal
    [[ -t 1 ]] && echo $PWD
    return $status
}

我希望这有助于某人克服这个常见错误。

答案 2 :(得分:0)

我在mac 10.11上构建了android 6.0.1,并遇到了这个错误。我不知道你的情况是否与我的相同,我在这里发布解决方案并帮助其他人。 在osx上,原因是bash会话。 get_abs_build_var()中的build/envsetup.sh会切换bash会话,结果中包含Saving session... ...saving history...truncating history files... ...completed.,因此$OUT最后不正确。 您可以在主目录中创建.bash_sessions_disable文件以禁用此功能。