Упрощение файла Android.mk, который создает несколько исполняемых файлов - PullRequest
5 голосов
/ 04 октября 2011

Я строю некоторые аппаратные тесты для Android. У меня есть файл Android.mk, который создает эти исполняемые файлы один за другим, используя для каждого из них блок кода makefile, как показано ниже:

##### shared #####
LOCAL_PATH := $(my-dir)

##### test_number_one #####
test_name := test_number_one
include $(CLEAR_VARS)
LOCAL_CFLAGS := $(commonCflags)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../
LOCAL_MODULE_TAGS := optional eng
LOCAL_SHARED_LIBRARIES := some_library some_other_library
LOCAL_MODULE := $(test_name)
LOCAL_SRC_FILES := tests/$(test_name)/$(test_name).c
include $(BUILD_EXECUTABLE)


##### test_number_two #####
test_name := test_number_two
include $(CLEAR_VARS)
LOCAL_CFLAGS := $(commonCflags)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../
LOCAL_MODULE_TAGS := optional eng
LOCAL_SHARED_LIBRARIES := some_library some_other_library
LOCAL_MODULE := $(test_name)
LOCAL_SRC_FILES := tests/$(test_name)/$(test_name).c
include $(BUILD_EXECUTABLE)

Как видите, большая часть кода повторяется для каждого теста (от include $(CLEAR_VARS) до include $(CLEAR_VARS)). Я хотел бы упростить это, чтобы у меня был список имен тестов и раздел кода make-файла, который «вызывается» для каждого. Мне все равно, если этот код должен быть разделен на другой файл. Вот некоторый псевдокод в стиле Python, чтобы продемонстрировать, для чего я иду:

##### shared #####
LOCAL_PATH := $(my-dir)

##### test_number_one #####
test_names := test_number_one test_numer_two

for each item in test_names:
    include $(CLEAR_VARS)
    LOCAL_CFLAGS := $(commonCflags)
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../
    LOCAL_MODULE_TAGS := optional eng
    LOCAL_SHARED_LIBRARIES := some_library some_other_library
    LOCAL_MODULE := $(item)
    LOCAL_SRC_FILES := tests/$(item)/$(item).c
    include $(BUILD_EXECUTABLE)

Возможно ли это в файлах Android.mk? Как это можно сделать?

1 Ответ

8 голосов
/ 04 октября 2011

Вы должны быть в состоянии сделать что-то вроде

define my_add_executable
    include $(CLEAR_VARS)
    LOCAL_CFLAGS := $(commonCflags)
    LOCAL_C_INCLUDES := $(LOCAL_PATH)/../
    LOCAL_MODULE_TAGS := optional eng
    LOCAL_SHARED_LIBRARIES := some_library some_other_library
    LOCAL_MODULE := $1
    LOCAL_SRC_FILES := tests/$1/$1.c
    include $(BUILD_EXECUTABLE)
endef

test_names := test_number_one test_numer_two
$(foreach item,$(test_names),$(eval $(call my_add_executable,$(item))))

В нашем проекте похожая конструкция, включающая несколько готовых библиотек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...