一般检查以避免危险的rm';makefile中的

一般检查以避免危险的rm';makefile中的,makefile,Makefile,我有一个Makefile,附加到一个我正在半维护的项目,但最初并没有编写。目前,这个Makefile确实有一个坏习惯,就是在未定义某些变量的情况下,在makeclean上运行“rm*” 例如,它包括: rm$(SOMEDIR)/$(SOMEPREFIX)*和rm$(SOMEPREFIX)* 有几组这样的变量。有没有一种简单的方法可以确保我们不会意外地调用像rm*或rm/*这样的东西 当然,我可以单独检查$SOMEDIR和$SOMEPREFIX的所有组合,但最好做一些更安全的事情,不需要检查每个单

我有一个Makefile,附加到一个我正在半维护的项目,但最初并没有编写。目前,这个Makefile确实有一个坏习惯,就是在未定义某些变量的情况下,在
makeclean
上运行“rm*”

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

有几组这样的变量。有没有一种简单的方法可以确保我们不会意外地调用像
rm*
rm/*
这样的东西

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


有什么想法不需要我重写整件事吗?

通常,您要在
清除
时删除的生成文件列表可以从(珍贵的)源文件列表中计算出来:

ROOTDIR = .
OBJDIR  = objdir
$(SRCS) = $(wildcard *.c)
$(OBJS) = $(patsubst %.c,$(ROOTDIR)/$(OBJDIR)/%.o,$(SRCS))
为了避免灾难性的
makeclean
后果,与不可预测的全局模式相比,更倾向于删除计算文件列表:

clean:
    rm -f $(OBJS)
这比:

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

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

ROOTDIR = .
OBJDIR  = objdir
$(SRCS) = $(wildcard *.c)
$(OBJS) = $(patsubst %.c,$(ROOTDIR)/$(OBJDIR)/%.o,$(SRCS))
为了避免灾难性的
makeclean
后果,与不可预测的全局模式相比,更倾向于删除计算文件列表:

clean:
    rm -f $(OBJS)
这比:

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

@雷诺·帕卡莱是一个更好的解决方案。如果由于某种原因,它不适合您的情况,您可以使用
?=
为变量指定一个值(如果未设置)

例如

或者在顶部放一个错误检查,提示用户正确设置变量。(if中的空字符串触发了else案例)


@雷诺·帕卡莱是一个更好的解决方案。如果由于某种原因,它不适合您的情况,您可以使用
?=
为变量指定一个值(如果未设置)

例如

或者在顶部放一个错误检查,提示用户正确设置变量。(if中的空字符串触发了else案例)


如果变量通常在命令行上定义,则可以在makefile中添加默认值。如果您确实在命令行中定义了这些变量,它们将被覆盖:如果这些变量通常是在包含的另一个makefile中定义的,那么您可以使用
FOO?=bar
语法。这将仅在变量尚不存在时分配它。如果变量通常在命令行上定义,则可以在makefile中添加默认值。如果您确实在命令行中定义了这些变量,它们将被覆盖:如果这些变量通常是在包含的另一个makefile中定义的,那么您可以使用
FOO?=bar
语法。这将仅在变量尚不存在时分配它。