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
數組中的每個值,但它產生了相同的錯誤。
什麼是產生錯誤,以及如何解決它?
感謝Chepner。 ''$ {FEDORA_FLAGS [*]}「'修正了它。這是從Bash腳本中獲得樂趣的那種東西。如果他們告訴我們要做某些事情(比如使用'「{{VAR [@]}」'語法),那麼它應該可以在任何地方工作,而不需要記住特殊的規則。在我的情況下,我甚至不知道規則... – jww
問題是,'CXXFLAGS'參數正是那種不適用於任意參數的東西。在這裏使用數組實際上並沒有幫助你,因爲最終你只是將數組展平爲一個字符串來作爲常規變量的值傳遞;你沒有將數組的元素作爲單獨的單詞傳遞。您可以通過'FEDORA_FLAGS =「 - DHAVE_CONFIG_H -I。」「和'CXXFLAGS =」$ FEDORA_FLAGS「'得到*完全相同的結果。 – chepner
換句話說:使用單個變量將參數傳遞給編譯器'CXXFLAGS'意味着您不能傳遞包含空格的參數。 – chepner