Вызов сценария оболочки из Android.mk, стандартный вывод и ошибка отсутствующего разделителя - PullRequest
7 голосов
/ 26 марта 2012

У меня есть простой файл 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)

Интересно, что он вызывает bash-скрипт echo_test.sh. В случае когда содержимое скрипта составляет

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

или

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

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

Когда сценарий bash имеет значение

, все идет не так, как надо
#!/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 ]

10 голосов
/ 31 марта 2012

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

Когда вы запускаете $ (shell) и не сохраняете значение в переменной, то это как если бы вы скопировалистандартный вывод скрипта в ваш файл 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)

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

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

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

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

9 голосов
/ 30 марта 2012

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

0 голосов
/ 30 декабря 2014

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

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

all:
    echo hello
...