虽然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 ..."
感谢Chepner。 ''$ {FEDORA_FLAGS [*]}“'修正了它。这是从Bash脚本中获得乐趣的那种东西。如果他们告诉我们要做某些事情(比如使用'“{{VAR [@]}”'语法),那么它应该可以在任何地方工作,而不需要记住特殊的规则。在我的情况下,我甚至不知道规则... – jww
问题是,'CXXFLAGS'参数正是那种不适用于任意参数的东西。在这里使用数组实际上并没有帮助你,因为最终你只是将数组展平为一个字符串来作为常规变量的值传递;你没有将数组的元素作为单独的单词传递。您可以通过'FEDORA_FLAGS =“ - DHAVE_CONFIG_H -I。”“和'CXXFLAGS =”$ FEDORA_FLAGS“'得到*完全相同的结果。 – chepner
换句话说:使用单个变量将参数传递给编译器'CXXFLAGS'意味着您不能传递包含空格的参数。 – chepner