虽然Bash数组传递给GNU make的选项无效

问题描述:

我试图调整一个自动构建包的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数组中的每个值,但它产生了相同的错误。

什么是产生错误,以及如何解决它?

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