在 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
但有时编译器名称更复杂(例如,mpifort
、mpiifort
、前缀路径等),所以我想检查字符串 ifort
包含在变量 $NETCDF_FC
.
中的任何位置
据我所知,要使用通配符或正则表达式进行比较,我不能使用 test
,而是需要使用双括号 [[ ]]
。但是当 configure.ac
被 autoconf
解析以创建 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 括号。
我正在为 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
语句。要么直接作为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 括号。