2016-01-12 6 views
0

Я пишу сценарий configure.ac для библиотеки, которая имеет несколько зависимостей. Одна из зависимостей - это библиотека, которая требует MPI.Изменение компилятора до того, как AC_CHECK_HEADER не изменяется Препроцессор

Я использую 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] 
... 

Теперь настроить только бросает предупреждение, и продолжается с компилятора результаты, но я педантичен и хочу решить эту проблему, чтобы мои пользователи не думали, что это проблема с их системой, установкой сборки и т. д.

Я огляделся и не нашел способа сбросить команду препроцессора для этого. Я что-то упускаю?

+0

Вам нужно сделать глубокий вдох и выяснить, что происходит, глядя на созданный robo скрипт configure, и какая точная команда выполняется, какая точная команда ДОЛЖНА выполняться, и почему она не делает что. В прошлом были аналогичные ситуации с волосами, когда у меня не было других вариантов, но чтобы вникнуть в скрипт configure и выяснить, что действительно происходит под обложками. –

+0

Я боялся, что мне, возможно, придется это сделать. Я посмотрю, что я могу найти. –

ответ

2

Вы можете попробовать принимать советы авторов 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). 

BTW AX_MPI макрос кажется более обновлена ​​(но не отличается) версия ACX_MPI.

+0

Это более подходящее решение; благодаря! –

0

Видимо 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] 
... 

и предупреждение исчезает.