Как в Makefile перечислить папки, в которых находятся исходные файлы? - PullRequest
0 голосов
/ 05 августа 2020

Для моего конкретного случая c у меня есть много папок и подпапок с файлами .v. Я хочу скомпилировать их папка за папкой. Я сделал это:

# find folders and subfolders to work on
DIRS := $(wildcard */)
DIRS += $(shell find $(DIRS) -type d)

# compiler flags
SRC += *.v
COMPILE = $(general_compiler_flags) $(SRC)

# run the compiler
run:
    $(foreach d, $(DIRS), $(shell cd $d && $(COMPILE)))

Но при этом все папки, в которых нет файлов .v, все равно компилируются. Как мне сделать так, чтобы на моем DIRS были только папки, в которых хранятся файлы .v?

1 Ответ

1 голос
/ 05 августа 2020

Использование 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)

И, наконец, мы должны подумать, как избежать бесполезных повторных компиляций, но это уже другая, более сложная история.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...