Созданный вами make-файл предполагает, что команды для цели $(subdirs)
будут выполняться два раза: один раз для x
и второй раз для y
. К сожалению, это не так, как работают make-файлы и зависимости. Команды для цели запускаются не более одного раза при каждом вызове make (за исключением необычных обстоятельств, таких как изменение make-файлов во время запуска make).
Следующее будет работать в системах UNIX-стиля. Он просто запускает подкаталог делает в цикле, один за другим:
subdirs = a b c
.PHONY: build
build:
for dir in $(subdirs); do \
$(MAKE) -f $$dir/makefile prepare; \
$(MAKE) -f $$dir/makefile build; \
done
Если вам нужно построить подкаталоги параллельно, вы можете использовать следующее:
subdirs = a b c
.PHONY: build
build: $(addprefix build-,$(subdirs))
define submake-rule
.PHONY: build-$(1)
build-$(1):
$(MAKE) -f $(1)/makefile prepare
$(MAKE) -f $(1)/makefile build
endef
$(foreach dir,$(subdirs),$(eval $(call submake-rule,$(dir))))
Это определяет правило build-<dirname>
для каждого элемента в $(subdirs)
и делает цель build
зависимой от всех из них. В качестве дополнительного бонуса, это также переносимо на Windows, не требуя использования оболочки Cygwin bash или аналогичной. Недостатком является то, что это немного сложнее понять.