Где добавить CFLAG, например -std = gnu99, в проект autotools
У меня есть простой проект Autotools C (а не С++).
CFLAG (по проверке) кажутся -g -O2
.
Я хочу, чтобы все сгенерированные файлы make также добавляли -std=gnu99
к CFLAG, потому что я использую for (int i = 0; i < MAX; i++)
и тому подобное.
Я могу явно взломать Makefile, но это перезаписывается на ./configure
.
Где правильное место для добавления (или изменения) CFLAG, которые требуются для кода (в отличие от тех CFLAG, которые пользователь может захотеть изменить)?
(Обратите внимание, что это частичный дубликат Где добавить CFLAG, например -std = gnu99, в проект autotools (Eclipse CDT), когда я получал Eclipse -специфические ответы, которые я не хотел.)
@DevSolar ответ пока не помог. Файл configure.ac
(ниже) генерирует configure
script (также ниже).
configure.ac:
dnl Process this file with autoconf to produce a configure script.
CFLAGS="$CFLAGS -std=gnu99"
AC_PREREQ(2.59)
AC_INIT(tuntest, 1.0)
AC_CANONICAL_SYSTEM
AM_INIT_AUTOMAKE()
AC_PROG_CC
AC_CONFIG_FILES(Makefile src/Makefile)
AC_OUTPUT
$grep CFLAGS configure
CFLAGS
CFLAGS
To assign environment variables (e.g., CC, CFLAGS...), specify them as
CFLAGS C compiler flags
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
CFLAGS="-g"
CFLAGS=""
CFLAGS="-g"
if test "$ac_test_CFLAGS" = set; then
CFLAGS=$ac_save_CFLAGS
CFLAGS="-g -O2"
CFLAGS="-g"
CFLAGS="-O2"
CFLAGS=
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
Ответы
Ответ 1
autoconf имеет макрос для этого:
Просто поставьте:
AC_PROG_CC_STDC
после вашего AC_PROG_CC
, и все будет правильно.
Особенно, если вы используете другие компиляторы, у которых нет -std=gnu99
, но по умолчанию работают в режиме C99 (или имеют другую опцию hpcc -AC99
).
Я бы НЕ использовал CFLAGS
для такого рода вещей.
Из docs:
-- Macro: AC_PROG_CC_STDC
If the C compiler cannot compile ISO Standard C (currently C99),
try to add an option to output variable `CC' to make it work. If
the compiler does not support C99, fall back to supporting ANSI
C89 (ISO C90).
After calling this macro you can check whether the C compiler has
been set to accept Standard C; if not, the shell variable
`ac_cv_prog_cc_stdc' is set to `no'.
Ответ 2
Хотя использование макроса типа AC_PROG_CC_STDC
предпочтительнее добавления параметров компилятора в CFLAGS, в autoconf в настоящее время нет макросов, позволяющих поддержку C11-компилятора - пока нет AC_PROG_CC_C11
, а AC_PROG_CC_STDC
добавляет только параметр -std=gnu99
для gcc вместо -std=gnu11
или -std=c11
.
Вы можете добавить флаги компилятора, просто разместив
CFLAGS+=" -std=c11"
в файле configure.ac.
В качестве альтернативы, лучше проверить сначала, если компилятор поддерживает добавленную опцию, а затем напечатать предупреждение, указав пользователю вручную добавить эквивалентную опцию CFLAGS, которая работает для их компилятора:
AX_CHECK_COMPILE_FLAG([-std=c11],
[AX_APPEND_FLAG([-std=c11])],
[AC_MSG_WARN([-std=c11 not supported, you may have to set CFLAGS to enable C11 support.])
])
Здесь используются макросы AX_CHECK_COMPILE_FLAG
и AX_APPEND_FLAG
, найденные в Архив Autoconf GNU. Чтобы использовать их, поместите их в подкаталог m4
и добавьте AC_CONFIG_MACRO_DIR([m4])
в configure.ac
Ответ 3
Этот раздел рассматривается в руководстве Automake, 27.6. Заказ переменных переменных. Там взаимодействие между configure.ac
и Makefile.am
, и его больше, чем просто установка хорошо известной переменной оболочки, используемой в неявных правилах make.
Короче говоря, вы должны установить его в новой переменной, называемой как mumble_CFLAGS
, описанной в руководстве Automake. mumble
- это просто название вашей программы, и часто это foo
или bar
в других примерах. Позже, когда ваш make файл будет создан, рецепт вашей программы (mumble
или foo
или bar
) будет использовать $(mumble_CFLAGS) $(CFLAGS)
для создания цели.
Вот пример того, как он может выглядеть. Вместо использования mumble
или foo
или bar
он использует my_prog
как имя артефакта.
configure.ac
# Perform a compile test using -std=gnu99, set has_gnu99
if test "$has_gnu99" -eq "1"; then
AC_SUBST([MY_GNU99], [-std=gnu99])
fi
Makefile.am
bin_PROGRAMS = my_prog
my_prog_CFLAGS = $(MY_GNU99) $(MY_ANOTHER_FLAG) $(MY_YET_ANOTHER_FLAG) ...
Позже, когда будет создан make файл, у него будет рецепт, похожий на следующий, где $(MY_PROG_CFLAGS)
применяется ко всем объектам, которые строят my_prog
:
my_prog :
$(CC) $(CPPFLAGS) $(MY_PROG_CFLAGS) $(CFLAGS) -c $< -o [email protected]
Дополнительные ссылки my_prog_CFLAGS
позволяют вам иметь несколько флагов для разных целей. Например, у вас могут быть my_prog_CFLAGS
, a my_archive_CFLAGS
и a my_sharedobj_CFLAGS
.
И это не ограничивается my_prog_CFLAGS
. Вы также можете иметь my_prog_CPPFLAGS
, my_prog_CXXFLAGS
и другие переменные, используемые неявно в make файлах.
Это из Руководство Automake:
Компилировать флаговые переменные
В этом разделе делается попытка ответить на все вышеперечисленные вопросы. Мы будем в основном обсуждают CPPFLAGS в наших примерах, но на самом деле ответ для всех флагов компиляции, используемых в Automake: CCASFLAGS, CFLAGS, CPPFLAGS, CXXFLAGS, FCFLAGS, FFLAGS, GCJFLAGS, LDFLAGS, LFLAGS, LIBTOOLFLAGS, OBJCFLAGS, OBJCXXFLAGS, RFLAGS, UPCFLAGS и YFLAGS.
CPPFLAGS, AM_CPPFLAGS и mumble_CPPFLAGS - это три переменные, которые может использоваться для передачи флагов в препроцессор С (фактически эти переменные также используются для других языков, таких как С++ или preprocessed Fortran). CPPFLAGS - это пользовательская переменная (см. Пользовательские переменные), AM_CPPFLAGS - это переменная Automake, а mumble_CPPFLAGS - это переменная, специфичная для цели mumble (мы называем это для каждой цели переменная, см. Переменные программы и библиотеки).
Automake всегда использует две из этих переменных при компиляции источников C файлы. При компиляции объектного файла для цели mumble первый переменная будет mumble_CPPFLAGS, если она определена, или AM_CPPFLAGS в противном случае. Вторая переменная всегда является CPPFLAGS.
В следующем примере
bin_PROGRAMS = foo bar
foo_SOURCES = xyz.c
bar_SOURCES = main.c
foo_CPPFLAGS = -DFOO
AM_CPPFLAGS = -DBAZ
xyz.o будет скомпилирован с '$ (foo_CPPFLAGS) $(CPPFLAGS), (потому что xyz.o является частью цели foo), а main.o будет скомпилирован с '$ (AM_CPPFLAGS) $(CPPFLAGS) (поскольку нет переменной-цели для целевой панели).
Разница между mumble_CPPFLAGS и AM_CPPFLAGS ясна достаточно, позволяет сосредоточиться на CPPFLAGS. CPPFLAGS является пользовательской переменной, то есть переменная, которую пользователи имеют право изменять, чтобы скомпилировать пакет. Эта переменная, как и многие другие, задокументирована в конце вывод "configure --help.
Например, кому-то, кому нужно добавить /home/my/usr/include в C путь поиска компиляторов сконфигурировал бы пакет с
./configure CPPFLAGS='-I /home/my/usr/include'
и этот флаг будет распространяться на правила компиляции всех Makefiles.