2017-05-25 28 views
0

我試圖調整一個自動構建包的bash測試腳本。腳本的相關部分是:雖然Bash數組傳遞給GNU make的選項無效

# 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. 
... 

我認爲這個問題有事情做與猛砸陣列。但我相當肯定事情是正確的。元素用括號括起來;其元素參考${VAR[@]}。我也嘗試引用FEDORA_FLAGS數組中的每個值,但它產生了相同的錯誤。

什麼是產生錯誤,以及如何解決它?

回答

1

CXXFLAGS="${FEDORA_FLAGS[@]}"應該是CXXFLAGS="${FEDORA_FLAGS[*]}";當引用數組時,@索引數組的行爲意味着只有數組的第一個元素被視爲以CXXFLAGS開頭的單詞的一部分;其餘元素被視爲$MAKE本身的參數。你得到

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

,而不是

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

感謝Chepner。 ''$ {FEDORA_FLAGS [*]}「'修正了它。這是從Bash腳本中獲得樂趣的那種東西。如果他們告訴我們要做某些事情(比如使用'「{{VAR [@]}」'語法),那麼它應該可以在任何地方工作,而不需要記住特殊的規則。在我的情況下,我甚至不知道規則... – jww

+0

問題是,'CXXFLAGS'參數正是那種不適用於任意參數的東西。在這裏使用數組實際上並沒有幫助你,因爲最終你只是將數組展平爲一個字符串來作爲常規變量的值傳遞;你沒有將數組的元素作爲單獨的單詞傳遞。您可以通過'FEDORA_FLAGS =「 - DHAVE_CONFIG_H -I。」「和'CXXFLAGS =」$ FEDORA_FLAGS「'得到*完全相同的結果。 – chepner

+0

換句話說:使用單個變量將參數傳遞給編譯器'CXXFLAGS'意味着您不能傳遞包含空格的參數。 – chepner