2016-07-27 142 views
2

我正在使用bash并尝试使用makefile将.ppt中的所有文件复制到.pdf,然后将它们全部添加到存档中。这是我到目前为止的内容如何使用makefile更改所有文件扩展名

.PHONY: all clean 

files = $(wildcard *.ppt) 

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

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

我已经制作的唯一makefile已经用于从1或2个源文件编译程序。不知道如何处理这个问题

+0

哦,是的,你为什么要这样做?为什么不是传统的shell脚本?祝你好运。 – shellter

+0

@shellter我已经做了一个shell脚本。这是作业。我必须创建一个shell脚本和一个makefile,两者完全相同,我不知道如何处理Makefile –

回答

3

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 [email protected] $^ 

现在,你如何创建OBJ文件?对于每一个你需要从.ppt版本复制它。由于您使用的是GNU make(通过使用wildcard等功能可以证明),您可以使用pattern rule来实现此功能;该模式是这样的:

%.pdf : %.ppt 
     cp $< [email protected] 

这种模式告诉make如何从任意文件X.ppt建立一个文件X.pdf,具有cp命令:在这种情况下,自动变量$<[email protected]需要,因为你不知道名。这是一个隐含的规则,因为名称没有明确列出,但由模式隐含。

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