迭代Makefile中的目录列表

Rob*_*ert 7 directory makefile

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

而不是做

copy: 
     cd module1 && mkdir foo
     cd module2 && mkdir foo
     cd module3 && mkdir foo
Run Code Online (Sandbox Code Playgroud)

我想有类似的东西

directories = module1 module2 module3

copy: $(directories)
     cd $< && mkdir foo
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为只有第一个目录才调用一次.我想出了这个有效的解决方案,但可能不是Makefiles的风格:

directories = module1 module2 module3

copy: 
     for d in $(directories); do cd $$d && mkdir foo && cd ..; done
Run Code Online (Sandbox Code Playgroud)

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

Ide*_*lic 6

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

你可以做安德鲁所建议的,不需要硬编码前缀:

directories = module1 module2 module2

%/foo: ; mkdir -p -- "$@"

copy: $(addsuffix /foo,$(directories))
Run Code Online (Sandbox Code Playgroud)

这使

$ make -n copy
mkdir -p -- "module1/foo"
mkdir -p -- "module2/foo"
mkdir -p -- "module3/foo"
Run Code Online (Sandbox Code Playgroud)

您还可以copy从makefile 生成目标:

directories = module1 module2 module2

define copy-target
  copy:: ; cd $1 && mkdir foo
endef

$(foreach dir,$(directories),$(eval $(call copy-target,$(dir))))
Run Code Online (Sandbox Code Playgroud)

这给出了:

$ make -n copy
cd module1 && mkdir foo
cd module2 && mkdir foo
cd module3 && mkdir foo
Run Code Online (Sandbox Code Playgroud)

您也可以生成命令,而不是目标:

directories = module1 module2 module2

copy: ; $(foreach dir,$(directories),(cd $(dir) && mkdir foo) &&) :
Run Code Online (Sandbox Code Playgroud)

结果

$ make -n copy
(cd module1 && mkdir foo) && (cd module2 && mkdir foo) && (cd module3 && mkdir foo) && :
Run Code Online (Sandbox Code Playgroud)