我刚刚从Windows环境迁移到Linux,并被要求更新一个项目 – 仍在学习,但技巧将有所帮助! 我有一个目录结构:
RootMakefile.mk . .--\GUI1 (Folder) .......|--config(Folder) .......|--dataprep(Folder) ...............|---makeVar1.mk .--\GUI2 (Folder) .......|--config(Folder) .......|--dataprep(Folder) ...............|....makeVar2.mk.
而且makeVar1.mk,makeVar2.mk和只改变path值的variables都是相似的:
GUI1_ALL:=GUI1/GUI1_generated.txt GUI2_ALL:=GUI2/GUI2_generated.txt
我正在尝试在根目录下创build一个makefile,以便新的GUI文件夹不需要添加新的makefile。
我所尝试的:我改变了根makefile如下:
TARGET_FILE := GuiDetails.rb ACTIVE_GUIS := $(wildcard GUI*/$(TARGET_FILE))) GUIS_OF_INTEREST := $(dir $(ACTIVE_GUIS))) DATAPREP := dataprep GUIS:= $(patsubst %/,%,$(GUIS_OF_INTEREST)) $(warning The following SMA paths have guis $(GUIS)) $(foreach GUIS, $(GUIS), $(eval $(call UPDATE_GUI_PATH, $(GUIS), $(DATAPREP)))) $(foreach GUIDEWAYS, $(GUIDEWAYS), $(eval $(call UPDATE_PATH, $(GUIDEWAYS), $(DATAPREP))))) define UPDATE_PATH GUIX_ALL:= $(ROOT)/COMMON/$(1)/$(2) $(warning GUI1_ALL is set to $(GUIX_ALL)) endef
但是价值并没有像预期的那样出现,产出是:
GUIX_ALL is set to GUIX_ALL is set to ./COMMON/GUI1/DATAPREP
为什么转移?
那么,在你定义它之前,你试着使用变量UPDATE_PATH
(在foreach
循环中)。 当你在foreach
使用它时,它的值是空的,所以这是一个空操作。 移动foreach
以便在define
,而不是在之前。
其次,你需要逃避你想推迟的变量的值,直到评估。 在传递给eval
之前, UPDATE_PATH
的值将被call
函数扩展一次。 你不想扩展的东西,直到eval
(如warning
和$(GUIX_ALL)
引用)需要转义。
另外我假设你的意思是$(GUIS)
而不是$(GUIDEWAYS)
在foreach
的第二个参数。
我不知道引用UPDATE_GUI_PATH
的foreach
循环,因为这里没有定义。
在创建示例时,最好是实际运行它们,并确保它们在发布之前按照您的预期(即使它不是您想要的)进行操作。 否则,我们很难理解你面临的真正问题,而把你的问题翻译成一个不准确的问题。
所以,像这样的:
define UPDATE_PATH GUIX_ALL := $(ROOT)/COMMON/$(1)/$(2) $$(warning GUIX_ALL is set to $$(GUIX_ALL)) endef $(foreach GUIDEWAYS,$(GUIS),$(eval $(call UPDATE_PATH,$(GUIDEWAYS),$(DATAPREP)))))
但是,我不知道这个服务的目的是什么,因为你只是一遍又一遍地重置同一个变量。 最后,变量GUIX_ALL
将只是最后一个的值。 也许你想用+=
这里不是:=
?
但是,如果你想要的只是一个路径列表,那你为什么要使用call
和eval
所有复杂性? 为什么不设置:
GUIX_ALL := $(patsubst %,$(ROOT)/common/%/$(DATAPREP),$(GUIS))