【问题标题】:How to change all file extensions with a makefile如何使用 makefile 更改所有文件扩展名
【发布时间】:2016-07-27 19:52:33
【问题描述】:

我正在使用 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 个源文件编译程序。不知道如何处理这个

【问题讨论】:

  • 哦,是的,why 你想这样做吗?为什么不是传统的 shell 脚本?祝你好运。
  • @shellter 我已经制作了一个可以工作的 shell 脚本。这是为了家庭作业。我必须创建一个 shell 脚本和一个 makefile,它们都做同样的事情,我不知道如何处理 Makefile

标签: bash makefile gnu-make file-extension


【解决方案1】:

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

那么,最后是什么:你想生产什么?根据您的示例,我们将推断您想要创建一个名为 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 如何使用 cp 命令从任何文件 X.ppt 构建文件 X.pdf:在这种情况下,自动变量 $&lt;$@ 是必需的,因为您不知道名字。这是一个隐式规则,因为名称没有明确列出,而是由模式隐含。

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

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多