Используйте родительский Makefile для компиляции подкаталога
1-я линия моего Makefile
является:
включить def.mk
Это дает мне гибкость, чтобы определить зависимости внутри def.mk
и оставить Makefile
настолько общий, насколько это возможно.
В настоящее время я определяю def.mk для каждого из подмодулей. Но я дублирую весь Makefile.
- Можно ли иметь только один
Makefile
в родительском каталоге и каждый подкаталог иметь толькоdef.mk
такой, что родительский каталогMakefile
используется для составления подкаталога? - Или возможно ли иметь минимальный
Makefile
под каждым из подкаталогов, который в свою очередь использует родительскийMakefile
- Так же
Makefile
нужно использоватьdef.mk
определяется в соответствующих каталогах, а не в родительском.
PS: К сожалению, я не могу позволить себе роскошь automake
инструменты. Эти Makefiles должны быть сделаны вручную!:(
PPS: Кроме того, у меня есть подкаталоги глубиной более одного уровня.
1 ответ
Есть несколько способов сделать это.
Предположим, у нас есть main/Makefile
, main/subOne/def.mk
, main/subTwo/def.mk
а также main/subOne/subThree/def.mk
и различные исходные и заголовочные файлы (foo.cc
а также bar.h
).
Сначала мы должны решить, как Make будет знать, какие целевые объекты и какие подкаталоги использовать в каждом каталоге. Самый безопасный способ - перечислить их в соответствующих def.mk
файлы.
Тогда большой вопрос: рекурсивный или нерекурсивный?
Рекурсивный Make (когда Make выполняет другой экземпляр Make) грубый, но эффективный. Это приводит к более простым make-файлам, но не позволяет Make полностью использовать свою обработку зависимостей, так что процесс сборки может быть неэффективным. (По этой причине многие считают Recursive Make просто плохим, но я думаю, что он имеет свое применение.)
Makefile
:
SUBDIRS := subOne subTwo
-include def.mk
all: $(SUBDIRS)
.PHONY: $(SUBDIRS)
$(SUBDIRS):
@make -C $@ -f ../$(STACK)Makefile STACK=../$(STACK)
Обратите внимание, что переменная STACK
(или как вы хотите это называть) отслеживает путь обратно до make-файла.
subOne/def.mk
:
SUBDIRS := subThree
all: alpha.o
alpha.o: alpha.h
subTwo/def.mk
:
SUBDIRS :=
all: beta.o
beta.o: beta.h
subOne/subThree/def.mk
:
SUBDIRS :=
all: gamma.o delta.o
gamma.o: gamma.h
delta.o: delta.h gamma.h
Нерекурсивная версия немного сложнее, но я добавлю ее, если вы игра...