2012-03-26 11 views
6

Tôi có một tập tin Android.mk đơn giản:Shell script cuộc gọi từ Android.mk, đầu ra tiêu chuẩn và thiếu tách lỗi

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) 

Điều thú vị mà nó làm là gọi điện cho 'echo_test.sh' kịch bản bash . Trong trường hợp khi các nội dung của kịch bản là

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

hoặc

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

mọi thứ đều OK.

Mọi thứ đi sai khi kịch bản bash là

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

hoặc

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

Sau đó, các lỗi trở lại là

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

Điều này xảy ra cả với Android NDK 7 và khi bạn bao gồm mô-đun này trong quá trình xây dựng Android Ice Cream Sandwich 4.0.3.

Tôi thực sự không thể hiểu thỏa thuận với đầu ra tiêu chuẩn và hệ thống xây dựng Android là gì. Có ai có một lời giải thích?

Trả lời

10

Hệ thống xây dựng NDK của Android thực sự là GNU Make. Tất cả mã trong tệp Android.mk phải hợp lệ make.

Khi bạn chạy $ (shell) và không lưu trữ giá trị trong một biến, khi đó bạn đã sao chép đầu ra chuẩn của tập lệnh vào tệp Android.mk của mình. tức là dường như tệp của bạn chứa các thông tin sau:

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

echo is working 

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

.. cú pháp không hợp lệ. Chuyển hướng đến> & 2 trong tập lệnh của bạn hoạt động vì đầu ra đi đến đầu ra lỗi và sau đó được hiển thị trên bảng điều khiển.

Như Vishrut đề cập, hãy sử dụng $ (thông tin) hoặc $ (cảnh báo) để in thư. Hoặc nếu bạn thực sự muốn chạy tập lệnh trong khi tạo, lưu trữ kết quả của nó trong một biến:

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

Ở đây bạn sẽ không thấy đầu ra của tập lệnh, biến này đi vào biến.

8

Hãy thử $(info $(shell ($(LOCAL_PATH)/echo_test.sh))), nó hoạt động.

0

Kể từ khi trả lời richq của không làm việc cho tôi, tôi sử dụng này:

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

all: 
    echo hello 
+0

Nó thực sự nguy hiểm để thêm kịch bản chạy cho tất cả: – mafonya