Makefile make中的单独构建配置

Makefile make中的单独构建配置,makefile,Makefile,我有一个生成文件来构建我的项目: CFLAGS := -g -O2 -MD -MP SRCDIR := src OBJDIR := build BINDIR := bin SRC := $(wildcard $(SRCDIR)/*.c) OBJ := $(SRC:$(SRCDIR)/%.c=$(OBJDIR)/%.o) DEPS := $(OBJ:%.o=%.d) all: $(BINDIR)/main $(BINDIR)/main: $(OBJ) | $(BINDIR) $(CC

我有一个生成文件来构建我的项目:

CFLAGS := -g -O2 -MD -MP
SRCDIR := src
OBJDIR := build
BINDIR := bin

SRC := $(wildcard $(SRCDIR)/*.c)
OBJ := $(SRC:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
DEPS := $(OBJ:%.o=%.d)

all: $(BINDIR)/main

$(BINDIR)/main: $(OBJ) | $(BINDIR)
    $(CC) $(CFLAGS) $^ -o $@

$(OBJ): $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
    $(CC) $(CFLAGS) -c $< -o $@

.PHONY: clean distclean
clean: 
    rm -rf $(OBJDIR)
distclean: clean
    rm -rf $(BINDIR)

$(OBJDIR) $(BINDIR):
    mkdir -p $@

-include $(DEPS) 
CFLAGS:=-g-O2-MD-MP
SRCDIR:=src
OBJDIR:=构建
BINDIR:=bin
SRC:=$(通配符$(SRCDIR)/*.c)
OBJ:=$(SRC:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
部门:=$(对象:%.o=%.d)
全部:$(BINDIR)/主要
$(BINDIR)/main:$(OBJ)|$(BINDIR)
$(CC)$(CFLAGS)$^-o$@
$(OBJ):$(OBJDIR)/%.o:$(SRCDIR)/%.c |$(OBJDIR)
$(CC)$(CFLAGS)-c$<-o$@
.假的:干净的
清洁:
rm-rf$(OBJDIR)
清洁:清洁
rm-rf$(宾迪尔)
$(OBJDIR)$(BINDIR):
mkdir-p$@
-包括美元(DEPS)
我计划不时使用valgrind检查我的程序是否存在内存泄漏。但是建议不要使用任何编译器优化

如果我简单地添加了一个带有修改后的
CFLAGS
的目标
valgrind
,项目将无法完全重建。 另一方面,在valgrind检查之后,我必须进行一次distclean,因为一切都将是非优化的


这听起来不太好。如何处理此问题?

对这两种情况使用单独的
OBJDIR
BINDIR
值(并使用
ifeq
等对照
$(MAKECMDGOALS)
)进行检查),或者研究支持将检查/存储编译标志作为目标的先决条件的一部分(解决方案已经存在,但它们很复杂).@EtanReisner如果有人调用
make all valgrind
,那么该怎么办?出错是唯一真正的解决方案,除非您为二进制文件、对象文件等保留两组变量,并利用先决条件继承make target特定变量这一事实,为适当的先决条件目标正确设置它们(并保持实际建筑规则的通用性)。不过,如果您愿意,您完全可以这样做。