Makefile 迭代生成文件中的目录列表

Makefile 迭代生成文件中的目录列表,makefile,directory,Makefile,Directory,我想在几个目录中执行一个任务,但到目前为止还没有找到“makefile-like”解决方案。我知道这是一个经常被问到的问题,我知道如何解决它的子文件等,但我正在寻找更简单的东西 而不是做 copy: cd module1 && mkdir foo cd module2 && mkdir foo cd module3 && mkdir foo 我想要点像这样的 directories = module1 module

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

而不是做

copy: 
     cd module1 && mkdir foo
     cd module2 && mkdir foo
     cd module3 && mkdir foo
我想要点像这样的

directories = module1 module2 module3

copy: $(directories)
     cd $< && mkdir foo
MODULE_NUMBERS = 1 2 3

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

module%/foo:
        mkdir $@

如何才能更好地执行此操作?

在Makefiles中,每当您要创建文件时,请使用文件名作为目标,并发出创建目标文件的命令

copy: module1/foo module2/foo module3/foo

module%/foo:
        mkdir $@
如果您想将其参数化一点以避免重复,您还可以编写如下代码

directories = module1 module2 module3

copy: $(directories)
     cd $< && mkdir foo
MODULE_NUMBERS = 1 2 3

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

module%/foo:
        mkdir $@

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

您可以按照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"
您还可以从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) && :

谢谢不幸的是,我无法应用您的解决方案,因为我无法使用通配符(“您的示例中的module%”来寻址相关目录,因为我有许多具有相同前缀的目录,并且希望使用变量(“我的示例中的directories”)来仅选择其中的一些目录。顺便说一句:我使用“mkdir”作为一个示例命令(实际上,我不想创建目录,而是将文件从每个目录上载到服务器),因此无论手头的任务是什么,解决方案都应该有效。谢谢,这很有效。我选择了解决方案2(从makefile生成
copy
目标),因为它没有绑定到
mkdir
案例。不幸的是,它与使用shell for循环没有太大区别,但这并不重要。