2012-03-07 125 views
9

我想立即在Makefile中扩展shell命令,但我希望shell命令能够访问Makefile中的环境变量。如果我使用$(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脚本来编辑变量),但原理是一样的。

任何帮助表示赞赏。

回答

1

正如我在一些评论中所提到的,我的实际目标是使脚本生成基于对象正在编译的设置文件名。然后,我需要另一个脚本来生成所有生成的文件名的特殊格式的列表(目标是一个没有JIT编译器的嵌入式系统)。在任何时候,有超过三十个设置可能会影响二进制,并且这可能会在未来用于多个模块,所以我想要一些可扩展的。

我的解决方案如下。相反,传递变量的,我修改了我的脚本输出生成文件可解析字符串基础上设置:

-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)的一个解决方法。它不是非常漂亮,但它的作品。

约翰

4

这是怎么回事?

VAR1 := $(shell echo $(SOME_VAR)) 
VAR2 := $(shell echo $(VAR1)) 
+0

嗯......是的,我的例子是有缺陷的。 ..在上面的例子中,VAR1在Makefile中展开,但我需要的是在shell脚本中扩展VAR1。也就是说,我正在调用一个需要访问ENV {'VAR1'}的perl脚本。如果从$(shell ...)调用,脚本将不知道VAR1是什么。我会用一个更好的例子编辑我的问题。谢谢。 – John 2012-03-07 19:00:11

+0

@John,我真的不明白你在这里要做什么。我可以做一些猜测,但我认为如果你编辑你的问题会更快。 – Beta 2012-03-07 19:20:38

+0

我真正想做的事情:我有一个makefile,它应该建立一个目标文件,并根据它所建立的配置设置来命名它。我有一个perl脚本将配置设置转换为名称。为了这个工作,Perl脚本必须有权访问配置设置(必须使用反引号)。这本身就很好,但是这个名字必须在另一个perl脚本中使用。由于名称在第二个脚本运行时未扩展,因此会导致错误。我正在寻找解决方法。 – John 2012-03-07 19:30:50

5

这是你想要的吗?

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

+0

不完全,没有。我想要的是构建某些二进制文件,并根据当前配置命名它们。虽然我可以明确地导出每个我想要的设置,但此解决方案不具有可伸缩性。所以,我需要做的是运行一个可以访问所有makefile设置的脚本。它然后可以输出一个文件名。后来最终需要将文件名传递到另一个脚本中,因此文件名必须尽快解决,而不是晚些时候解决。 – John 2012-03-19 14:17:00

+1

这可能没有帮助OP,但它正是我需要寻找这个问题。干杯! – 2014-01-17 04:21:46