makefile - 重新创建目录结构并使用 gnu make 递归处理每个文件

标签 makefile

我有一个像这样的目录树:

├── dir_a
│   └── file_1.txt
├── dir_b
│   └── dir_c
│       ├── file_2.txt
|       └── file_3.txt
└── file_4.txt

我想镜像此目录结构以保存处理每个文本文件的命令的结果。即,输出如下所示:

├── build
│   ├── dir_a
│   │   └── processed_file_1.txt
│   ├── dir_b
│   │   └── dir_c
│   │       ├── processed_file_2.txt
│   |       └── processed_file_3.txt
│   └── processed_file_4.txt
├── dir_a
│   └── file_1.txt
├── dir_b
│   └── dir_c
│       ├── file_2.txt
|       └── file_3.txt
└── file_4.txt

我不太擅长 Makefile,所以我的问题是:如何获得 Makefile 来重新创建目录结构并递归处理所有文本文件以将它们放入构建目录中的正确位置?当输入文件发生变化时,我将重复运行此命令,因此不处理未更改文件的 Makefile 似乎是正确的方法。

更新: 我还应该提到,新的输入文件将被频繁添加,因此我不希望 Makefile 明确命名它们。

最佳答案

如果您使用具有不同后缀的词干而不是插入“processed_”字符串会更容易,但这里有一个适合我的示例:

OUTPUTS := build/dir_a/processed_file_1.txt       \
           build/dir_b/dir_c/processed_file_2.txt \
           build/dir_b/dir_c/processed_file_3.txt \
           build/processed_file_4.txt

all: $(OUTPUTS)

.SECONDEXPANSION:
$(OUTPUTS): build/% : $$(subst processed_file_,file_,%)
    mkdir -p $(dir $@)
    cp $< $@

clean:
    rm -rf build

您可以通过更改文件名的末尾而不是开头来消除 .SECONDEXPANSION 的复杂性:

OUTPUTS := build/dir_a/file_1.out       \
           build/dir_b/dir_c/file_2.out \
           build/dir_b/dir_c/file_3.out \
           build/file_4.out

all: $(OUTPUTS)

$(OUTPUTS) : build/%.out : %.txt
    mkdir -p $(dir $@)
    cp $< $@

clean:
    rm -rf build

关于makefile - 重新创建目录结构并使用 gnu make 递归处理每个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11348903/

相关文章:

android - 使用 mmm 编译 Android 并制作 snod

makefile - 在创建顶级目标时告诉 'make' 忽略依赖项

c - 交叉编译问题

linux - Makefile.am ...那些是什么?

linux - rpmbuild 和签名的可执行文件

linux - 是否有一个 makefile 选项可以只删除 obj 文件但保持目标不变?

c# - Arquivo 制作意大利面的入口文件

makefile - 使用 'make run' 执行

c++ - 使用 MSYS : X11 not found 构建 GLEW

c - 对 `__gmpz 和 makefile 的 undefined reference