makefile - 迭代 Makefile 中的目录列表

标签 makefile directory

我想在多个目录中执行任务,但到目前为止还没有找到“类似 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"

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

关于makefile - 迭代 Makefile 中的目录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13624236/

相关文章:

c++ - Travis-CI Complex Makefile 失败

c - 无法在 automake 步骤上构建 spice

c++ - 在Linux上使用Makefile编译独立的ASIO

makefile - Makefile 中的 .cpp 到 .o 文件

java - 修改后的 list 文件部分不起作用

linux - Bash 脚本 : list all directories EXCEPT specified

用os模块覆盖python文件

python-2.7 - python setup.py 在安装时创建空目录

c++ - 使用 wxWidgets 制作目录中的文件夹列表

reactjs - 基于组件的React-Redux项目目录结构