Подтвердить что ты не робот

Где добавить 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'
4b9b3361

Ответ 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.