【问题标题】:Invalid option passed to GNU make though Bash array通过 Bash 数组传递给 GNU make 的无效选项
【发布时间】:2017-05-25 02:35:50
【问题描述】:

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

是什么导致了错误,我该如何解决?

【问题讨论】:

    标签: arrays bash gnu-make


    【解决方案1】:

    CXXFLAGS="${FEDORA_FLAGS[@]}" 应该是CXXFLAGS="${FEDORA_FLAGS[*]}"@-indexed 数组在引用时的行为意味着只有数组的第一个元素被视为以 CXXFLAGS 开头的单词的一部分;其余元素被视为$MAKE 本身的参数。你得到了

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

    而不是

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

    【讨论】:

    • 谢谢切普纳。 "${FEDORA_FLAGS[*]}" 修复了它。这就是从 Bash 脚本中带走乐趣的事情。如果他们告诉我们做某事(比如使用"${VAR[@]}" 语法),那么它应该可以在任何地方工作,而无需记住特殊规则。就我而言,我什至不知道规则......
    • 问题在于CXXFLAGS 参数正是对任意参数不起作用的那种东西。在这里使用数组实际上对您没有帮助,因为最终您只是将数组展平为单个字符串以作为常规变量的值传递;您没有将数组的元素作为单独的单词传递。使用FEDORA_FLAGS="-DHAVE_CONFIG_H -I. ..."CXXFLAGS="$FEDORA_FLAGS",您将获得完全相同 相同的结果。
    • 换一种说法:使用单个变量CXXFLAGS 将参数传递给编译器意味着您不能传递包含空格的参数。
    猜你喜欢
    • 2019-05-17
    • 2010-12-06
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    相关资源
    最近更新 更多