首页 > 解决方案 > Makefile 如何在删除所有其他目标文件和可执行文件时不删除一个特定的目标文件?

问题描述

现在我有这个命令: ,它通过在我的 shell 中rm -f *.x *.o调用来删除所有的目标文件和可执行文件。make clean但是我有一个特定的目标文件,说a.o我不想删除。我怎么能在不硬编码的情况下做到这一点?请注意,我只能在 C90 下实现它,因为这是一个作业。

标签: shellmakefile

解决方案


首先,不要在clean:规则(或任何其他规则)中发出通配符删除命令。当用户键入make clean时,他们可能会丢失甚至不受构建系统控制的文件。您的构建系统应该只清理它构建的内容。(也就是说,至少对于“常规强度”clean目标;在这里,我们应该承认提供额外目标的广泛实践,即删除编辑器备份文件tags、生成的配置材料等。)

目标文件应该列在一些变量中,比如$(OBJS)应该使用rm -f ... $(OBJS).

如果某个目标文件不被删除,你可以划分东西:

DISPOSABLE_OBJS = ...
PRECIOUS_OBJS = ...
OBJS = $(DISPOSABLE_OBJS) $(PRECIOUS_OBJS)

然后在clean规则中,只需删除$(DISPOSABLE_OBJS).

在 GNU Make 中,您有额外的灵活性,比如rm -f $(filter-out keep1.o keep2.o,$(OBJS))删除所有$(OBJS)除了keep1.okeep2.o.


推荐阅读