Compilation 如何进行Autoconf以测试来自外部文件的源代码?

Compilation 如何进行Autoconf以测试来自外部文件的源代码?,compilation,autotools,autoconf,Compilation,Autotools,Autoconf,我们使用GNUmakefile作为主要构建系统。makefile使用源文件中的测试程序执行功能测试: $ ls TestPrograms/ dump2def.cxx test_arm_sm4.cxx test_x86_avx.cxx test_32bit.cxx test_cxx.cxx test_x86_avx2.cxx test_64bit.cxx test_mixed_asm.cxx test_x86_avx512.

我们使用GNUmakefile作为主要构建系统。makefile使用源文件中的测试程序执行功能测试:

$ ls TestPrograms/
dump2def.cxx         test_arm_sm4.cxx      test_x86_avx.cxx
test_32bit.cxx       test_cxx.cxx          test_x86_avx2.cxx
test_64bit.cxx       test_mixed_asm.cxx    test_x86_avx512.cxx
...
测试程序是人们所期望的:

$ cat test_cxx.cxx
#include <string>
int main(int argc, char* argv[])
{
    unsigned int x=0;
    return x;
}
结果:

checking if g++ supports -msse2 and Foo Bar... no
与将文件放入字符串中的
cat
'的结果相同:

CXXFLAGS="-msse2"
AC_MSG_CHECKING([if $CXXNAME supports $CXXFLAGS and Foo Bar])
AC_LINK_IFELSE(
   [AC_LANG_PROGRAM(`cat TestPrograms/test_x86_sse2.cxx`)],
   [AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])]
)
Skylake计算机上的结果不正确。SSE2是核心指令集的一部分,始终可用:

$ g++ -msse2 TestPrograms/test_x86_sse2.cxx
$
我们如何告诉Autoconf编译测试文件

AC\u COMPILE\u IFELSE
[…]上的Autools文档和往常一样可怜。它没有讨论该主题或提供示例

虽然这一页没有提供完整的细节,但它是一本更大手册的一部分,该手册在附近的章节中提供了更多细节和一些相关示例。即使是该页面本身也建议将
AC_LANG_PROGRAM
作为为该宏生成
input
参数的适当方法,并且给出了它生成的一般形式的合理概念——程序的实际源代码,而不是文件名

在回答问题时,我建议不要在黑暗中肆意刺探。即使您认为文档不充分,至少
configure
的日志文件(
config.log
)应该包含大量关于哪些失败以及如何失败的信息。如果出现故障,它将向您显示所用测试程序的完整来源、为实际执行测试而执行的命令以及发出的任何诊断

例如,使用此
configure.ac
派生的配置脚本,其灵感来自您的示例

AC_INIT([test_test], [0.0.1])
AC_CONFIG_SRCDIR([test_src/test_cxx.cxx])
AC_PROG_CXX
CXXFLAGS="-msse2"
AC_MSG_CHECKING([if $CXXNAME supports $CXXFLAGS and Foo Bar])
AC_LINK_IFELSE(
   [AC_LANG_PROGRAM([`cat test_src/test_cxx.cxx`])],
   [AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])]
)
AC_OUTPUT
。。。我通过日志中的相关输出得到一个失败结果:

然后我的configure运行成功,我在日志中看到它成功执行的编译命令是


。也就是说,它使用C++ C++编译器编译,使用在 CXXFLACK< <代码>中指定的标志,并将测试源文件命名为C++./P>,谢谢约翰。我希望在今天晚些时候对此进行测试。@jww-是的,好吧,自动工具可以处理近30年的边缘案例、深奥的标志、编译器、ABI和数千种系统特性。每一个开始成为下一个“简化”构建系统的构建系统都会发现自己的规模和复杂性在迅速增加,因为它不可避免地会重新发明轮子<代码>AC_PROG_CXX;AC_LANG([C++])?@BrettHale-是,和
AC_LANG_ASSERT([C++])
AC_INIT([test_test], [0.0.1])
AC_CONFIG_SRCDIR([test_src/test_cxx.cxx])
AC_PROG_CXX
CXXFLAGS="-msse2"
AC_MSG_CHECKING([if $CXXNAME supports $CXXFLAGS and Foo Bar])
AC_LINK_IFELSE(
   [AC_LANG_PROGRAM([`cat test_src/test_cxx.cxx`])],
   [AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])]
)
AC_OUTPUT
configure:2891: gcc -o conftest -g -O2   conftest.c  >&5
conftest.c:9:18: fatal error: string: No such file or directory
 #include <string>
                  ^
compilation terminated.
configure:2891: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "test_test"
| #define PACKAGE_TARNAME "test_test"
| #define PACKAGE_VERSION "0.0.1"
| #define PACKAGE_STRING "test_test 0.0.1"
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE_URL ""
| /* end confdefs.h.  */
| #include <string>
| int main(int argc, char* argv[])
| {
|     unsigned int x=0;
|     return x;
| }
| int
| main ()
| {
| 
|   ;
|   return 0;
| }
configure:2895: result: no
AC_INIT([test_test], [0.0.1])
AC_CONFIG_SRCDIR([test_src/test_cxx.cxx])
AC_PROG_CXX
AC_LANG([C++])
CXXFLAGS="-msse2"
AC_MSG_CHECKING([if $CXXNAME supports $CXXFLAGS and Foo Bar])
AC_LINK_IFELSE(
   [AC_LANG_SOURCE([`cat test_src/test_cxx.cxx`])],
   [AC_MSG_RESULT([yes])],
   [AC_MSG_RESULT([no])]
)
AC_OUTPUT
configure:2296: g++ -o conftest -msse2   conftest.cpp  >&5