Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将环境变量导出到Makefile shell_Shell_Makefile - Fatal编程技术网

将环境变量导出到Makefile shell

将环境变量导出到Makefile shell,shell,makefile,Shell,Makefile,我想在Makefile中立即展开shell命令,但我希望shell命令能够访问Makefile中的环境变量。如果我使用$(shell…),它会立即展开,但无法访问变量。如果我使用反引号,扩展不会立即进行,并且会在以后的Makefile中给我带来问题。我想知道是否有任何方法可以使反引号立即展开,或者将当前环境传递给$(shell)命令 例如,以下生成文件: SOME_VAR := some_val export SOME_VAR VAR1 := `echo $$SOME_VAR` export

我想在Makefile中立即展开shell命令,但我希望shell命令能够访问Makefile中的环境变量。如果我使用$(shell…),它会立即展开,但无法访问变量。如果我使用反引号,扩展不会立即进行,并且会在以后的Makefile中给我带来问题。我想知道是否有任何方法可以使反引号立即展开,或者将当前环境传递给$(shell)命令

例如,以下生成文件:

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”。真实的例子有点复杂(环境变量是从父makefiles继承的,我试图使用perl脚本编辑变量),但原理是一样的


非常感谢您的帮助。

这有什么问题吗

VAR1 := $(shell echo $(SOME_VAR))
VAR2 := $(shell echo $(VAR1))
这是你想要的吗


VAR2:=$(shell VAR1=“$(VAR1)”使用的脚本\u VAR1)

正如我在一些评论中提到的,我的实际目标是让脚本根据编译对象时使用的设置生成文件名。然后,我需要另一个脚本来生成所有生成文件名的特殊格式列表(目标是一个没有JIT编译器的嵌入式系统)。在任何给定的时间,都有超过30个设置可能会影响二进制文件,并且将来可能会在多个模块上使用,因此我希望有一些可扩展的设置

我的解决办法如下。我没有传入变量,而是修改了脚本,根据设置输出makefile可解析字符串:

-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)这一事实的方法。它不太漂亮,但很管用

约翰

给你:

导出FOO=bar

这是一个包含更多信息的页面:

您可以尝试使用:
。导出所有变量

.EXPORT_ALL_VARIABLES:

MY_VAR = foo

test:
  @echo $$MY_VAR

六羟甲基三聚氰胺六甲醚。。。是的,我的例子有缺陷。。。在上面的示例中,VAR1在Makefile中展开,但我需要的是VAR1在shell脚本中展开。也就是说,我正在调用一个需要访问ENV{'VAR1'}的perl脚本。如果从$(shell…)调用,脚本将不知道VAR1是什么。我将用一个更好的例子来编辑我的问题。谢谢。@John,我真的不明白你在这里想干什么。我可以做一些猜测,但我认为如果你编辑你的问题会更快。我真正想做的是:我有一个makefile,它应该构建一个对象文件,并根据构建时使用的配置设置命名它。我有一个将配置设置转换为名称的perl脚本。为了使其工作,perl脚本必须能够访问配置设置(必须使用反引号)。这本身就可以了,但是这个名称必须在另一个perl脚本中使用。由于在运行第二个脚本时名称未展开,因此会导致错误。我正在寻找一种解决方法。@John,为什么不让一个脚本调用另一个呢?不幸的是,这会使我的Makefile变得比我现有的解决方案更复杂。我有一个变通方法,尽管它并不漂亮——原始脚本是用$(shell)调用的,因此它没有访问环境变量的权限。相反,它使用$(CONFIG_XXX)引用将赋值指令输出到新文件中。然后,原始makefile对新文件执行-include操作。这是黑客的,但我已经测试过了,它是有效的。以一种更干净的方式来做这件事会很好,但我认为没有。不完全是,没有。我想要的是构建某些二进制文件,并根据当前的配置来命名它们。虽然我可以显式导出我想要的每个设置,但此解决方案的可扩展性不强。所以,我需要做的是运行一个可以访问所有makefile设置的脚本。然后它将能够输出一个文件名。最终需要传递到另一个脚本中的文件名,因此文件名必须尽早解析。这可能对OP没有帮助,但这正是我搜索此问题所需要的。干杯不适合我。在shell中,这个var不存在