С помощью (GNU) делают и легко понять правила, более или менее адаптированные из набора правил, который готовит automake:
MKDIR_P = mkdir -p
obj/%.o: src/%.cc
@$(MKDIR_P) $(@D)
$(COMPILE.cc) -o $@ -c $<
obj/example.o : includes/example.hh
Это создаст каталог назначения $(@D)
для каждого объектного файла $@
, и если место назначения уже существует, mkdir -p
все равно завершится с 0 и, таким образом, не прервет набор целевых правил.
С (GNU) make и немного более сложными для понимания, но более эффективными правилами (каталог obj
только mkdir -p
ed один раз):
MKDIR_P = mkdir -p
obj:
@$(MKDIR_P) $@
obj/%.o: src/%.cc | obj
$(COMPILE.cc) -o $@ -c $<
obj/example.o : includes/example.hh
Часть | obj
гарантирует, что целевой объектный файл не будет перестроен только потому, что кто-то добавил или удалил файл в obj/
и, таким образом, изменил метку времени каталога obj
.
Строка $(COMPILE.cc)
была взята в основном из вывода GNU make -p
.
Обратите внимание, что ручное ведение зависимостей заголовка довольно подвержено ошибкам, поэтому оно должно быть автоматически сгенерировано, предпочтительно MadScientist всесторонне спроектированным надежным методом .
Также, если ваш Makefile
использует GNUmakeism, попробуйте переименовать его GNUmakefile
.
С automake вы не можете скомпилировать объектные файлы, помещенные в определенный каталог, но тогда тег automake
для этого вопроса, похоже, был ошибкой.