Shell script вызов из Android.mk, стандартный вывод и отсутствие ошибки разделителя

У меня есть простой файл Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
$(shell ($(LOCAL_PATH)/echo_test.sh))
LOCAL_MODULE := libecho_test
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

Интересное, что он делает, это назвать "echo_test.sh" bash script. В случае, когда содержимое script равно

#!/bin/bash
echo 'echo is working' >&2

или

#!/bin/bash
echo 'echo is working' >/dev/null

все в порядке.

Дела идут неправильно, если bash script

#!/bin/bash
echo 'echo is working'

или

#!/bin/bash
echo 'echo is working' >&1

Тогда возвращаемая ошибка

Android.mk:4: *** missing separator. Stop.

Это происходит как с Android NDK 7, так и при включении этого модуля во время сборки Android Ice Cream Sandwich 4.0.3.

Я действительно не могу понять, что такое сделка со стандартным выходом и системой сборки Android. У кого-нибудь есть объяснение?

3 ответа

Система сборки Android NDK на самом деле GNU Make. Весь код в файле Android.mk должен быть действительным make.

Когда вы запускаете $(shell) и не сохраняете значение в переменной, это похоже на то, что вы скопировали стандартный вывод script в ваш файл Android.mk. то есть, как если бы ваш файл содержал следующее:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
echo is working
LOCAL_MODULE := libecho_test
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)

.., который недействителен, делает синтаксис. Перенаправление в > & 2 в вашем script работает, потому что вывод идет на вывод ошибки и затем отображается на консоли.

Как упоминает Vishrut, используйте $(info) или $(предупреждение) для печати сообщений. Или если вы действительно хотите запустить script во время сборки, сохраните его вывод в переменной:

ECHO_RESULT := $(shell ($(LOCAL_PATH)/echo_test.sh))

Здесь вы не увидите эхо-выход script, он переходит в переменную.


Попробуйте $(info $(shell ($(LOCAL_PATH)/echo_test.sh))), он работает.


Так как richq Ответ не работает для меня, я использую это:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libecho_test
LOCAL_MODULE_TAGS := optional
include $(BUILD_SHARED_LIBRARY)
all:
 echo hello

licensed under cc by-sa 3.0 with attribution.