ABS(Android Build System)中在編譯時間產生原始碼檔案
編譯時間經常有的需求是有些.c或者.h檔案需要在編譯時間由某個介面定義檔案產生。同時還可能有下面的需求:
* 同一個介面定義檔案會用於產生多個源檔案。
* 產生的源檔案可能會被其它的Project使用。
舉例來說,現在需要從介面定義檔案xxx.xml通過可執行檔generator產生源檔案xxx_A.h,xxx_B.h和xxx_C.c。命令為:
generator A < xxx.xml > xxx_A.h
generator B < xxx.xml > xxx_B.h
generator C < xxx.xml > xxx_C.c
一個方法是用ABS裡定義的transform-generated-source函數:
GENERATOR := $(HOST_OUT_EXECUTABLES)/generator$(HOST_EXECUTABLE_SUFFIX) IDL_DIR := ./ IDL_SRC := $(IDL_DIR)/xxx.xml IDL_TGT_CODE := $(IDL_DIR)/xxx_C.c IDL_TGT_A := $(IDL_DIR)/xxx_A.h IDL_TGT_B := $(IDL_DIR)/xxx_B.h GEN := $(LOCAL_PATH)/$(IDL_TGT_A) $(GEN): PRIVATE_PATH := $(LOCAL_PATH) $(GEN): PRIVATE_CUSTOM_TOOL = $(GENERATOR) A < $< > $@ $(GEN): $(LOCAL_PATH)/$(IDL_SRC) $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) GEN := $(LOCAL_PATH)/$(IDL_TGT_B) $(GEN): PRIVATE_PATH := $(LOCAL_PATH) $(GEN): PRIVATE_CUSTOM_TOOL = $(GENERATOR) B < $< > $@ $(GEN): $(LOCAL_PATH)/$(IDL_SRC) $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) GEN := $(LOCAL_PATH)/$(IDL_TGT_CODE) $(GEN): PRIVATE_PATH := $(LOCAL_PATH) $(GEN): PRIVATE_CUSTOM_TOOL = $(GENERATOR) C < $< > $@ $(GEN): $(LOCAL_PATH)/$(IDL_SRC) $(LOCAL_PATH)/$(IDL_TGT_A) $(LOCAL_PATH)/$(IDL_TGT_B) $(transform-generated-source) LOCAL_GENERATED_SOURCES += $(GEN) ...LOCAL_SRC_FILES := \ $(IDL_TGT_CODE) \ ...
如果介面定義檔案有多個,比如可能有a.xml, b.xml等等,那可能下面方法更方便一些。
GENERATOR := $(HOST_OUT_EXECUTABLES)/generator$(HOST_EXECUTABLE_SUFFIX) IDL_DIR := ./ IDL_TGT_CODE := $(IDL_DIR)/xxx_C.c define transform-generated-A @echo "target Generated $@ <= $<" $(GENERATOR) A < $< > $@ endef define transform-generated-B @echo "target Generated $@ <= $<" $(GENERATOR) B < $< > $@ endef define transform-generated-C @echo "target Generated $@ <= $<" $(GENERATOR) C < $< > $@ endef $(LOCAL_PATH)/$(IDL_DIR)/%_A.h : $(LOCAL_PATH)/$(IDL_DIR)/%.xml $(transform-generated-A) $(LOCAL_PATH)/$(IDL_DIR)/%_B.h : $(LOCAL_PATH)/$(IDL_DIR)/%.xml $(transform-generated-B) $(LOCAL_PATH)/$(IDL_DIR)/%-C.c : $(LOCAL_PATH)/$(IDL_DIR)/%.xml $(transform-generated-C) ...LOCAL_SRC_FILES := \ $(IDL_TGT_CODE) \ ...LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/xxx_A.h $(LOCAL_PATH)/xxx_B.h
另外如果想編譯出來的image中某幾個特定binary帶symbol,可以在Android.mk中加:
LOCAL_STRIP_MODULE := false