我想在多个目录中执行任务,但到目前为止还没有找到“类似 makefile”的解决方案。我知道这是一个经常被问到的问题,并且我知道如何解决子 makfiles 等问题,但我正在寻找更简单的东西。
而不是做
copy:
cd module1 && mkdir foo
cd module2 && mkdir foo
cd module3 && mkdir foo
我想要有类似的东西
directories = module1 module2 module3
copy: $(directories)
cd $< && mkdir foo
但这不起作用,因为该配方仅在第一个目录中调用一次。我想出了这个解决方案,它可以工作,但可能不符合 Makefile 的风格:
directories = module1 module2 module3
copy:
for d in $(directories); do cd $$d && mkdir foo && cd ..; done
我怎样才能做得更好?
有很多方法可以做到这一点。
您可以按照 Andrew 的建议进行操作,而无需对前缀进行硬编码:
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"
您还可以生成copy
makefile 中的目标:
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) && :
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)