設定のためにbash変数を介してCFLAGSを渡します。

設定のためにbash変数を介してCFLAGSを渡します。

シェルがどのように機能するかを知っていると思う瞬間、何かが現れ、私をパニックにさせます。次のコマンドは、GNU bash バージョン 3.2.25 で実行されます。

./configure共通の設定オプションのセットをすべて共有するいくつかのスクリプトがありますCFLAGS

これには2つの変数があります

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"

2番目のオプション:

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

これは非常に間違っています。まず、シェルが項目を再帰的に拡張しないためです(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"

(2つの変数の周りに二重引用符があることに注意してください。)しかし、これは別のウォーム缶を開きます。してはいけない完全な解析と拡張メカニズムとそのすべての欠点を非常に明確に理解していない限り、このようなトリックを使用してください。しかし、積極的ではありませんが、マスターしたようではありません。

解決策は、これらの$COMMON_CONFIGURE_OPTIONSナンセンスを忘れて、すべてのオプションを個別に渡すことです。

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

関連情報