在 configure.ac 中的 "test" 语句中指定通配符或正则表达式的最佳方法是什么?

What is the best way to specify a wildcard or regex in a "test" statement in configure.ac?

我正在为 gnu autotools 编写 configure.ac 脚本。在我的代码中,我有一些 if test 语句,我想在其中根据编译器名称设置标志。我原来的测试是这样的:

if test "x$NETCDF_FC" = xifort; then

但有时编译器名称更复杂(例如,mpifortmpiifort、前缀路径等),所以我想检查字符串 ifort 包含在变量 $NETCDF_FC.

中的任何位置

据我所知,要使用通配符或正则表达式进行比较,我不能使用 test,而是需要使用双括号 [[ ]]。但是当 configure.acautoconf 解析以创建 configure 时,方括号被视为引号,因此其中的一个级别从输出中删除。我可以开始工作的唯一解决方案是在我的 configure.ac 中使用三重括号,如下所示:

if [[[ $NETCDF_FC =~ ifort ]]]; then

我这样做正确吗?这会被视为 configure.ac 的最佳实践还是有其他方法?

使用case语句。要么直接作为shell代码:

case "$NETCDF_FC" in
    *ifort*)
        do_whatever
        ;;
    *)
        do_something_else
        ;;
esac

或作为 m4sh 代码:

AS_CASE([$NETCDF_FC],
        [*ifort*], [do_whatever],
        [do_something_else])

我不想依赖 shell 能够解释 [[ ]][[[ ]]] 出现在 configure 运行时(你需要用[] 让双括号或三括号进入配置)。

如果您需要一个大小写模式中的字符 class(例如 *[a-z]ifort*),我建议您检查生成的 configure 文件中的 case 语句模式实际上最终会被使用,直到你在源 configure.ac 文件中的模式周围添加了足够的 [] 引号。

请注意,显式 case 语句通常在 ) 模式之前的行尾包含 # ( shell 注释,以避免编辑者对非- 匹配 opening/closing 括号。