Используйте родительский 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

Нерекурсивная версия немного сложнее, но я добавлю ее, если вы игра...

Другие вопросы по тегам