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

Escaping a system variable to pass as an argument to make

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

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

我的问题是这种转义是如何工作的?

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

单引号是为了防止make解释变量吗? 为什么 \$ 在这里出现两次?

是啊。真是一团糟。

因此,在启动 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,这就是你想要的。