2012-03-26 16 views
6

は、私はシンプルなAndroid.mkファイルを持っている:それがないという興味深いのは、「echo_test.sh」bashスクリプトを呼び出すことです シェルスクリプト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) 

。スクリプトの内容がある場合には

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

または

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

すべてがOKです。あなたが含まれている場合

物事はbashスクリプトが

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

または

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

あるときに返されるエラーは、これは、Android NDK 7の両方で起こる

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

で間違って行くと、 Android Ice Cream Sandwich 4.0.3のビルド中のこのモジュール

私は実際には、標準出力とAndroidビルドシステムとの契約を理解できません。誰か説明がありますか?

答えて

10

Android NDKビルドシステムは、実際にはGNU Makeです。 Android.mkファイルのコードはすべて有効でmakeである必要があります。

$(シェル)を実行して変数に値を格納しないと、スクリプトの標準出力を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

関連する問題