Как сделать make-файл зависит от параметров сборки - PullRequest
3 голосов
/ 22 октября 2010

Давным-давно я помню, как использовал некоторые Solaris make, и у них была оригинальная опция, которая автоматически обнаруживала изменения параметров компилятора и перестраивала все правила соответствующим образом. Например, предположим, что я переключаюсь с:

г ++ -О3

до

г ++ -г

Тогда все файлы должны быть перекомпилированы. Я использую gnu make и не нашел подобной функции, и мне было интересно, есть ли у кого-нибудь способ заставить ее работать.

Ответы [ 3 ]

4 голосов
/ 22 октября 2010

A простой способ добиться этого с помощью gmake - записать параметры gcc в файл. Затем в Makefile прочтите эти параметры в переменной, используйте эту переменную в командной строке gcc и добавьте зависимость для всех объектных файлов в этот файл параметров (это можно сделать в правиле шаблона).

1 голос
/ 23 октября 2010

Вот основной способ сделать это (хотя я убежден, что это ужасная идея, см. Ниже):

-include CFLAGS.save

CFLAGS := -O2 -g

all: foo

CFLAGS.save:
    echo 'CFLAGS_SAVE := $(CFLAGS)' > $@
ifeq ($(CFLAGS),$(CFLAGS_SAVE))
%.o: %.c CFLAGS.save
    gcc $(CFLAGS_SAVE) -c -o $@ $<
else
.PHONY: CFLAGS.save
%.o: %.c CFLAGS.save
    $(MAKE) $@
endif

foo: foo.o
    gcc -o $@ $^

Вот что происходит: перед выполнением любой компиляции текущие CFLAGS записываются в CFLAGS.save. Если CFLAGS не равно CFLAGS_SAVE, то пользователь, должно быть, изменил их. Если это так, мы объявляем CFLAGS.save фальшивым, поэтому make перестроит его. Также обратите внимание, что если CFLAGS изменилось, мы обновим его, но в памяти останется старое значение. Поэтому мы должны рекурсивно вызывать make для каждого исходного файла. Не круто на большом проекте.

Другая проблема заключается в том, что если вы не укажете указать CFLAGS в командной строке, он вернется назад и перестроит все по умолчанию. Вы можете обойти это, протестировав $(origin) из CFLAGS, но серьезно, нет. Моя профессиональная этика не позволит мне отстаивать это.

make должно быть простым . У дистрибьюторов уже достаточно проблем с пониманием злоупотреблений упаковщиков инструментами сборки (к сожалению, большая часть вины, нивелируемая на automake, связана с этим). Пожалуйста, просто скажите нет системам сборки Ктулхоида.

Кроме того, make clean all CFLAGS='-Whatever -foo' будет работать так же хорошо.

1 голос
/ 22 октября 2010

Просто сделайте вашу цель зависимой от самого make-файла:

all: a.out

a.out: boo.c Makefile
        cc -O3 -g boo.c
...