在 AC_CHECK_HEADER 之前更改编译器不会更改预处理器

Changing compiler before AC_CHECK_HEADER doesn't changing Preprocessor

我正在为具有一些依赖项的库编写 configure.ac 脚本。依赖项之一是需要 MPI 的库。

我正在使用 macro 来检测 MPI 的可用性,并使用它的变量定义将 C++ 编译器更改为关联的 MPI 包装器。不幸的是,当我执行 AC_CHECK_HEADER 时,这并没有完全反映出来;编译器测试工作正常,但预处理器测试失败。

config.log 失败(注意预处理器测试使用 g++ 而不是 mpic++):

configure:17591: checking for mpic++
configure:17607: found /opt/apps/gcc4_7/mvapich2-x/2.0.0/bin/mpic++
configure:17618: result: mpic++
configure:17636: checking for MPI_Init
configure:17636: mpic++ -o conftest -g -O2 -std=c++11 conftest.cpp >&5
configure:17636: $? = 0
configure:17636: result: yes
configure:17729: checking for mpi.h
configure:17742: mpic++ -c -g -O2 conftest.cpp >&5
configure:17742: $? = 0
configure:17743: result: yes
configure:17781: checking mylibrary.h usability
configure:17781: mpic++ -c -g -O2 -I./mylibrary/include -std=c++11 conftest.cpp >&5
configure:17781: $? = 0
configure:17781: result: yes
configure:17781: checking mylibrary.h presence
configure:17781: g++ -E -I./mylibrary/include -std=c++11 conftest.cpp
In file included from ./mylibrary/include/mylibrary.h:4,
                 from conftest.cpp:26:
./mylibrary/include/mylibrary.h:4:17: fatal error: mpi.h: No such file or directory

configure.ac 关联部分:

...
ACX_MPI([], [AC_MSG_ERROR([Cannot find an MPI C++ compiler wrapper.])])
CXX="$MPICXX"
LIBS="$MPILIBS $LIBS"
CPPFLAGS="-I$with_mylibrary_path/include $CPPFLAGS"

AC_CHECK_HEADER([mylibrary.h], [], [works=no]
...

现在配置只抛出一个警告,并继续编译器的结果,但我很迂腐,想解决这个问题,这样我的用户就不会认为这是他们的系统、构建设置等问题.

我环顾四周,没有找到一种方法来重置预处理器命令以使其正常工作。我错过了什么吗?

显然 CXXCPP 用作 运行 C++ 预处理器编译器 (source) 的命令,所以我修改了我的配置脚本:

...
ACX_MPI([], [AC_MSG_ERROR([Cannot find an MPI C++ compiler wrapper.])])
CXX="$MPICXX"
CXXCPP="$CXX -E"
LIBS="$MPILIBS $LIBS"
CPPFLAGS="-I$with_mylibrary_path/include $CPPFLAGS"

AC_CHECK_HEADER([mylibrary.h], [], [works=no]
...

警告消失了。

您可以尝试听取 ACX_MPI 作者的建议并改用 AC_TRY_COMPILE...

dnl We have to use AC_TRY_COMPILE and not AC_CHECK_HEADER because the
dnl latter uses $CPP, not $CC (which may be mpicc).

顺便说一句 AX_MPI 宏似乎是 ACX_MPI.

的更新版本(但没有什么不同)