我想在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)
Run Code Online (Sandbox Code Playgroud)
将输出:
~/tmp/t2> make
VAR1=some_val
VAR2=`echo $SOME_VAR`
Run Code Online (Sandbox Code Playgroud)
我想要它打印"VAR2 = some_val".真实的例子有点复杂(环境变量是从父makefile继承的,我正在尝试使用perl脚本编辑变量),但原理是一样的.
任何帮助表示赞赏.
这是你想要的吗?
VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)
正如我在一些评论中提到的,我的实际目标是使脚本根据编译对象的设置生成文件名。然后,我需要另一个脚本来生成所有生成的文件名的特殊格式列表(目标是嵌入式系统,其上没有 JIT 编译器)。在任何给定时间,都有超过三十种设置可能会影响二进制文件,并且将来可能会在多个模块上使用,因此我想要一些可扩展的设置。
我的解决方案如下。我没有传递变量,而是修改了脚本以根据设置输出 makefile 可解析的字符串:
-include $(SOME_MK_FILE)
$(SOME_MK_FILE) : .phony
script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE)
someFilename := $(shell script2.pl $(VAR1))
Run Code Online (Sandbox Code Playgroud)
script.pl 输出一个类似于以下内容的字符串:
VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33)
Run Code Online (Sandbox Code Playgroud)
script2 输出一个类似于“someFilename.X1_y.X2_n.elf”的文件名
然后,后来,在另一条规则中,我有:
someobj: somedep
script3.pl $(someFilename) >> builtfiles.txt
Run Code Online (Sandbox Code Playgroud)
它正确构建了builtfiles.txt(这又是另一个脚本的输入......)。最后,这是针对 make 无法将其环境传递给 $(shell) 这一事实的解决方法。它不是太漂亮,但很有效。
约翰
| 归档时间: |
|
| 查看次数: |
41941 次 |
| 最近记录: |