搜索在生成文件子目录和更新路径变量(search subdirectories and update

2019-09-26 11:11发布

我刚刚从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

我试图让只有一个生成文件在根目录,以便新的GUI文件夹,不需要增加新的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

为什么转移?

Answer 1:

嗯,你尝试使用变量UPDATE_PATH (在foreach循环),你定义它(后来与之前define ); 当你在使用它foreach ,它的值是空的,所以这是一个无操作。 移动foreach所以它的后define ,以前不是。

其次,你需要逃避要推迟到评估变量的值。 的值UPDATE_PATH将再次被扩大call函数之前它递给, eval 。 你不想展开,直到事情eval (如warning$(GUIX_ALL)参考)需要进行转义。

此外,我认为你的意思是$(GUIS)$(GUIDEWAYS)中的第二个参数foreach

我不知道有关foreach循环引用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只会有最后一个的值。 也许你想使用+=这里不是:=

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

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


文章来源: search subdirectories and update path variables in makefile