Почему .PHONY не работает в этой ситуации? - PullRequest
2 голосов
/ 25 января 2011

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

 1: all: prog
 2:
 3: .PHONY: prog
 4: prog: prog.exe
 5:
 6: prog.exe: lib prog.o
 7:         touch prog.exe
 8:
 9: prog.o: prog.c
10:         touch prog.o
11:
12: .PHONY: lib
13: lib: lib.so
14:
15: lib.so: lib.o
16:         touch lib.so
17:
18: lib.o: lib.c
19:         touch lib.o
20:
21: .PHONY: clean
22: clean:
23:         rm *.so *.o *.exe

По какой-то причине в этом примере prog.exe создается каждый раз. Если я заменю lib в строке 6 на lib.so, то это сработает. Все же кажется, что я должен быть в состоянии сделать то, что я пытаюсь здесь. Что-то фундаментальное, что я упускаю?

1 Ответ

5 голосов
/ 25 января 2011

Из онлайнового руководства по сборке GNU:

Лживая цель не должна быть предпосылкой для реального файла цели;если это так, его рецепт будет запускаться каждый раз, когда make будет обновлять этот файл.До тех пор, пока фальшивая цель никогда не является обязательным условием реальной цели, рецепт фальшивой цели будет выполняться только в том случае, если фальшивая цель является указанной целью (см. «Аргументы для определения целей»).по крайней мере, объясняет, что вы видите.Поскольку prog.exe зависит от lib, вашей фальшивой цели для сбора библиотек, правило lib срабатывает, и, следовательно, prog.exe «устарело» и обновляется.

Похоже,Вы должны быть более явными о ваших зависимостях.Возможно, вам было бы интересно поместить их в переменную, чтобы немного упростить управление несколькими библиотеками?Например:

LIBS = lib.so

all: libs progs

.PHONY: progs libs clean

progs: prog.exe

prog.exe: $(LIBS) prog.o
    touch prog.exe

# etc.
libs: $(LIBS)

lib.so: lib.o
    touch lib.so

# and so on

В приведенном выше примере я также изменил имена фальшивых целей на progs и libs, которые, по моему опыту, являются более распространенными.В этом случае цель libs - это просто удобство для построения всех библиотек, а не действительная зависимость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...