Использование make-функций (особенно shell
) в ваших рецептах не является рекомендуемым способом использования make. Предполагая, что у вас есть простые имена каталогов (без пробелов, без специальных символов), вы можете вместо этого использовать что-то вроде следующего:
VDIRS := $(sort $(foreach d,$(DIRS),$(if $(wildcard $(d)/*.v),$(d),)))
run:
for d in $(VDIRS); do ( cd $$d && $(COMPILE); ); done
Еще большее решение make-i sh будет полагаться на make для итерации по всем исходным каталогам вместо того, чтобы делать это внутри рецепта:
VDIRS := $(sort $(foreach d,$(DIRS),$(if $(wildcard $(d)/*.v),$(d),)))
RUN-VDIRS := $(addprefix run-,$(VDIRS))
.PHONY: run $(RUN-VDIRS)
run: $(RUN-VDIRS)
$(RUN-VDIRS): run-%:
cd $* && $(COMPILE)
И, наконец, мы должны подумать, как избежать бесполезных повторных компиляций, но это уже другая, более сложная история.