GNU Make Rebuild, если какой-либо из реквизитов по линии изменился - PullRequest
0 голосов
/ 27 сентября 2018

В настоящее время я сталкиваюсь с проблемой использования gnu make, где у меня есть следующая настройка в make-файле: (только важные части)

all: bin/game

bin/game: obj/main.o
    gcc -o bin/game obj/main.o

obj/main.o: src/main.cpp
    gcc -c src/main.cpp -o obj/main.o

# Don't do anything, just make sure that library.hpp hasn't changed
src/main.cpp: include/library.hpp

# Don't do anything, just make sure that part1 and part2 haven't changed
include/library.hpp: include/library/part1.hpp\
                     include/library/part2.hpp

И в этой длинной спирали реквизитов, которая имеетгораздо больше объектных файлов, исходных файлов и файлов заголовков в реальном проекте, хотя он перестраивает bin/game при обновлении src / main.cpp, когда я обновляю include/library/part1.hpp, include/library/part2.hpp или даже include/library.hpp, это непересобрать bin/game, даже если это зависит от него.

Это потому, что make игнорирует реквизиты src / main.cpp, потому что сам он не изменился?

Я заметил, что перемещение include/library.hpp в реквизиты obj/main.o решило эту конкретную проблему, хотя оно все равно не обновляется при изменении либо include/library/part1.hpp, либо include/library/part2.hpp.

Есть ли способ разделить рецепт на «уровни», как я делаю здесь, чтобы сделать вещи более организованными, вместо того, чтобы перечислить их все в цели?

1 Ответ

0 голосов
/ 27 сентября 2018

src/main.cpp: include/library.hpp указывает make перестроить src/main.cpp при изменении include/library.hpp.Это неверно, так как вы строите obj/main.o.Исправление:

obj/main.o : include/library.hpp

Далее, поскольку вы не строите include/library.hpp или src/main.cpp, их зависимости бесполезны.Исправление:

obj/main.o : include/library.hpp include/library/part1.hpp include/library/part2.hpp

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

obj/main.o: src/main.cpp
    gcc -c src/main.cpp -o obj/main.o -MD -MP
-include obj/main.d # produced by -MD -MP

И удалить эти строки с помощью src/main.cpp : ... и include/library.hpp : ....

Вы можете проверить obj/main.d и просмотреть все файлы obj/main.o зависитon.

В первой сборке вам не нужны зависимости заголовка, потому что он должен собрать все (-include obj/main.d не завершится ошибкой, если obj/main.d не существует).В последующих сборках он использует зависимости, сгенерированные предыдущей сборкой, чтобы решить, что нужно перестраивать.

...