在 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_a
、debug_b
、debug_c
等文件。我是不确定 make 是否可行,但这正是我对此的推理方式。
任何帮助将不胜感激,谢谢
所以我终于找到了合适的解决方案:
DEBUG_TARGET := $(TARGET:%=debug_%)
debug: $(DEBUG_TARGET)
$(DEBUG_TARGET):
debug_%: CFLAGS += -g -DDEBUG
debug_%: %
@mv $* debug_$*
这将生成每个目标的调试版本,而无需创建单独的规则。
最后一行对我来说是最棒的,它实现了我想要的,而不必重复太多
我正在使用 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_a
、debug_b
、debug_c
等文件。我是不确定 make 是否可行,但这正是我对此的推理方式。
任何帮助将不胜感激,谢谢
所以我终于找到了合适的解决方案:
DEBUG_TARGET := $(TARGET:%=debug_%)
debug: $(DEBUG_TARGET)
$(DEBUG_TARGET):
debug_%: CFLAGS += -g -DDEBUG
debug_%: %
@mv $* debug_$*
这将生成每个目标的调试版本,而无需创建单独的规则。
最后一行对我来说是最棒的,它实现了我想要的,而不必重复太多