Гну Марка, фальшивые предпосылки - PullRequest
0 голосов
/ 13 декабря 2018

Рассмотрим этот Makefile

all: a.out

a.out: group_1 group_2
group_1: CXXFLAGS = -Wall
group_2: CXXFLAGS = -Wextra
group_1: a.o b.o
group_2: c.o

Хотя он, вероятно, будет работать нормально, я хочу знать, как правильно написать это, потому что в соответствии с GNU Make docs, group_1 и group_2 должно быть .PHONY целей, так как это не реальные цели, а просто способ группировки набора целей с одинаковой конфигурацией.

Но, в то же время, .PHONY цели не должны использоватьсяв качестве предварительных условий для других целей в соответствии с рекомендациями документов.Поэтому я не знаю, как правильно указать такую ​​структуру зависимости.

Цель этого, если я не ошибаюсь, в целях оптимизации.Я хочу, чтобы CXXFLAGS оценивался как можно меньше, и я предполагаю, что Makefile подобно

all: a.out

a.out: a.o b.o c.o
a.o b.o: CXXFLAGS = -Wall
c.o: CXXFLAGS = -Wextra

будет оцениваться CXXFLAGS один раз за предварительное условие, в то время как с предыдущим методом, только один раз на группу,поэтому мой первый Makefile должен работать быстрее (экстраполировать на большие деревья зависимостей).

1 Ответ

0 голосов
/ 13 декабря 2018

Вы не можете сделать это легко с целями.Проблема в том, что a.out будет зависеть от двух файлов group_1 и group_2.Эти файлы никогда не существуют, поэтому a.out всегда будет считаться устаревшим.

Что касается вопроса о расширении переменной, ваше предположение неверно.Даже в вашем первом примере CXXFLAGS будет оцениваться каждый раз, когда будет построена любая цель.Это должно быть так, потому что назначение переменных может быть примерно таким:время (может быть, они вызывают shell или что-то в этом роде), и вы уверены, что переменные не имеют никаких ссылок на конкретную целевую цель, и вы хотите заставить их расширяться только один раз, вы можете сделать что-то вроде:

CXXFLAGS_1 := -Wall
CXXFLAGS_2 := -Wextra

GROUP_1 := a.o b.o
GROUP_2 := c.o

a.out: $(GROUP_1) $(GROUP_2)
$(GROUP_1): CXXFLAGS := $(CXXFLAGS_1)
$(GROUP_2): CXXFLAGS := $(CXXFLAGS_2)
...