说,在Makefile
中,我有以下目标:
EXES=dir1/subdir1/abc dir1/subdir1/def dir1/subdir2/ghi dir1/subdir2/jkl dir2/subdir3/mno dir2/subdir3/pqr
$(EXES)
中的每个项目代表要创建的二进制文件。我想确保创建必要的目录(例如:dir1/subdir1
,dir1/subdir2
,dir2/subdir3
),如果它们不存在的话。
我如何使用gnu-make实现这一目标?
答案 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)