Это потому, что вы вызываете один номер make
с множеством аргументов, включая последующие команды make
. Вам нужно добавить разделитель команд оболочки между вызовами make. Что-то вроде этого будет работать:
all:
$(foreach c,$(ALLMAKES),$(MAKE) -C $(c) &&) true
Во втором взгляде есть другие проблемы с вашим make-файлом. Вы не должны устанавливать переменную make с именем PATH
, потому что она будет переопределять переменную $PATH
субголда. Вы можете просто использовать встроенную переменную make $(CURDIR)
, а не работать $(shell pwd)
. Вам фактически не нужно префиксные каталоги с контуром вообще, потому что запуск $(MAKE) -C ...
не изменяет рабочий каталог shell, просто сделайте, и когда вы сделаете выходы, он будет установлен назад, поэтому вы можете просто использовать относительный путь ,
Также вызывает некоторые проблемы в подписях в цикле. Во-первых, вы уменьшаете количество распараллеливания, которое вы можете получить. Во-вторых, опция -k
не может быть должным образом поддержана (без особых неприятных усилий). Лучший способ справиться с этой проблемой, чтобы воспользоваться тем, что сделать уже знает как построить много целей:
all: $(EFFECTS)
$(EFFECTS):
$(MAKE) -C [email protected]
.PHONY: all $(EFFECTS)
Если у вас есть конкретные вопросы упорядочения между различными подкаталогами, вы можете определить их как скважина:
impl/thing2: impl/thing1
и т. д. Это обеспечивает максимальные возможности параллелизации, сохраняя при этом важный порядок.
Чтобы добавить альтернативные правила, скажем, для clean
, вы можете сделать что-то вроде этого:
CLEAN_EFFECTS := $(addsuffix .clean,$(EFFECTS))
clean: $(CLEAN_EFFECTS)
$(CLEAN_EFFECTS):
$(MAKE) -C $(basename [email protected]) clean
.PHONY: clean $(CLEAN_EFFECTS)
Это хорошо, потому что вы можете также создать единый подкаталог (и все его предпосылки), запустив make impl/thing1
, например. Или очистите их, запустив make impl/thing1.clean
Если у вас их больше, вы также можете получить представление о правилах шаблонов и т. Д., Чтобы избежать повторения этого для каждого типа цели. Это становится более громоздким.
К человеку, который отправил комментарий, но удалил его ... Это не работает, чтобы вызывать ту же команду make из make-файла, что и из оболочки, поэтому вы были полезны ... –
Я удалил свой комментарий, потому что думал Я был на неправильном пути. Я работаю над лучшим ответом ... – Beta