引用符を含む問題のあるビルドスクリプト

引用符を含む問題のあるビルドスクリプト

こんにちは、私は次のコマンドを実行するビルドスクリプトを作成しようとしています。

cd libiconv
../../src/libiconv/configure --prefix=/home/ruben/mingw64/build/gcc-libs \
                             --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 \
                             CFLAGS="-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer" LFLAGS="-flto -fwhopr=2"
make -j3 -s
make -s install
cd ..

次のようになります。

#!/bin/sh
HOST=x86_64-w64-mingw32
TARGET=x86_64-w64-mingw32
BUILD=x86_64-w64_mingw32
# options
BUILD_CORES=2 #used as argument for "make -j#"
# directories: SRC_DIR contains full source package.
GCC_LIBS_DIR=$BUILD_DIR/gcc-libs

# optimized for my system.
BUILD_CFLAGS="\"-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer\""
BUILD_LFLAGS="\"-flto -fwhopr="${BUILD_CORES}"\""
CONFIG_OPTS="--prefix="${PREFIX}" --host="${HOST}" --build="${BUILD}" CFLAGS="${BUILD_CFLAGS}" LFLAGS="${BUILD_LFLAGS}  
makeopts="-s -j"${BUILD_CORES}

# libiconv
cd libiconv
echo "configuring libiconv: "${CONFIG_OPTS}
../../src/libiconv/configure "${CONFIG_OPTS}" > configure.log || exit 1
echo "building libiconv"
make $MAKEOPTS > build.log || exit 1
echo "installing libiconv"
make -s install > install.log || exit 1
cd ..

問題は、echoコマンドが私が望む正確な設定コマンドを表示しますが、設定を実行したときに正しくないことです。その後、CFLAGS=-mtunecore2構成が -flto(引用!!) を引数として使用しようとすると、致命的なエラーが発生しました。

私は何が間違っていましたか?

ありがとうございます!

PS:私は代わりにMSYSを実行しています。本物*ニックス...

ベストアンサー1

これには純粋にUnixoid-shellの問題がいくつかあり、MSYSが追加の問題を追加しないことを願っています。

複数レベルの参照を作成するのは難しいかもしれません。私は通常、可能であればそれらを避けることを好みます。

以下の修正では、$@パラメータを使用してスペースを含むパラメータを保存して検索します。空白を含む複数のパラメータリストが必要で、シェルに配列パラメータがある場合は、そのパラメータを使用できます(1つしかないため$@)。

# assume BUILD_CORES is simple enough that it will not need extra quoting later...
BUILD_CFLAGS='-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer'
BUILD_LFLAGS="-flto -fwhopr=$BUILD_CORES"
set -- --prefix="$PREFIX" --host="$HOST" --build="$BUILD" CFLAGS="$BUILD_CFLAGS" LFLAGS="$BUILD_LFLAGS"
makeopts="-s -j$BUILD_CORES"

# libiconv
cd libiconv
echo "configuring libiconv: $@"
../../src/libiconv/configure "$@" > configure.log || exit 1


指定された要件に応じて、この保護レベルのみを使用できますが、複数のレベルの引用が必要な場合(たとえば、スペースを含む場合は複数のレベルのBUILD_CORES引用を処理します。)。この場合、withとを使用することをお勧めします。フォーマット指定子はほとんど(すべてではない)シェルで使用できます(makeoptsBUILD_LFLAGSCONFIG_OPTSprintf%qeval%q変化の多く強く打つ扱いにくい)。後で正しく評価できるように、その値を引用します。

BUILD_CFLAGS='-mtune=core2 -flto -fomit-frame-pointer -momit-leaf-frame-pointer'
BUILD_LFLAGS=$(printf '%s-flto -fwhopr=%q' '' "$BUILD_CORES")
CONFIG_OPTS=$(printf \
  '%s--prefix=%q --host=%q --build=%q CFLAGS=%q LFLAGS=%q' '' \
  "$PREFIX" "$HOST" "$BUILD" "$BUILD_CFLAGS" "$BUILD_LFLAGS")
makeopts=$(printf '%s-s -j%q' '' "$BUILD_CORES")

# libiconv
cd libiconv
echo "configuring libiconv:" "$CONFIG_OPTS"
eval ../../src/libiconv/configure "$CONFIG_OPTS"
echo "building libiconv"
eval make "$MAKEOPTS" > build.log || exit 1

LFLAGSこの特別なケースでは、構成から得られたすべての内容がシェルで生成された参照値を「読み取る」方法を知っていることも知っておく必要があります。スクリプトが、%q生成システムの基本シェル(例/bin/sh:)が構文を理解できないシェル言語で書かれている場合(例:変化の多く時には構文が生成されますが、$'blah'一部のシェルはそれを解析する方法を知りません。

おすすめ記事