2012-03-26 56 views
6

我有一個簡單Android.mk文件:shell腳本調用和失蹤分離錯誤

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腳本。在當腳本的內容的情況下

#!/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冰淇淋三明治4.0.3的構建過程中。

我真的不明白標準輸出和Android構建系統有什麼關係。有沒有人有解釋?

回答

10

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) 

..這是無效的語法。重定向到> & 2在您的腳本中工作,因爲輸出轉到錯誤輸出,然後顯示在控制檯上。

正如Vishrut提到的,使用$(info)或$(warning)打印消息。或者,如果你真的想在生成過程中運行的腳本,它的輸出存儲在一個變量:

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

在這裏你不會看到腳本的回聲輸出,它進入的變量。

8

嘗試$(info $(shell ($(LOCAL_PATH)/echo_test.sh))),它的工作原理。

0

由於richq的回答:不爲我工作,我用這個:

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

all: 
    echo hello 
+0

這是非常危險的增加你的腳本運行的所有: – mafonya 2017-09-06 06:17:11