【发布时间】:2019-03-29 16:20:09
【问题描述】:
这是来自 Makefile 的一个 sn-p,它在我的环境中是递归的,而且这段代码似乎有一个问题,我不明白为什么 foreach 不评估。变量 TOOLVERSION 和 TOOLSDIR 是根据运行 Ruby 脚本分配的值。这些提供了 C_FLAGS 的包含路径。目标 test2 产生正确的结果,其中以空格分隔的 C_FLAGS 的每个元素都出现在新行上,这是所需的结果。但是 test1 不评估 TOOLVERSION 和 TOOLSDIR 所以会产生垃圾。如果我使用 $(shell getenvval.rb version) 分配 TOOLVERSION 和 TOOLSDIR foreach 工作,但运行脚本的值不正确。我认为这是因为在 Makefile 环境中定义的东西没有进入 shell,所以我使用了 export 但它没有任何区别。
所以问题归结为为什么以下 foreach 循环不起作用:
@$(foreach flag, $(C_FLAGS), `echo $(flag) >> $(FILE_C1_LIST)`)
虽然这有效:
@echo $(C_FLAGS) >> $(FILE_C2_LIST)
感谢任何有助于理解评估的帮助。
来自 Makefile 的片段:
export
TOOLVERSION:= `getenvval.rb version`
TOOLSDIR:= `getenvval.rb directory`
FILE_C1_LIST := test_c1.f
FILE_C2_LIST := test_c2.f
C_FILES =\
./a.c \
./b.c
C_FLAGS := \
-I$(TOOLSDIR)/$(TOOLVERSION)/tools/include \
-I./aa/include \
-I./bb/editline \
-g -DDEBUG -DPLISIM -DINCLUDE_EDITLINE -DSYS_UNIX
$(FILE_C1_LIST): $(C_FILES)
rm -f $(FILE_C1_LIST)
touch $(FILE_C1_LIST)
@(echo $(C_FLAGS) )
@$(foreach flag, $(C_FLAGS), `echo $(flag) >> $(FILE_C1_LIST)`)
@$(foreach file, $(C_FILES), `echo $(file) >> $(FILE_C1_LIST)` )
$(FILE_C2_LIST): $(C_FILES)
@rm -f $(FILE_C2_LIST)
@touch $(FILE_C2_LIST)
@echo $(C_FLAGS) >> $(FILE_C2_LIST)
@$(foreach file, $(C_FILES), `echo $(file) >> $(FILE_C2_LIST)` )
test1: $(FILE_C1_LIST)
test2: $(FILE_C2_LIST)
【问题讨论】:
-
在您尝试调试的命令前面加上
@是非常错误的。完成后可能不要将其放回原处(如果您希望它安静地运行,请使用make -s)。 -
RE
@:也许可以考虑:make.mad-scientist.net/managing-recipe-echoing -
您似乎在想象
foreach函数会以某种方式执行您给它的命令。那不是它的作用。foreach是一个文本修改工具。在foreach完成后,它会评估该扩展的结果。它实际上不会尝试执行任何shell操作。
标签: shell foreach makefile gnu