如何确定 Autoconf 中的编译器名称或供应商?
How to determine compiler name or vendor in Autoconf?
我正在使用 SunCC 开发 Solaris。 Autoconf 的 AC_COMPILE_IFELSE
和 AC_LINK_IFELSE
错误检测编译器功能。 Autoconf 正在报告功能可用,即使编译器用 illegal option
.
等消息拒绝它们
$ echo 'int main(int argc, char* argv[]) {}' > test.C
$ /opt/solarisstudio12.4/bin/CC test.C
$ /opt/solarisstudio12.4/bin/CC -msse4.2 -msha test.C
CC: Warning: Option -msse4.2 passed to ld, if ld is invoked, ignored otherwise
CC: Warning: Option -msha passed to ld, if ld is invoked, ignored otherwise
ld: fatal: option '-h a' is incompatible with building a dynamic executable
$ /opt/solarisstudio12.4/bin/CC -xarch=sha test.C
CC: Warning: illegal use of -xarch option, illegal value ignored: sha
我想尝试解决错误检测,但我需要了解编译器才能做到这一点。 Autoconf 有一些提供 canonicalized names for CPU, Vendor and OS 的宏,但它们似乎不包括编译器或其供应商。
我们如何检测或确定 Autoconf 中的编译器名称或供应商?
添加以下内容并没有多大帮助,因为它无法识别编译器。
AC_MSG_NOTICE(["Build: $build"])
AC_MSG_NOTICE(["Compiler: $compiler"])
然后:
CXX=/opt/solarisstudio12.4/bin/CC ./configure
...
configure: "Build: i386-pc-solaris2.11"
configure: "Compiler: /opt/solarisstudio12.4/bin/CC"
我认为没有标准的方法可以做到这一点。
我们根据 predef.sourceforge.net 以及更多来源(例如 cc --version
、cc 的命令名称、操作系统名称等)手动检查是否存在编译器宏。
即你编译一个程序,然后检查定义。
如果它不存在/程序#errors out -> 不是 SunCC。
看起来很乱,但这里有一个直接来自 Score-P 来源 (vendor/common/build-config/m4/ax_compiler_vendor.m4) 的示例。也许你可以从中得到一些启发:
AC_DEFUN([AX_COMPILER_VENDOR],
[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
dnl Please add if possible support to ax_compiler_version.m4
[# note: don't check for gcc first since some other compilers define __GNUC__
vendors="intel: __ICC,__ECC,__INTEL_COMPILER
ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__
pathscale: __PATHCC__,__PATHSCALE__
clang: __clang__
cray: _CRAYC
fujitsu: __FUJITSU
gnu: __GNUC__
sun: __SUNPRO_C,__SUNPRO_CC
hp: __HP_cc,__HP_aCC
dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER
borland: __BORLANDC__,__CODEGEARC__,__TURBOC__
comeau: __COMO__
kai: __KCC
lcc: __LCC__
sgi: __sgi,sgi
microsoft: _MSC_VER
metrowerks: __MWERKS__
watcom: __WATCOMC__
portland: __PGI
tcc: __TINYC__
unknown: UNKNOWN"
for ventest in $vendors; do
case $ventest in
*:) vendor=$ventest; continue ;;
*) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;;
esac
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
#if !($vencpp)
thisisanerror;
#endif
])], [break])
done
ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1`
])
])
正如@Ronny 所说,似乎没有确定编译器供应商的标准方法。在配置期间检测供应商对于任务很重要,例如在错误检测期间解决 Autoconf 错误:CC: Warning: illegal use of -xarch option, illegal value ignored: sha
.
@Ronny 展示了如何使用预处理器宏来完成。由于编译器伪装成 GCC 的方式,我们避免了这种情况。 Clang 和 Intel 的编译器都定义了 __GNUC__
,可能其他人也这样做了。
以下是如何使用 configure.ac
中的版本字符串:
## Determine the compiler's vendor.
COMPILER_VERSION=`"$CXX" --version 2>/dev/null`
## IBM xlC test if COMPILER_VERSION is empty
if test x"$COMPILER_VERSION" = "x"; then
COMPILER_VERSION=`"$CXX" -qversion 2>/dev/null`
fi
## SunCC test if COMPILER_VERSION is empty
if test x"$COMPILER_VERSION" = "x"; then
COMPILER_VERSION=`"$CXX" -V 2>&1`
fi
然后,供应商可以像这样使用:
IS_SUN_COMPILER=`echo $COMPILER_VERSION | $EGREP -i -c -E 'Sun C\+\+'`
echo "IS_SUN_COMPILER: $IS_SUN_COMPILER"
...
## This block handles SunCC.
if test "$IS_SUN_COMPILER" -ne "0"; then
...
fi
我正在使用 SunCC 开发 Solaris。 Autoconf 的 AC_COMPILE_IFELSE
和 AC_LINK_IFELSE
错误检测编译器功能。 Autoconf 正在报告功能可用,即使编译器用 illegal option
.
$ echo 'int main(int argc, char* argv[]) {}' > test.C
$ /opt/solarisstudio12.4/bin/CC test.C
$ /opt/solarisstudio12.4/bin/CC -msse4.2 -msha test.C
CC: Warning: Option -msse4.2 passed to ld, if ld is invoked, ignored otherwise
CC: Warning: Option -msha passed to ld, if ld is invoked, ignored otherwise
ld: fatal: option '-h a' is incompatible with building a dynamic executable
$ /opt/solarisstudio12.4/bin/CC -xarch=sha test.C
CC: Warning: illegal use of -xarch option, illegal value ignored: sha
我想尝试解决错误检测,但我需要了解编译器才能做到这一点。 Autoconf 有一些提供 canonicalized names for CPU, Vendor and OS 的宏,但它们似乎不包括编译器或其供应商。
我们如何检测或确定 Autoconf 中的编译器名称或供应商?
添加以下内容并没有多大帮助,因为它无法识别编译器。
AC_MSG_NOTICE(["Build: $build"])
AC_MSG_NOTICE(["Compiler: $compiler"])
然后:
CXX=/opt/solarisstudio12.4/bin/CC ./configure
...
configure: "Build: i386-pc-solaris2.11"
configure: "Compiler: /opt/solarisstudio12.4/bin/CC"
我认为没有标准的方法可以做到这一点。
我们根据 predef.sourceforge.net 以及更多来源(例如 cc --version
、cc 的命令名称、操作系统名称等)手动检查是否存在编译器宏。
即你编译一个程序,然后检查定义。 如果它不存在/程序#errors out -> 不是 SunCC。
看起来很乱,但这里有一个直接来自 Score-P 来源 (vendor/common/build-config/m4/ax_compiler_vendor.m4) 的示例。也许你可以从中得到一些启发:
AC_DEFUN([AX_COMPILER_VENDOR],
[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor,
dnl Please add if possible support to ax_compiler_version.m4
[# note: don't check for gcc first since some other compilers define __GNUC__
vendors="intel: __ICC,__ECC,__INTEL_COMPILER
ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__
pathscale: __PATHCC__,__PATHSCALE__
clang: __clang__
cray: _CRAYC
fujitsu: __FUJITSU
gnu: __GNUC__
sun: __SUNPRO_C,__SUNPRO_CC
hp: __HP_cc,__HP_aCC
dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER
borland: __BORLANDC__,__CODEGEARC__,__TURBOC__
comeau: __COMO__
kai: __KCC
lcc: __LCC__
sgi: __sgi,sgi
microsoft: _MSC_VER
metrowerks: __MWERKS__
watcom: __WATCOMC__
portland: __PGI
tcc: __TINYC__
unknown: UNKNOWN"
for ventest in $vendors; do
case $ventest in
*:) vendor=$ventest; continue ;;
*) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;;
esac
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[
#if !($vencpp)
thisisanerror;
#endif
])], [break])
done
ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1`
])
])
正如@Ronny 所说,似乎没有确定编译器供应商的标准方法。在配置期间检测供应商对于任务很重要,例如在错误检测期间解决 Autoconf 错误:CC: Warning: illegal use of -xarch option, illegal value ignored: sha
.
@Ronny 展示了如何使用预处理器宏来完成。由于编译器伪装成 GCC 的方式,我们避免了这种情况。 Clang 和 Intel 的编译器都定义了 __GNUC__
,可能其他人也这样做了。
以下是如何使用 configure.ac
中的版本字符串:
## Determine the compiler's vendor.
COMPILER_VERSION=`"$CXX" --version 2>/dev/null`
## IBM xlC test if COMPILER_VERSION is empty
if test x"$COMPILER_VERSION" = "x"; then
COMPILER_VERSION=`"$CXX" -qversion 2>/dev/null`
fi
## SunCC test if COMPILER_VERSION is empty
if test x"$COMPILER_VERSION" = "x"; then
COMPILER_VERSION=`"$CXX" -V 2>&1`
fi
然后,供应商可以像这样使用:
IS_SUN_COMPILER=`echo $COMPILER_VERSION | $EGREP -i -c -E 'Sun C\+\+'`
echo "IS_SUN_COMPILER: $IS_SUN_COMPILER"
...
## This block handles SunCC.
if test "$IS_SUN_COMPILER" -ne "0"; then
...
fi