Autoconf – установка флагов компилятора для проверок

Вопрос или проблема

Я пытаюсь использовать autoconf для создания скрипта configure. Однако некоторые заголовки, которые я хочу проверить, требуют дополнительных флагов компилятора (например, c++11). Я частично справляюсь с этим, используя ответ здесь, где соответствующие строки выглядят так в файле configure.ac.

AX_CXX_COMPILE_STDCXX_11(,[обязательный])
AC_CHECK_HEADER("CL/cl2.hpp")

но флаг std=gnu++11 не передается на этапе предварительной обработки AC_CHECK_HEADERS, где я получаю странный результат, при котором он используется, но отсутствует:

проверка доступности CL/cl2.hpp... да
проверка присутствия CL/cl2.hpp... нет

Просматривая config.log, я вижу следующие строки:

configure:3423: проверка присутствия CL/cl2.hpp
configure:3423: g++ -E conftest.cpp
In file included from conftest.cpp:19:0
/usr/include/CL/cl2.hpp:442:2: error #error Необходим компилятор Visual Studio 2013 или другой, поддерживающий C++11

где я ясно вижу, что флаг C++ не используется. Как можно использовать флаги компилятора на этих этапах предварительной обработки?

ИЗМЕНЕНИЕ

Я могу обойти это вручную, установив CXXCPP вручную при запуске configure, но я хотел бы, чтобы это работало без необходимости конечного пользователя знать об этом.

./configure CXXCPP="g++ -E -std=gnu++11"

Текущее решение, которое я придумал, заключается в том, чтобы вручную добавить:

CXXCPP="g++ -E -std=gnu++11"

прямо в файл configure.ac. Я был бы рад услышать любые дополнительные ответы.

Мне пришлось запустить configure так:

./configure CCFLAGS="-std=c++11" CXXFLAGS="-std=c++11" CXXCPP="-std=c++11"

Ответ или решение

Для создания конфигурационного скрипта с использованием autoconf в контексте проверки заголовков, требующих дополнительных флагов компилятора, таких как c++11, необходимо правильно настроить файл configure.ac. Ваша проблема заключается в том, что флаг -std=gnu++11 не передается на этапе препроцессора для проверки заголовков, что приводит к ошибкам в процессе конфигурации.

Настройка configure.ac

Шаг 1: Используйте макросы для проверки C++

Для начала убедитесь, что используете макрос AX_CXX_COMPILE_STDCXX_11, который проверяет, поддерживает ли компилятор стандарт C++11, и добавляет соответствующие флаги. Это уже правильно настроено у вас в коде:

AX_CXX_COMPILE_STDCXX_11([, [mandatory]])

Шаг 2: Передача флагов компилятора

Для передачи нужных флагов компиляции в AC_CHECK_HEADER, вам нужно сделать следующее:

  1. Убедитесь, что флаги добавлены в переменные CXXFLAGS и CPPFLAGS, которые используются в процессе конфигурации.

Вы можете добавить в ваш configure.ac следующий код:

# Установка флагов компиляции
CXXFLAGS="$CXXFLAGS -std=gnu++11"
CPPFLAGS="$CPPFLAGS -I/usr/include/CL"

И сразу после этого добавьте проверку заголовка:

AC_CHECK_HEADER([CL/cl2.hpp])

Шаг 3: Поддержка пользовательских флагов

Для того чтобы сделать процесс конфигурации более интуитивным для пользователя, вы можете добавить поддержку пользовательских флагов через аргументы командной строки. Например, в configure.ac добавьте код, который будет устанавливать значения по умолчанию для переменных, если они не были заданы:

AC_ARG_VAR([CXXFLAGS], [C++ compiler flags])
CXXFLAGS="${CXXFLAGS-'-std=gnu++11'}"

Шаг 4: Создание конфигурационного скрипта

Не забудьте выполнить команду для переработки скрипта конфигурации:

autoreconf -i

И затем запустите ./configure:

./configure

Заключение

Следуя этим шагам, вы сможете без проблем передавать необходимые флаги компилятора для проверки заголовков, не требуя от пользователя ручной настройки переменной CXXCPP. Это обеспечит более удобный и профессиональный подход к процессу сборки вашего проекта. Если у вас возникнут дополнительные вопросы или сложности, всегда рекомендуется проверять файл config.log для получения детальной информации об ошибках, которые могут возникнуть во время конфигурации.

Оцените материал
Добавить комментарий

Капча загружается...