Вызов сценария оболочки с 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-сценарий Баша. В случае, когда содержимое скрипта

#!/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 ответов


система сборки Android NDK на самом деле GNU Make. Весь код в Андроиде.файл 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))

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


попробовать $(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