8

我想在几个目录中执行一项任务,但到目前为止还没有找到“类似makefile”的解决方案。我知道这是一个经常被问到的问题,我知道如何解决子 makfile 等问题,但我正在寻找更简单的东西。

而不是做

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

我怎样才能更好地做到这一点?

4

2 回答 2

6

有很多方法可以做到这一点。

您可以按照 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) && :
于 2012-11-29T20:00:34.113 回答
2

在 Makefiles 中,每当你要创建文件时,以文件名作为目标制定规则,并给出创建目标文件的命令。

copy: module1/foo module2/foo module3/foo

module%/foo:
        mkdir $@

如果你想参数化一点以避免重复,你也可以写类似的东西

MODULE_NUMBERS = 1 2 3

copy: ${MODULE_NUMBERS:%=module%/foo}

module%/foo:
        mkdir $@
于 2012-11-29T16:47:09.653 回答