将环境变量导出到Makefile shell

Joh*_*ohn 10 shell makefile

我想在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脚本编辑变量),但原理是一样的.

任何帮助表示赞赏.

Ide*_*lic 6

这是你想要的吗?

VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)

  • 这可能对OP没有帮助,但正是我需要搜索此问题。干杯! (2认同)

Joh*_*ohn 1

正如我在一些评论中提到的,我的实际目标是使脚本根据编译对象的设置生成文件名。然后,我需要另一个脚本来生成所有生成的文件名的特殊格式列表(目标是嵌入式系统,其上没有 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) 这一事实的解决方法。它不是太漂亮,但很有效。

约翰