搜索子目录并更新makefile

时间:2017-03-15 14:34:34

标签: linux makefile

我刚从Windows环境迁移到Linux,并被要求更新项目 - 仍在学习,但提示会有所帮助! 我有一个目录结构:

RootMakefile.mk
.
.--\GUI1 (Folder)
.......|--config(Folder)
.......|--dataprep(Folder)
...............|---makeVar1.mk
.--\GUI2 (Folder)
.......|--config(Folder)
.......|--dataprep(Folder)
...............|....makeVar2.mk.

makeVar1.mk,makeVar2.mk与改变路径值的变量都相似:

GUI1_ALL:=GUI1/GUI1_generated.txt

GUI2_ALL:=GUI2/GUI2_generated.txt

我试图在根目录下只创建一个makefile,这样新的GUI文件夹就不需要添加新的makefile了。

我尝试了什么: 我将root 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

为什么会改变?

1 个答案:

答案 0 :(得分:0)

好吧,在你定义它之前尝试使用变量UPDATE_PATH(在foreach循环中)(稍后使用define);当你在foreach中使用它时,它的值为空,因此这是一个无操作。将foreach移到define之后,而不是之前。

其次,在评估之前,您需要转义要延迟的变量的值。在UPDATE_PATH函数传递给call之前,eval的值将展开一次。在eval(例如warning$(GUIX_ALL)引用)需要转义之前,您不想要扩展的内容会被扩展。

此外,我假设您在$(GUIS)的第二个参数中表示$(GUIDEWAYS)而非foreach

我不知道引用foreach的{​​{1}}循环,因为这里没有定义。

在创建示例时,如果您实际运行它们并确保它们在发布之前确保它们达到您的预期(即使它不是您想要的),那么它最好。否则,我们很难理解你所面临的真正问题是什么,而不仅仅是你的问题在问题中的不准确翻译。

所以,比如:

UPDATE_GUI_PATH

但是,我不知道这个目的是什么,因为你只是一遍又一遍地重置同一个变量;最后,变量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