Дилеммы Makefile и утилиты make

Несколько целей

Будем считать, что отладочная версия лежит в папке debug, а финальная — в release. Разные исполняемые файлы и пути — это две разные цели. А для разных целей нужно хранить объектные файлы под разными именами‐путями. Поэтому не получится создать одно общее правило для перевода всех файлов исходного кода в объектные.

Одна цель

Не будем возиться с разными путями, запишем всё в один файл, а отладочную и финальную версии будем разруливать через флаги компиляции, например, -d DEBUG. Тогда получится создать единое шаблонное правило для перевода всех файлов исходного кода в объектные. Недостаток: приходится отказываться от инкрементальной сборки, от того, для чего создавалась утилита make, потому что при изменении флагов все объектные файлы придётся перестроить заново.

Зависимость файла исходного кода от заголовочников

Заговочные файлы в Makefile нужно прописывать как зависимости для цели. Если внутри заголовочного файла есть ссылка на другой заголовочный файл, а в нём — на третий, то их всех нужно прописывать как зависимость для этой цели. Создание файла с зависимостями — та ещё задача.