bash - 如何使用 makefile 更改所有文件扩展名

标签 bash makefile gnu-make file-extension

我正在使用 bash 并尝试使用 makefile 将 .ppt 目录中的所有文件复制到 .pdf,然后将它们全部添加到存档中。这是我目前所拥有的

.PHONY: all clean

files = $(wildcard *.ppt)

OBJ = $(patsubst %.pdf, %.ppt, $(wildcard *.ppt))

clean:
        rm -f lectures.tar.gz *.pdf

到目前为止,我编写的唯一 makefile 已用于从 1 或 2 个源文件编译程序。不确定如何解决这个问题

最佳答案

make 的诀窍在于它从结尾开始,从您要创建的内容开始,然后向后返回到开头,看看发生了什么变化。

那么,最后是什么:您想生产什么?根据您的示例,我们将推断您想要创建一个名为 lectures.tar.gz 的压缩 tar 文件。 .因此,我们需要一个目标:

lectures.tar.gz:

tar 文件中包含什么? PDF 文件,您已经了解如何将其计算为 OBJ变量,所以这些东西必须列为 lectures.tar.gz 的先决条件:

lectures.tar.gz: $(OBJ)

该目标的配方是什么?它应该创建一个具有该名称的 tar 文件,其中包含所有文件。一种方法是这样的:

lectures.tar.gz: $(OBJ)
        tar czf lectures.tar.gz $(OBJ)

另一种方式,使用 automatic variables 更通用, 将是:

lectures.tar.gz: $(OBJ)
        tar czf $@ $^

现在,您如何创建 OBJ文件?对于每一个,您都需要从 .ppt 中复制它版本。由于您使用的是 GNU make(正如您使用 wildcard 等函数所证明的那样),您可以使用 pattern rule为了这;模式是这样的:

%.pdf : %.ppt
        cp $< $@

这个模式告诉 make 如何构建一个文件 X.pdf来自任何文件 X.ppt , 与 cp命令:在本例中为自动变量 $<$@是必需的,因为你不知道名字。这是一个隐式规则,因为名称没有明确列出,但由模式暗示。

现在如何构建 .ppt文件?你不需要,因为它们是源文件,所以你完成了!

关于bash - 如何使用 makefile 更改所有文件扩展名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38622016/

相关文章:

c - 如何在 "No such file or directory"错误后停止 make(在 makefile 中)?

c++ - 尝试使用 tensorflow 的 C++ API 时出错

gnu-make - gnu make 将许多文件复制到一个位置

linux - 在 Makefile 中,如何验证是否安装了所需的 Linux 软件包

python - 表达式 awk,python 中的字符无效

windows - 用 'sed' 修改后是否需要关闭文件?

makefile - 你如何实现一个记住最后一个构建目标的 Makefile?

c - 如何编写单个makefile,c文件在src中,h文件在inc文件夹中?

bash - 如何将 Bash 命令的输出分配给变量?

linux - 编写多个 sed 命令的更简洁的方法?