假设我有一个像这样的文件结构:
/top_lib
Android.mk
/sub_lib1
Android.mk
__init__.py
cheese_maker.py
/middle_lib/
Android.mk
/sub_lib2
Android.mk
__init__.py
bread_baker.py
/another_lib
Android.mk
/sub_lib3
Android.mk
__init__.py
leaf_raker.py
并在 top_lib/Android.mk 和 another_lib/Android/mk 和 middle_lib/Android.mk 中定义了一个 make 函数
define add-file
include $$(PROJECT_DEFAULTS)
LOCAL_MODULE := $(1)
LOCAL_MODULE_TAGS := job_stuff
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(DESTINATION_DIR)/job_stuff/$(strip $(2))
LOCAL_SRC_FILES := $(1)
include $$(PROJECT_PREBUILT)
endef
define add-files-to-job
$(foreach f,$(2),$(eval $(call add-file,$f,$(1))))
endef
include $(call all-subdir-makefiles)
在每个 sub_lib/Android.mk 我有以下内容:
LOCAL_PATH := $(call my-dir)
FileList := $(notdir $(wildcard $(LOCAL_PATH)/*.py))
DirName := $(notdir $(LOCAL_PATH:%/=%))
$(call add-files-to-job, $(DirName), $(FileList))
在另一个库中,如果我这样做,一切都很好。甚至在 middle_lib 或 top_lib 中。但是如果我在树的顶端,说运行 m job_stuff,最终我遇到了一个错误:
build/core/base_rules.mk:147 ** path/to/middle_lib: MODULE.TARGET.ETC.__init__.py already defined by path/to/top_lib Stop.
我想我明白发生了什么。它在 MODULE.TARGET.ETC 中暂存文件,并且具有相同名称的文件会引发错误。但我不知道如何解决它。我尝试更改LOCAL_MODULE := $(1)
为 LOCAL_MODULE := $(2).$(1)
,这使得文件夹名称出现在每个文件名之前(例如:sub_lib1.cheese_maker.py),我想这就是我告诉它的。
我知道如果我将其更改LOCAL_MODULE_CLASS := ETC
为其他任何内容,例如LOCAL_MODULE_CLASS := ETCA
在其中一个 Android.mk 文件中,它将适用于该文件。但我似乎找不到太多关于LOCAL_MODULE_CLASS
它以及如何使用它的文档,而且由于构建系统非常复杂,我不确定在所有地方创建新类的影响。
我还尝试更改从 add-file 添加的文件,使其更符合以下内容
LOCAL_PATH := $(call my-dir)
FileList := $(notdir $(wildcard $(LOCAL_PATH)/*.py))
DirName := $(notdir $(LOCAL_PATH:%/=%))
include $$(PROJECT_DEFAULTS)
LOCAL_MODULE := $(DirName)
LOCAL_MODULE_TAGS := job_stuff
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(DESTINATION_DIR)/job_stuff/$(DirName)
LOCAL_SRC_FILES := $(FileList)
include $$(PROJECT_PREBUILT)
那就是说当我运行 mm 时它做了一些事情,但是在树的顶部 m job_stuff 什么也没做(嗯,它构建了很多东西但是 $(DESTINATION_DIR) 是空的)
所以我被困住了。如何在不同的库中有多个init .py 文件?