
シェルがどのように機能するかを知っていると思う瞬間、何かが現れ、私をパニックにさせます。次のコマンドは、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"