Во-первых, я не уверен, почему вы используете сложную функцию shell
; почему бы просто:
branches := $(wildcard */.)
Или, если вы не хотите, чтобы /.
в конце:
branches := $(patsubst %/.,%,$(wildcard */.))
Во-вторых, причина, по которой ваша вторая попытка не работает что нельзя создавать шаблонное правило без рецепта. См. Правила отмены паттернов .
Вместо этого вы можете использовать специальную цель .DEFAULT
. Это выглядело бы примерно так:
branch-%:
-${MAKE} -C $* $(CMD)
.DEFAULT:
@$(MAKE) CMD=$@ ${addprefix branch-,${branches}}
При этом используется рекурсивная компоновка, и она ведет себя немного иначе, чем ваш оригинал.
Я не уверен, что понимаю ваш второй пункт о -j
, GNU make (если вы не используете действительно старую версию) может связываться между всеми субмаками, чтобы гарантировать, что они запускают столько заданий, но не больше, чем вы запрашивали.
О, я забыл, есть еще одно очевидное способ сделать это, если вы не хотите использовать .DEFAULT
и рекурсию:
$(MAKECMDGOALS): $(addprefix branch-,$branches))