在makefile中search子目录和更新pathvariables

我刚刚从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_PATHforeach循环,因为这里没有定义。

在创建示例时,最好是实际运行它们,并确保它们在发布之前按照您的预期(即使它不是您想要的)进行操作。 否则,我们很难理解你面临的真正问题,而把你的问题翻译成一个不准确的问题。

所以,像这样的:

 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将只是最后一个的值。 也许你想用+=这里不是:=

但是,如果你想要的只是一个路径列表,那你为什么要使用calleval所有复杂性? 为什么不设置:

 GUIX_ALL := $(patsubst %,$(ROOT)/common/%/$(DATAPREP),$(GUIS))