我正在为gnu自动工具编写configure.ac脚本。在我的代码中,我有一些if test
语句,我想根据编译器名称设置标志。我的原始测试如下所示:
if test "x$NETCDF_FC" = xifort; then
但是有时编译器名称会更复杂(例如mpifort
,mpiifort
,前缀的路径等),因此我想检查字符串ifort
是否包含在变量[C0中]。
据我所知,要使用通配符或正则表达式进行比较,我不能使用$NETCDF_FC
,而需要使用双括号test
。但是,当[[ ]]
被configure.ac
解析以创建autoconf
时,方括号被视为引号,因此将其一级从输出中删除。我唯一可以使用的解决方案是在configure.ac中使用三括号,如下所示:
configure
我正确执行此操作吗?是否将其视为if [[[ $NETCDF_FC =~ ifort ]]]; then
的最佳做法,还是有其他方法?
使用configure.ac
语句。直接作为shell代码:
case
或作为m4sh代码:
case "$NETCDF_FC" in
*ifort*)
do_whatever
;;
*)
do_something_else
;;
esac
我不想依靠能够解释AS_CASE([$NETCDF_FC],
[*ifort*], [do_whatever],
[do_something_else])
运行时出现的[[ ]]
或[[[ ]]]
的外壳程序(您需要使用configure
进行转义以使双括号或三括号括起来)配置)。
[如果您需要区分大小写模式中的字符类(例如[]
),我建议您检查生成的*[a-z]ifort*
文件中的configure
语句模式,该模式最终会被使用,直到您有足够的空间为止case
引号在源[]
文件中的模式周围添加。
[请注意,显式configure.ac
语句通常在case
模式之前的行尾包含# (
shell注释,以避免编辑者对不匹配的开/关括号感到困惑。