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

时间:2016-09-22 14:55:52

标签: makefile pattern-matching target

我正在使用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 $(@)

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

我试过这个静态规则的东西

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

这不起作用。我希望上面的规则与我已经指定的目标相匹配,但是向CFLAGS添加其他参数,然后生成debug_adebug_bdebug_c等文件。我是不确定这是否可以使用make,但这只是我推理的方式。

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

1 个答案:

答案 0 :(得分:0)

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

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

debug: $(DEBUG_TARGET)

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

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

最后一行是我的最佳点,这完成了我想要的,而不必重复太多