Пункты, касающиеся неудивительного пользователя, действительны, но некоторые флаги целесообразно включать по умолчанию (например, -Wall -Wextra
), а другие флаги зависят от кода и иногда необходимы (например, -std=gnu99
).
Тогда возникает вопрос, как сделать это переносимо.Я лично краду макросы проверки флагов из проекта libuv.Для этого я добавляю libuv-check-flags.m4
в каталог m4
моего проекта.Затем я могу сделать следующее в моем configure.ac
:
m4_include([m4/libuv-check-flags.m4])
AM_INIT_AUTOMAKE([-Wall -Werror foreign 1.11.2])
# Checks for programs.
AC_PROG_CC
CC_CHECK_CFLAGS_APPEND([-std=gnu99])
CC_CHECK_CFLAGS_APPEND([-Wall])
CC_CHECK_CFLAGS_APPEND([-Wextra])
AC_PROG_LIBTOOL
Мой сгенерированный файл конфигурации создает командную строку компилятора:
gcc -g -O2 -std=gnu99 -Wall -Wextra
Я могупо-прежнему переопределяя значение по умолчанию -g -O2
, используя приведенные выше решения, например:
./configure CFLAGS='-O0 -g'
Создает командную строку:
gcc -O0 -g -std=gnu99 -Wall -Wextra
И используя семантику gcc, я могупо-прежнему отключите базовые флаги, если это необходимо.Например, я могу отключить предупреждения, если я действительно хочу сделать это с помощью:
./configure CFLAGS='-Wno-all -Wno-extra'
Вы можете сказать: «Ну что, если компилятор не поддерживает эти флаги?»Вот почему эти макросы так полезны и хороши, так как они гарантируют, что функции компилятора проверяются первыми, поэтому -Wall
и -Wextra
не будут добавлены в первую очередь, если они не будут поддерживаться.
libuvявляется одной из наиболее переносимых и широко используемых библиотек C на планете, поэтому я думаю, что следовать их примеру разумно.И хотя эти макросы предназначены исключительно для C, адаптация их для использования с CXXFLAGS будет тривиальной.
Ссылки: