Сделать: переопределить флаг

Меня немного смутили ответы на Быстрый способ переопределения флага -Werror?

Поэтому я задаю свой конкретный вопрос здесь.

У меня есть несколько файлов Makefile, работающих вместе, и CFLAGS был установлен по пути (-Werror -Wall .. и многие другие)

Но в одном из Makefile я хочу, чтобы ошибки не рассматривались как предупреждения, поэтому я хотел бы удалить флаг -Werror.

Каким будет лучший способ добиться этого, чтобы только для этого файла Makefile был удален флаг -Werror, а для остальных было нормальное выполнение?

Спасибо, Санни


person Sunny    schedule 26.06.2013    source источник
comment
лучший способ? Вы мало нам рассказали. Сколько раз этот make-файл использует CFLAGS? Вызывает ли он другие make-файлы?   -  person Beta    schedule 26.06.2013


Ответы (3)


Более простой способ

Похоже, вы можете вызвать

gcc -c ... -Werror ... -Wno-error ...

без жалоб GCC (GCC 4.7.1). Таким образом, вы можете добавить -Wno-error в CFLAGS, настроенные в другом месте в том make-файле, где вам это нужно. Если вы используете GNU make, в один make-файл вы можете добавить:

CFLAGS += -Wno-error

возможно, только для одной цели, которая в этом нуждается.

Более сложный путь

В противном случае вам нужна система для сборки CFLAGS из компонентов. Что у меня есть в make-файле, который я использую для тестирования ответов на вопросы по SO:

WFLAG1 = -Wall 
WFLAG2 = -Wextra
WFLAG3 = -Wmissing-prototypes 
WFLAG4 = -Wstrict-prototypes 
WFLAG5 = -Wold-style-definition
WFLAG6 =
WFLAGS = ${WFLAG1} ${WFLAG2} ${WFLAG3} ${WFLAG4} ${WFLAG5} ${WFLAG6} 
SFLAGS = -std=c99
GFLAGS = -g
OFLAGS = -O3
UFLAGS =
IFLAG1 = -I${HOME}/inc
IFLAGS = # ${IFLAG1}

CFLAGS   = ${OFLAGS} ${GFLAGS} ${IFLAGS} ${SFLAGS} ${WFLAGS} ${UFLAGS}

Суть в том, что каждый флажок регулируется независимо; Я могу управлять флагами предупреждения, установив любой из ${WFLAG1} в ${WFLAG6}, или установив ${WFLAGS} в командной строке, или (действительно) установив ${CFLAGS}. Но потому что каждый из них настраивается индивидуально и может относительно легко настраивать предупреждения (основная проблема заключается в том, чтобы определить, какой WFLAGn нуждается в затирании).

UFLAGS — это «пользовательские флаги», которые устанавливаются только в командной строке; Я могу добавить больше флагов в свою командную строку, установив ее.

Этот способ «сложнее», потому что он требует от вас изменения центральной части вашей системы make-файлов, где вы устанавливаете CFLAGS. Кроме того, меньше шансов, что ваши коллеги поймут это с первого взгляда.

person Jonathan Leffler    schedule 26.06.2013

Правильный способ сделать это — использовать filter-out функция.

Помещать

CFLAGS := $(filter-out -Werror,$(CFLAGS))

в Makefile, где вы хотите переопределить это, и -Werror часть CFLAGS будет удалена в этом Makefile.

Вы даже можете использовать это, чтобы переопределить флаги для одной цели, используя специфический для цели значения переменных:

CFLAGS = -Werror

all: foo bar

foo:
        echo cc $(CFLAGS) -o $@

bar: CFLAGS := $(filter-out -Werror,$(CFLAGS))

bar:
        echo cc $(CFLAGS) -o $@

foo будет построен с CFLAGS по умолчанию, содержащим -Werror, но bar будет построен без него.

Это решение общего назначения, которое работает для всех аргументов всех программ, вместо того, чтобы требовать, чтобы каждая программа предоставляла --no-foo для каждой опции --foo. Поскольку это невозможно сделать из командной строки Make, это не дает прямого ответа на вопрос, на который вы ссылались. Но переопределение переменных Make из командной строки для принудительной сборки — довольно хороший способ сделать ваш несобираемый код еще менее удобным для сопровождения!

person andrewdotn    schedule 26.06.2013

Вы можете увидеть пример переопределения переменных в Git Makefile с CFLAGS, который теперь может быть настроенным при вызове Make при использовании DEVELOPER=YesPlease с Git 2.22 (второй квартал 2019 г.)

DEVELOPER (в Git Makefile) — это переменная для группировать дополнительные предупреждения компилятора< /а>.

См. коммит 6d5d4b4, зафиксировать 71a7894, , коммит 65260a4, коммит 9559f8f, commit 4f14a8c (22 февраля 2019 г.), автор Ævar Arnfjörð Bjarmason (avar).< br> (Объединено Junio ​​C Hamano - - gitster -- в commit 3cef676, 20 марта 2019 г.)

Makefile: позволяет комбинировать DEVELOPER=1 и CFLAGS="..."

С тех пор, как была введена функция DEVELOPER=1, не было возможности иметь пользовательские CFLAGS (например, CFLAGS="-O0 -g -ggdb3"), но при этом пользоваться набором предупреждений и утверждений, которые позволяет DEVELOPER=1.

Это связано с тем, что семантика переменных в Makefile такова, что пользовательская установка CFLAGS переопределяет все, что мы устанавливаем, включая то, что мы делаем в config.mak.dev.

Итак, давайте введем переменную "DEVELOPER_CFLAGS" в config.mak.dev и добавьте его в ALL_CFLAGS. До этого переменная ALL_CFLAGS (в основном, есть некоторые нюансы, в которые мы не будем вдаваться) была бы установлена ​​в:

$(CPPFLAGS) [$(CFLAGS) *or* $(CFLAGS) in config.mak.dev] $(BASIC_CFLAGS) $(EXTRA_CPPFLAGS)

Но теперь будет:

$(DEVELOPER_CFLAGS) $(CPPFLAGS) $(CFLAGS) $(BASIC_CFLAGS) $(EXTRA_CPPFLAGS)

Причина размещения DEVELOPER_CFLAGS на первом месте заключается в том, чтобы разрешить выборочное переопределение того, что вносит DEVELOPER=1.
Как в GCC, так и в Clang более поздние настройки переопределяют более ранние.
Например. "-Wextra -Wno-extra" не активирует никаких "дополнительных" предупреждений, но не в том случае, если эти два аргумента переставлены местами.

Примеры того, что раньше было невозможно, а теперь возможно:

# Use -O0 instead of -O2 for less painful debuggng
DEVELOPER=1 CFLAGS="-O0 -g"
# DEVELOPER=1 plus -Wextra, but disable some of the warnings
DEVELOPER=1 DEVOPTS="no-error extra-all" CFLAGS="-O0 -g -Wno-unused-parameter"

Причина, по которой патчи, предшествовавшие этому, переупорядочивали различные назначения *FLAGS и включали только для удобства чтения.
Makefile поддерживает назначения не по порядку, например:

$ cat Makefile
X = $(A) $(B) $(C)
A = A
B = B
include c.mak
all:
        @echo $(X)
$ cat c.mak
C=C
$ make
A B C
person VonC    schedule 23.03.2019