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



我正在为 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语句。要么直接作为外壳代码:

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 注释,以避免编辑者对不匹配的左/右括号感到困惑。

相关内容

最新更新