转义系统变量以作为参数传递

时间:2016-11-17 18:39:20

标签: linux makefile bakefile

我有一个由bakefile生成的makefile,工作正常。要运行可执行文件,它需要来自不同文件夹的库。我发现命令rpath用于指定这些库的路径。但是在使用命令时我必须将它作为参数发送到makefile。 我无法直接从bakefile中指定它。

我可以使用LDFLAGS参数,这很好。我发现here如何使用$ ORIGIN变量。

我的问题是这种逃避是如何运作的?

make LDFLAGS="-Wl,-rpath '-Wl,\$\$ORIGIN'"

单引号是否阻止make解释变量? 为什么\ $在这里两次?

1 个答案:

答案 0 :(得分:1)

Yeesh。真是一团糟。

因此,在启动make命令之前,shell会删除第一组引号。由于外部引号集是双引号,因此您必须转义$,否则shell会将其视为shell变量(与echo "my path is $PWD"之类的命令进行比较以及PWD如何变量被扩展)。 shell使用反斜杠引用$等内容。

因此,当shell发出命令行时,它会看到设置LDFLAGS=-Wl,-rpath '-Wl,$$ORIGIN'

你的makefile中的下一个将是一个包含如下命令的配方:

$(LD) $(LDFLAGS) ...

Make会像上面那样扩展LDFLAGS变量。对于make,任何以$开头的名称都被视为make变量,您可以通过将$加倍(不使用shell之类的反斜杠)并编写$$来使其从扩展中逃脱。 。 Make会在展开期间删除一个$

因此,make会将LDFLAGS缩减为字符串-Wl,-rpath '-Wl,$ORIGIN'并将其传递给shell。

shell将剥离下一级引用,在本例中为单引号。变量不会在单引号内扩展,因此链接器实际上会获得参数,字面意思是-Wl,-rpath-Wl,$ORIGIN,这就是你想要的。