使用Makefile
,我将pdf文件转换为txt文件。
我已经实现了一个clean
目标,该目标将删除所有.txt文件。但是,我不想删除源文件,只删除那些已经生成的文件。
示例: 我的文件夹中有以下文件:
pdfsource.pdf
和donotharm.txt
运行我的makefile将创建以下文件:
pdfsource.txt
现在,我的clean
如下所示:
rm -f *.txt
使用make clean
不仅会删除所需的pdfsource.txt
,还会删除donotharm.txt
。
我想我可以使用:.PRECIOUS: donotharm.txt
,但这确实很具体。我想为此提供一个 general 解决方案。
谢谢!
答案 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