我有一个Makefile,附加到我正在进行半维护的项目中,但最初没有编写。目前,当没有定义某些变量时,这个Makefile确实有一个在make clean
运行时运行“rm *”的恶习。
它包括,例如:
rm $(SOMEDIR)/$(SOMEPREFIX)*
和rm $(SOMEPREFIX)*
有这样的几组变量。是否有一种简单的方法可以确保我们不会意外地调用rm *
或rm /*
之类的内容?
$SOMEDIR
和$SOMEPREFIX
的所有组合,但做一些不需要每个变量/命令的更安全的东西会很好检查。
任何不涉及我的想法都会重写整个事情?
答案 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)