Dalvik / CleanSpec.mk: 47: *** отсутствует разделитель. Стоп. Ошибка создания AOSP

Я знаю этот *** missing separator. Довольно распространенная ошибка makefile, которая в основном возникает, когда SPACE используется неправильно, а не TAB. Но этот случай возникает во время сборки AOSP, с которой другие ребята хорошо справляются.

Согласно некоторому руководству для Ubuntu13.10, я попробовал сборку AOSP.

  • Ubuntu 13.10 x64
  • 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 := 

Если я обойду вышеприведенную ошибку, эта же ошибка снова появится в другом модуле.

Кажется, что какая-то моя собственная конфигурация могла заменить TAB некоторыми пробелами, но я не мог точно знать причину этой ошибки?

Заранее спасибо. 🙂

TL; DR Пожалуйста, выполните операцию make в новом окне оболочки , а не в той же оболочке после настройки модели.

[ERROR] Выполнить 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. 

[OK] Выполнить 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 быть выполнена в новой оболочке?

Я столкнулся с этой же ошибкой. В моем случае это было связано с псевдонимом оболочки alcho, который Android не ожидал; В частности, моя команда «cd» была сглажена, чтобы повторить полный путь нового рабочего каталога (более распространенное поведение несколько лет назад). Я считаю, что это также произойдет с людьми, использующими переменную окружения CDPATH, которая производит подобный вывод.

Сценарий build / envsetup.sh в системе сборки Android в конечном итоге вызывает следующую функцию:

 # 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», чтобы только эхо-результат, когда выходным путем является stdout:

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

Надеюсь, это поможет кому-то пройти эту общую ошибку.

Я создаю android 6.0.1 на mac 10.11 и сталкиваюсь с этой ошибкой. Я не знаю, ваша ситуация такая же, как у меня, я размещаю решение здесь и хоп, чтобы помочь другим. В osx причина – сеанс bash. get_abs_build_var() в build/envsetup.sh будет переключать сеансы bash, а результат содержит Saving session... ...saving history...truncating history files... ...completed. , Поэтому $OUT не является правильным в конце. Вы можете создать файл .bash_sessions_disable в своем домашнем каталоге, чтобы отключить эту функцию.