2017-05-25 12 views
0

パッケージを自動的にビルドするbashテストスクリプトをチューニングしようとしています。スクリプトの該当する部分は次のとおりです。エラーを生成無効なオプションがGNUに渡されました。Bashの配列

# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/i686/build.log 
# https://kojipkgs.fedoraproject.org//packages/cryptopp/5.6.3/8.fc27/data/logs/x86_64/build.log 
if [[ ("$IS_X86" -ne "0") ]]; then 
    MARCH_OPT=(-m32 -march=i686) 
else 
    MARCH_OPT=(-m64 -mtune=generic) 
fi 

FEDORA_FLAGS=(-DHAVE_CONFIG_H -I. -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 
    -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 
    -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 "${MARCH_OPT[@]}" -fasynchronous-unwind-tables) 

"$MAKE" distclean > /dev/null 2>&1 

CXX="g++" "$MAKE" "${MAKEARGS[@]}" CXXFLAGS="${FEDORA_FLAGS[@]}" cryptest.exe 2>&1 

その:

Testing: Fedora standard build 

make: invalid option -- 'g' 
make: unrecognized option '--param=ssp-buffer-size=4' 
make: invalid option -- 'c' 
make: invalid option -- '=' 
make: invalid option -- '/' 
make: invalid option -- 'u' 
make: invalid option -- '/' 
make: invalid option -- '6' 
make: invalid option -- '4' 
make: invalid option -- 'u' 
make: invalid option -- '=' 
make: invalid option -- 'g' 
make: invalid option -- 'c' 
Usage: make [options] [target] ... 
Options: 
    -b, -m      Ignored for compatibility. 
    -B, --always-make   Unconditionally make all targets. 
    -C DIRECTORY, --directory=DIRECTORY 
           Change to DIRECTORY before doing anything. 
    -d       Print lots of debugging information. 
    --debug[=FLAGS]    Print various types of debugging information. 
    -e, --environment-overrides 
           Environment variables override makefiles. 
... 

私はこの問題は、Bashの配列とは何かを持っていると思います。しかし、私は物事が正しいと確信しています。要素は括弧で囲まれています。その要素は${VAR[@]}で参照されています。私もFEDORA_FLAGS配列の各値を引用してみましたが、同じエラーが発生しました。

何がエラーを引き起こしていますか?どのように修正しますか?

答えて

1

CXXFLAGS="${FEDORA_FLAGS[@]}"は、CXXFLAGS="${FEDORA_FLAGS[*]}"である必要があります。 @ -indexed配列の動作は、配列の最初の要素だけがCXXFLAGSで始まる単語の一部として扱われていることを意味します。残りの要素は$MAKE自身の引数として扱われます。代わりに

CXX="g++" "$MAKE" "${MAKEARGS[@]}" "CXXFLAGS=-DHAVE_CONFIG_H -I. -O2 -g ..." 
+0

おかげChepnerの

CXX="g++" "$MAKE" "${MAKEARGS[@]}" CXXFLAGS=-DHAVE_CONFIG_H -I. -O2 -g ... 

を得ています。 '$ {FEDORA_FLAGS [*]} ''はそれを修正しました。これは、Bashスクリプティングの楽しさを取り除くものです。彼らが($ {VAR [@]} "構文を使うような)何かをするように指示すれば、特別な規則を覚える必要はありません。私の場合、私はルールについて知りませんでした... – jww

+0

問題は、 'CXXFLAGS'パラメータが、まったく任意のパラメータに対して機能しないものであるということです。最終的には配列を単一の文字列に平坦化して通常の変数の値として渡すので、ここでは配列を使用することは実際には役に立ちません。配列の要素を別々の単語として渡すことはありません。 'FEDORA_FLAGS =" - DHAVE_CONFIG_H - I ... ... "と' CXXFLAGS = "$ FEDORA_FLAGS" 'を使って、* exact *と同じ結果が得られます。 – chepner

+0

別の言い方をすれば、単一の変数 'CXXFLAGS'を使って引数をコンパイラに渡すことは、空白を含む引数を渡すことができないことを意味します。 – chepner

関連する問題