如何为make目标创建必要的目录?

时间:2017-07-05 12:10:59

标签: makefile gnu-make

说,在Makefile中,我有以下目标:

EXES=dir1/subdir1/abc dir1/subdir1/def dir1/subdir2/ghi dir1/subdir2/jkl dir2/subdir3/mno dir2/subdir3/pqr

$(EXES)中的每个项目代表要创建的二进制文件。我想确保创建必要的目录(例如:dir1/subdir1dir1/subdir2dir2/subdir3),如果它们不存在的话。

我如何使用gnu-make实现这一目标?

2 个答案:

答案 0 :(得分:1)

使用仅限订单的先决条件:

target: prerequisites | order-only-prerequisites

order-only-prerequisites:
    recipe

他们的食谱只有在它们尚不存在时才会执行。例如:

$(BUILDDIR)/foo.o: src/foo.c | $(BUILDDIR)
    $(CC) $(CFLAGS) -o $@ $<

$(BUILDDIR):
    mkdir -p $@

如果您想从EXES变量的定义中提取要创建的目录列表:

$(EXES): | $(dir $(EXES))

$(dir $(EXES)):
    mkdir -p $@

或者,要为每个目标实例化一个规则:

define DIR_rule
$(1): | $$(dir $(1))
endef
$(foreach e,$(EXES),$(eval $(call DIR_rule,$(e))))

$(dir $(EXES)):
    mkdir -p $@

答案 1 :(得分:-1)

我终于找到了$(dir ...)

的解决方案
EXE_DIRS=$(dir $(EXES))

EXE_DIRS_UNIQUE=$(shell for DIR in $(EXE_DIRS); do echo $$DIR; done | sort | uniq)

$(shell for DIR in $(EXE_DIRS_UNIQUE); do if [ ! -d $$DIR ]; then mkdir -p $$DIR; fi; done)

all: $(EXES)