我刚从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
为什么会改变?
答案 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