こんにちは、私は次のコマンドを実行するビルドスクリプトを作成しようとしています。
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とを使用することをお勧めします。フォーマット指定子はほとんど(すべてではない)シェルで使用できます(makeopts
BUILD_LFLAGS
CONFIG_OPTS
printf
%q
eval
%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'
一部のシェルはそれを解析する方法を知りません。
答え2
スクリプトにPREFIXを定義していないので、うまく機能するには別の場所で定義する必要がありますが、警告:私はこれをテストしていません。):
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}"
二重引用符を使用すると、変数は文字列内で拡張されます(しばしば変数補間と呼ばれます)。また、元のスクリプトに引用符が一致しないため、問題が発生する可能性があると思います。