清理:仅删除已生成的文件

时间:2018-07-02 10:37:31

标签: file makefile generated

使用Makefile,我将pdf文件转换为txt文件。

我已经实现了一个clean目标,该目标将删除所有.txt文件。但是,我不想删除源文件,只删除那些已经生成的文件。

示例: 我的文件夹中有以下文件:

pdfsource.pdfdonotharm.txt

运行我的makefile将创建以下文件:

pdfsource.txt

现在,我的clean如下所示:

rm -f *.txt

使用make clean不仅会删除所需的pdfsource.txt,还会删除donotharm.txt

我想我可以使用:.PRECIOUS: donotharm.txt,但这确实很具体。我想为此提供一个 general 解决方案。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以在make变量中列出生成的文件,并使用它仅清除以下内容:

PDF  := $(wildcard *.pdf)
TEXT := $(patsubst %.pdf,%.txt,$(PDF))
...
clean:
    rm -f $(TEXT)

或者,如果您希望使用更紧凑(但可读性稍差)的表格:

clean:
    rm -f $(patsubst %.pdf,%.txt,$(wildcard *.pdf))

当然,仅当没有{foo.pdf,foo.txt}对您要保留foo.txt才能被make clean删除的对时,此方法才有效。

注意:在这种情况下,使用make变量通常是一个好主意,因为它们可以在各种规则之间共享。示例:

PDF  := $(wildcard *.pdf)
TEXT := $(patsubst %.pdf,%.txt,$(PDF))

.PHONY: all clean

all: $(TEXT)

$(TEXT): %.txt: %.pdf
    pdftotext $< $@

clean:
    rm -f $(TEXT)

答案 1 :(得分:0)

另一种方法:“ make -nps”为您提供所有关于依赖项的make的元数据。对于任何中间文件,它将打印

filename: ...

因此,您可以使用通用的“清除”规则完全删除此类文件:

clean:; MAKEFLAGS= ${MAKE} -j1 -spinf $(word 1,${MAKEFILE_LIST}) \
| sed -n '/^# I/,$${/^[^\#\[%.][^ %]*: /s/:.*//p;}; 1s|.*|${clean}|p' | xargs rm -rf

第一行处理默认值以外的其他makefile的使用(makefile,GNUmakefile,Makefile) 在“ sed”命令中:

/^# I/,$ 

...选择具有相关性的make元数据区域。

/^[^\#\[%.][^ %]*: /

...过滤掉注释,隐式规则和没有依赖性的文件(尾随空格)。它不会过滤掉虚假目标;那好吧。 最后:

1s|.*|${clean}|p

为“清除”添加任何明确的目标-您知道make不会;例如

clean +=  tmpdir/*  *.gcda