2012-03-26 12 views
6

separador de perdida que tienen un simple archivo de Android.mk:Shell llamada script desde Android.mk, salida estándar y error

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) 

Lo interesante que lo que hace es llamar a la 'echo_test.sh' escritura del golpe . En el caso de que el contenido del guión son

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

o

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

todo está bien.

Las cosas van mal cuando la escritura del golpe es

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

o

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

A continuación, el error devuelto es

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

Esto sucede tanto con Android NDK 7 y cuando se incluye este módulo durante la compilación de Android Ice Cream Sandwich 4.0.3.

Realmente no puedo entender cuál es el problema con la salida estándar y el sistema de compilación de Android. ¿Alguien tiene una explicación?

Respuesta

10

El sistema de compilación Android NDK es en realidad GNU Make. Todo el código en el archivo Android.mk debe ser válido make.

Cuando ejecuta $ (shell) y no almacena el valor en una variable, entonces es como si hubiera copiado la salida estándar del script en su archivo Android.mk. es decir, es como si su archivo contuviera lo siguiente:

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

echo is working 

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

.. que no es válido hacer la sintaxis. Redirigir a> & 2 en su secuencia de comandos funciona porque la salida va a la salida de error y luego se muestra en la consola.

Como Vishrut menciona, use $ (info) o $ (advertencia) para imprimir mensajes. O si realmente desea ejecutar una secuencia de comandos durante la construcción, almacenar su producción en una variable:

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

Aquí no verá la salida de eco de la secuencia de comandos, entra en la variable.

8

Probar $(info $(shell ($(LOCAL_PATH)/echo_test.sh))), funciona.

0

Desde respuesta de richq no funciona para mí utilizo este:

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

all: 
    echo hello 
+0

Es muy peligroso para añadir su carrera de la escritura para todos: – mafonya

Cuestiones relacionadas