通用转义美元符号

Universally escape dollar sign

我正在从事嵌入式项目,该项目由我自己的代码以及第三方库和可执行文件组成。为了一致地构建所有部分,我编写了一个脚本,该脚本设置交叉编译的环境变量(CC、CXX、CFLAGS 等)。其中,它设置 LDFLAGS 以将 rpath 标志传递给链接器。 rpath 值包含 $ORIGIN 标记, 不能扩展 并且必须被链接器看到并按原样写入输出二进制文件。然后我使用脚本设置的环境构建几个需要的第 3 方项目。这些项目使用不同的构建系统(make、CMake 等)。正因为如此,也许是因为以不同方式编写的构建脚本,美元符号的扩展方式也不同。也就是说,无论我尝试什么转义,我都会在不同的项目中得到不同的结果(例如,$$ORIGIN、RIGIN、空字符串),但我从来没有设法在所有二进制文件中获得相同的 $ORIGIN 值。是否有一种通用的方法来转义美元符号,以便它至少在 make 和 shell 中工作相同,但在任何组合中?

这就是我最终解决这个问题的方法。 除了之前为我的平台构建所需的环境变量外,我还添加了两个:

ORIGIN=$ORIGIN
O=$$O

前者是为了解决 shell 扩展问题,后者是为了解决 makefile 扩展问题。通过此修复,变量将自行解析。 是的,这看起来不像是一个理想的解决方案,看起来更像是一个黑客,但到目前为止它的工作原理让我避免为我使用的每个第三方项目调整我的构建环境。

我遇到了同样的扩展问题,这里是 bash 脚本的改编版本。

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

LDFLAGS="-lfoo $LDFLAGS"
LDFLAGS="-L. $LDFLAGS"

echo $LDFLAGS
# -L. -lfoo -Wl,-rpath=$ORIGIN  # <== correct ORIGIN

ORIGIN='$ORIGIN'
eval echo $LDFLAGS
# -L. -lfoo -Wl,-rpath=$ORIGIN  # <== correct ORIGIN