我想在几个目录中执行一个任务,但到目前为止还没有找到“类似makefile”的解决方案。我知道这是一个经常被问到的问题,我知道如何为子makfiles等解决它,但我正在寻找更简单的东西。
而不是做
copy:
cd module1 && mkdir foo
cd module2 && mkdir foo
cd module3 && mkdir foo
我想要像
这样的东西directories = module1 module2 module3
copy: $(directories)
cd $< && mkdir foo
但这不起作用,因为只有第一个目录才调用一次。我想出了这个有效的解决方案,但可能不是Makefiles的风格:
directories = module1 module2 module3
copy:
for d in $(directories); do cd $$d && mkdir foo && cd ..; done
我怎样才能更好地做到这一点?
答案 0 :(得分:6)
有很多方法可以做到这一点。
你可以做安德鲁所建议的,不需要硬编码前缀:
directories = module1 module2 module2
%/foo: ; mkdir -p -- "$@"
copy: $(addsuffix /foo,$(directories))
给出了
$ make -n copy
mkdir -p -- "module1/foo"
mkdir -p -- "module2/foo"
mkdir -p -- "module3/foo"
您还可以从makefile生成copy
目标:
directories = module1 module2 module2
define copy-target
copy:: ; cd $1 && mkdir foo
endef
$(foreach dir,$(directories),$(eval $(call copy-target,$(dir))))
这给出了:
$ make -n copy
cd module1 && mkdir foo
cd module2 && mkdir foo
cd module3 && mkdir foo
您也可以生成命令,而不是目标:
directories = module1 module2 module2
copy: ; $(foreach dir,$(directories),(cd $(dir) && mkdir foo) &&) :
导致
$ make -n copy
(cd module1 && mkdir foo) && (cd module2 && mkdir foo) && (cd module3 && mkdir foo) && :
答案 1 :(得分:2)
在Makefile中,无论何时想要创建文件,都要创建一个以文件名作为目标的规则,然后给出命令来创建目标文件。
copy: module1/foo module2/foo module3/foo
module%/foo:
mkdir $@
如果您想稍微参数化以避免重复,您还可以编写类似
的内容MODULE_NUMBERS = 1 2 3
copy: ${MODULE_NUMBERS:%=module%/foo}
module%/foo:
mkdir $@