在 DRY 方法中生成目标的调试版本

Generate debug versions of targets in a DRY method

我正在使用 GNUmake,我有一个 makefile,其中定义了一些目标及其各自的依赖项。我想创建这些目标的调试版本,所以我有这个:

TARGET := a b c

all: $(TARGET)

a: a.o e.o
    $(CC) $(CFLAGS) $(INCDIRS) -c $(^) -o $(@)

b: b.o g.o
    $(CC) $(CFLAGS) $(INCDIRS) -c $(^) -o $(@) -pthread

c: f.o c.o
    $(CC) $(CFLAGS) $(INCDIRS) -lm -c $(^) -o $(@)

%.o:    %.c
    $(CC) $(CFLAGS) $(INCDIRS) -c $(^) -o $(@)

这一切都很好,但现在我想创建这些规则的调试版本,但我不想重写规则。我只想向 CFLAGS 变量添加其他标志,例如 -g -DDEBUG 并更改目标的名称。

我试过这个静态规则

$(TARGET:%=debug_%):    %: * #<--- not sure how to specify the dependencies
# CFLAGS += -g -DDEBUG <-- uncommenting this line is an error

这没有用。我希望上面的规则匹配我已经指定的目标,但是向 CFLAGS 添加额外的参数,然后将生成 debug_adebug_bdebug_c 等文件。我是不确定 make 是否可行,但这正是我对此的推理方式。

任何帮助将不胜感激,谢谢

所以我终于找到了合适的解决方案:

DEBUG_TARGET := $(TARGET:%=debug_%)

debug: $(DEBUG_TARGET)

$(DEBUG_TARGET):
debug_%: CFLAGS += -g -DDEBUG
debug_%: %
    @mv $* debug_$*

这将生成每个目标的调试版本,而无需创建单独的规则。

最后一行对我来说是最棒的,它实现了我想要的,而不必重复太多