转义系统变量以作为参数传递给 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
,这就是你想要的。
我有一个由 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
,这就是你想要的。