通用检查以避免makefile

时间:2017-12-11 16:27:39

标签: makefile

我有一个Makefile,附加到我正在进行半维护的项目中,但最初没有编写。目前,当没有定义某些变量时,这个Makefile确实有一个在make clean运行时运行“rm *”的恶习。

它包括,例如:  rm $(SOMEDIR)/$(SOMEPREFIX)*rm $(SOMEPREFIX)*

有这样的几组变量。是否有一种简单的方法可以确保我们不会意外地调用rm *rm /*之类的内容?

当然,我可以单独检查$SOMEDIR$SOMEPREFIX的所有组合,但做一些不需要每个变量/命令的更安全的东西会很好检查。

任何不涉及我的想法都会重写整个事情?

2 个答案:

答案 0 :(得分:3)

您希望在make clean上删除的生成文件列表可以从(珍贵的)源文件列表中计算出来:

ROOTDIR = .
OBJDIR  = objdir
$(SRCS) = $(wildcard *.c)
$(OBJS) = $(patsubst %.c,$(ROOTDIR)/$(OBJDIR)/%.o,$(SRCS))

为了避免灾难性的make clean后果,更喜欢删除不可预测的glob模式下的计算文件列表:

clean:
    rm -f $(OBJS)

远胜于:

clean:
    rm -f $(ROOTDIR)/$(OBJDIR)/*

答案 1 :(得分:1)

@Renaud Pacalet是一个更好的解决方案。如果由于某种原因它不适合您的情况,您可以使用?=为变量赋值,否则将使用ROOTDIR ?= /tmp/nonexistant OBJDIR ?= NOPE

E.g。

if

或者只是在顶部进行错误检查以提示用户适当地设置变量。 (else中的空字符串会触发$(if $(ROOTDIR),,$(error Please set ROOTDIR)) $(if $(OBJDIR),,$(error Please set OBJDIR)) 情况)

cPickle.dumps(obj, protocol=cPickle.HIGHEST_PROTOCOL)