通过 bash 变量传递 CFLAGS 进行配置

通过 bash 变量传递 CFLAGS 进行配置

就在我以为我知道 shell 是如何正常工作的时候,有些东西出现了并难倒了我。以下命令在 GNU bash 版本 3.2.25 上执行。

我有几个./configure脚本,它们都共享一组常见的配置选项,其中一个是CFLAGS.

为此,我有两个变量

CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="CFLAGS=\"$CFLAGS\" --enable-static --disable-shared --prefix=$PREFIX"

当它被传递到“./configure”时,它的完成方式如下:

"$FOO/configure" $COMMON_CONFIGURE_OPTIONS

在我的一生中,我似乎无法让它正确扩展。我尝试过手动$CFLAGS将的值替换为$COMMON_CONFIGURE_OPTIONS。我已经尝试过所有单引号和双引号的组合。我什至尝试引用整个“CFLAGS=...”参数。

我上面给出的版本产生以下结果(set -x启用时)

../configure 'CFLAGS="-fPIC' '-O3"' --enable-static --disable-shared --prefix=../install
configure: error: unrecognized option: `-O3"'
Try `../configure --help' for more information

我所期望的,也是我所渴望的,是被configure像这样被调用

./configure CFLAGS="-fPIC -O3" --enable-static --disable-shared --prefix="$PREFIX"

我怎样才能实现我想要的,此外,是否有关于如何避免将来出现此问题的良好资源/提示?

答案1

我认为这应该有效:

CFLAGS="-fPIC -O3" ./configure --enable-static --disable-shared --prefix="$PREFIX"

第二个选项:

CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="--enable-static --disable-shared --prefix=$PREFIX"

CFLAGS="$CFLAGS" ./configure $COMMON_CONFIGURE_OPTIONS

答案2

CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="CFLAGS=\"$CFLAGS\" --enable-static --disable-shared --prefix=$PREFIX"
...
"$FOO/configure" $COMMON_CONFIGURE_OPTIONS

这是相当不对的,首先因为 shell 不会不断递归地扩展内容(就像make它的宏一样,除了make永远不会“取消引用”它们):

a=A; b="B=\"$a\""; printf '<%s>\n' "$b"
<B="A">

其次,因为不带引号的变量将被(默认为空格)中的字符分割IFS,它不关心引号:

a="x \"y z\""; printf '<%s>\n' $a
<x>
<"y>
<z">

你当然可以使用

eval "$FOO/configure" "COMMON_CONFIGURE_OPTIONS"

(注意两个变量周围的双引号),但这会打开另一罐蠕虫,你不应该除非您对整个解析和扩展机制及其所有怪癖有非常牢固的掌握,否则请使用此类技巧,但无意冒犯,您似乎并没有掌握这些技巧。

解决方案是忘记这些$COMMON_CONFIGURE_OPTIONS废话并分别传递所有这些选项:

./configure --enable-static --disable-shared --prefix="$PREFIX" CFLAGS="-fPIC -O3"

相关内容