在Makefile上,如何列出源文件所在的文件夹



对于我的特定情况,我有许多包含.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文件的文件夹?

在食谱中使用make函数(尤其是shell(的方式不是推荐使用make的方式。假设您有简单的目录名(没有空格,没有特殊字符(,您可以使用以下内容:

VDIRS := $(sort $(foreach d,$(DIRS),$(if $(wildcard $(d)/*.v),$(d),)))
run:
for d in $(VDIRS); do ( cd $$d && $(COMPILE); ); done

一个更加make ish的解决方案将依赖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)

最后,我们应该考虑如何避免无用的重新编译,但这是另一个更复杂的故事。

相关内容

最新更新