2012-03-26 3 views
6

Ho un semplice file Android.mk:Shell chiamata script da Android.mk, standard output e il separatore mancante errore

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) 

La cosa interessante che si fa è quello di chiamare il 'echo_test.sh' script bash . Nel caso in cui il contenuto dello script sono

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

o

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

tutto è OK.

Le cose vanno male quando lo script bash è

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

o

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

Quindi l'errore restituito è

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

Questo avviene sia con Android NDK 7 e quando si include questo modulo durante la build di Android Ice Cream Sandwich 4.0.3.

Non riesco davvero a capire qual è il problema con lo standard output e il sistema di build Android. Qualcuno ha una spiegazione?

risposta

10

Il sistema di build NDK di Android è in realtà GNU Make. Tutto il codice nel file Android.mk deve essere valido make.

Quando si esegue $ (shell) e non si memorizza il valore in una variabile, è come se si fosse copiato lo standard output dello script nel proprio file Android.mk. è come se il tuo file contenesse quanto segue:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

echo is working 

LOCAL_MODULE := libecho_test 
LOCAL_MODULE_TAGS := optional 
include $(BUILD_SHARED_LIBRARY) 

.. che non è valido effettua sintassi. Il reindirizzamento a> & 2 nello script funziona perché l'output va all'output dell'errore e viene quindi visualizzato sulla console.

Come menziona Vishrut, utilizzare $ (info) o $ (avvertenza) per stampare i messaggi. Oppure, se si vuole veramente per eseguire uno script durante la costruzione, conservare la sua uscita in una variabile:

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

Qui non vedrete l'uscita eco dello script, si va nella variabile.

8

Prova $(info $(shell ($(LOCAL_PATH)/echo_test.sh))), funziona.

0

Dal risposta di richq non funziona per me io uso questo:

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

all: 
    echo hello 
+0

E 'davvero pericoloso aggiungere la corsa di script per tutti: – mafonya