Лучший сценарий для этого: http://benalman.com/projects/javascript-linkify-process-lin/
Документация к Autools на
blockquote>AC_COMPILE_IFELSE
[...], как обычно, жалкая. Здесь не обсуждается тема и не приводятся примеры.Хотя эта отдельная страница не содержит подробных сведений, она является частью более крупного руководства, которое содержит более подробные сведения и некоторые соответствующие примеры в соседних разделах. Однако даже эта страница предлагает
AC_LANG_PROGRAM
в качестве подходящего средства для получения параметраinput
для этого макроса, а документация для этого макроса дает разумное представление об общей форме, которую он создает - фактическая исходный код программы, а не имя файла.Когда дело доходит до получения ответного удара, я предлагаю не быть преднамеренно в темноте. Даже если вы не находите документацию адекватной, по крайней мере, файл журнала
configure
(config.log
) должен содержать много информации о том, что именно не удалось и как. В случае сбоя, он покажет вам полный источник программы тестирования, которую он использовал, команды, которые он выполнил, чтобы фактически выполнить тест, и любую выполненную диагностику.Например, используя скрипт configure, полученный из этого
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
... Я получаю результат ошибки с соответствующим выводом в журнале:
blockquote>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_LANG_PROGRAM
предоставляет больше, чем вы хотите в этом случае (в соответствии с его документацией). На самом деле, вам это вообще не нужно, если вы предоставляете полный исходный текст для тестовой программы.Тестовая программа компилируется и связывается как программа на C, но ее источником является C ++. Это значение по умолчанию задокументировано в руководстве .
Проблема (1) может быть решена просто путем подачи источника напрямую в
AC_LINK_IFELSE
, без переноса его черезAC_LANG_PROGRAM
, но в этом случае Autoconf предупредит о невидимостиAC_LANG_SOURCE
. Достаточно удобным решением этого является использованиеAC_LANG_SOURCE
напрямую, а неAC_LANG_PROGRAM
. Однако это добавит некоторый дополнительный#defines
к предоставленному источнику, который может вас не устраивать. Если вы не хотите этого, то я думаю, что в этом случае будет безопасно игнорировать предупреждения.Проблема (2) может быть решена с помощью макроса
AC_LANG
, чтобы сообщить Autoconf, что тест должен выполняться с использованием компилятора C ++ и соответствующих переменных Autotools для флагов C ++.Таким образом, если я обновлю свой
configure.ac
до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
, то мой запуск конфигурации завершится успешно, и в журнале я вижу, что успешно выполненная команда компиляции была
blockquote>configure:2296: g++ -o conftest -msse2 conftest.cpp >&5
. То есть он компилировался с использованием выбранного компилятора C ++, с использованием флагов, как указано в
CXXFLAGS
, и соответствующим образом называл исходный файл теста для компиляции как C ++.