我正在为 gnu autotools 编写一个 configure.ac 脚本。在我的代码中,我有一些if test
语句,我想根据编译器名称设置标志。我最初的测试看起来像这样:
if test "x$NETCDF_FC" = xifort; then
但有时编译器名称更复杂(例如,mpifort
、mpiifort
、路径前置等(,所以我想检查字符串ifort
是否包含在变量$NETCDF_FC
中的任何位置。
据我了解,要使用通配符或正则表达式设置比较,我不能使用test
而是需要使用双括号[[ ]]
。但是当configure.ac
被autoconf
解析以创建configure
时,方括号被视为引号,因此从输出中删除了其中的一个级别。我能开始工作的唯一解决方案是在 configure.ac 中使用三重括号,如下所示:
if [[[ $NETCDF_FC =~ ifort ]]]; then
我这样做是否正确?这是否被视为configure.ac
最佳实践,还是有其他方法?
使用case
语句。要么直接作为外壳代码:
case "$NETCDF_FC" in
*ifort*)
do_whatever
;;
*)
do_something_else
;;
esac
或作为 M4sh 代码:
AS_CASE([$NETCDF_FC],
[*ifort*], [do_whatever],
[do_something_else])
我不想依赖能够在运行时configure
解释[[ ]]
或[[[ ]]]
的 shell (您需要用[]
转义这些内容才能让双括号或三括号进入配置(。
如果您需要大小写模式中的字符类(例如*[a-z]ifort*
(,我建议您检查生成的configure
文件中的case
语句模式,这些模式实际上最终被使用,直到您在源configure.ac
文件中的模式周围添加了足够的[]
引号。
请注意,显式case
语句通常在)
模式前面的行尾包含# (
shell 注释,以避免编辑者对不匹配的左/右括号感到困惑。