我知道这个*** missing separator.
是非常常见的makefile错误,主要发生在SPACE被滥用而不是TAB时。
但这种情况发生在AOSP构建期间,其他人很好地构建。
根据Ubuntu13.10的一些指南,我尝试了AOSP构建。
android-4.4_r1
repo init -u https://android.googlesource.com/platform/manifest -b android-4.4_r1
回购同步
source build / envsetup.sh
午餐=>模型
make -j4
一开始,我收到以下错误
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,但我不知道这个错误的确切原因?
提前致谢。 :)
答案 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文件以禁用此功能。