我想在Makefile中立即扩展shell命令,但是我希望shell命令能够访问Makefile中的环境变量。如果我使用$(shell ...),它会立即扩展,但是无法访问变量。如果我使用反引号,扩展不是立即的,它会在以后的Makefile中导致我的问题。我想知道是否有任何方法可以立即扩展反引号,或者将当前环境传递给$(shell)命令。
例如,以下makefile:
SOME_VAR := some_val
export SOME_VAR
VAR1 := `echo $$SOME_VAR`
export VAR1
VAR2 := `echo $$VAR1`
all:
@echo VAR1=$(VAR1)
@echo VAR2=$(VAR2)
将输出:
~/tmp/t2> make
VAR1=some_val
VAR2=`echo $SOME_VAR`
我希望它打印“VAR2 = some_val”。真实的例子有点复杂(环境变量是从父makefile继承的,我正在尝试使用perl脚本来编辑变量),但原理是一样的。
感谢任何帮助。
答案 0 :(得分:6)
这是你想要的吗?
VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)
答案 1 :(得分:4)
这有什么问题?
VAR1 := $(shell echo $(SOME_VAR))
VAR2 := $(shell echo $(VAR1))
答案 2 :(得分:1)
正如我在一些评论中提到的,我的实际目标是使脚本根据编译对象的设置生成文件名。然后我需要另一个脚本来生成一个特殊格式的生成的所有文件名列表(目标是一个没有JIT编译器的嵌入式系统)。在任何给定的时间,有超过30个设置可能会影响二进制文件,这可能在将来用于多个模块,所以我想要一些可扩展的。
我的解决方案如下。我没有传入变量,而是修改了我的脚本,根据设置输出了一个makefile-parsable字符串:
-include $(SOME_MK_FILE)
$(SOME_MK_FILE) : .phony
script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE)
someFilename := $(shell script2.pl $(VAR1))
script.pl输出一个类似于:
的字符串VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33)
和script2输出一个类似'someFilename.X1_y.X2_n.elf'的文件名
然后,在另一条规则中,我有:
someobj: somedep
script3.pl $(someFilename) >> builtfiles.txt
正确构建builtfiles.txt(这又是另一个脚本的输入......)。最后,这是一个解决方法,即make无法将其环境传递给$(shell)。它不是太漂亮但它有效。
约翰
答案 3 :(得分:1)
你走了:
导出FOO = bar
这是一个包含更多信息的页面: http://www.cmcrossroads.com/article/basics-getting-environment-variables-gnu-make?page=0%2C1
答案 4 :(得分:1)
您可以尝试使用Special Built-in Target Name:.EXPORT_ALL_VARIABLES
.EXPORT_ALL_VARIABLES:
MY_VAR = foo
test:
@echo $$MY_VAR