Makefile 多个构建变量目标

Makefile 多个构建变量目标,makefile,Makefile,我正在构建需要多种变体的固件二进制文件。对于不同代的电路板、不同的外围设备和不同的参数,代码中有#ifdefs。因此,我有类似于foo REVC LCD EUR.elf的文件名,用于欧洲版的电路板,该电路板有一个LCD,并且是rev。硬件的C语言 我正试图减少makefile中的样板文件。现在,它看起来像这样: all: foo.elf \ foo-DEBUG.elf \ foo-LCD.elf \ foo-LCD-DEBUG.elf \ target_unit_tests.el

我正在构建需要多种变体的固件二进制文件。对于不同代的电路板、不同的外围设备和不同的参数,代码中有
#ifdef
s。因此,我有类似于
foo REVC LCD EUR.elf
的文件名,用于欧洲版的电路板,该电路板有一个LCD,并且是rev。硬件的C语言

我正试图减少makefile中的样板文件。现在,它看起来像这样:

all: foo.elf \
  foo-DEBUG.elf \
  foo-LCD.elf \
  foo-LCD-DEBUG.elf \
  target_unit_tests.elf

foo%elf: \
  bar.ao \
  baz.ao \
  banana.ao

target_unit_tests.elf:  \
  bar.ao \
  bar_tests.ao \
  baz.ao \
  baz_tests.ao\
  banana.ao \
  banana_tests.ao

# linker
%.elf: %.ao startup_stm32f0xx.ao system_stm32f0xx.ao
    $(ARM_CC) $(ARM_FLAGS) $other_arguments -o $@ $^

# compiler, general case
%.ao: %.c
    $(ARM_CC) $(ARM_CPPFLAGS) $(ARM_FLAGS) $(CFLAGS) -c -o $@ $<

# compiler, build variants for `foo'
foo-%.ao: foo.c
    $(ARM_CC) $(ARM_CPPFLAGS) $(ARM_FLAGS) $(CFLAGS) -c -o $@ $<

# combinatorial explosion
foo-DEBUG.ao: ARM_CPPFLAGS += -DDEBUG
foo-LCD.ao: ARM_CPPFLAGS += -DLCD
foo-LCD-DEBUG: ARM_CPPFLAGS += -DLCD -DDEBUG
all:foo.elf\
foo-DEBUG.elf\
foo-LCD.elf\
foo-LCD-DEBUG.elf\
target\u unit\u tests.elf
foo%elf:\
巴澳\
巴扎\
芭蕉
target_unit_tests.elf:\
巴澳\
巴鲁测试公司\
巴扎\
巴兹奥\
芭蕉\
芭蕉
#链接器
%.elf:%.ao启动\u stm32f0xx.ao系统\u stm32f0xx.ao
$(ARM\u CC)$(ARM\u标志)$其他参数-o$@$^
#编译器,一般情况
%.ao:%.c
$(ARM\U CC)$(ARM\U CPPFLAGS)$(ARM\U FLAGS)$(CFLAGS)-c-o$@$<
#编译器,“foo”的生成变量
foo-%.ao:foo.c
$(ARM\U CC)$(ARM\U CPPFLAGS)$(ARM\U FLAGS)$(CFLAGS)-c-o$@$<
#组合爆炸
foo-DEBUG.ao:ARM_CPPFLAGS+=-DDEBUG
foo-LCD.ao:ARM_CPPFLAGS+=-DLCD
foo-LCD调试:ARM_CPPFLAGS+=-DLCD-DDEBUG
目标名称中包含标志。如何用一个从目标名称提取标志的规则来替换最后三个规则(它们的倍增速度很快)


还是我走上了一条疯狂的道路,需要重新思考我的策略?

这是一个非常开放的问题,在StackOverflow上通常不被认可。但是,为了让您开始:

首先,最好构建makefile,将所有生成的每个目标文件放在每个目标的单独目录中。生成的公共文件(如果有)可以放在公共目录中

第二,考虑尽可能多地通过设置变量来定义生成,然后编写使用这些变量的泛型规则。这将允许您通过更改变量的值来创建和修改变量,而不必弄乱复杂的规则

为了完成这一点,你可以看看博客文章系列(从最后一个列出的,这是第一个写的),并考虑如何构造宏名称可以帮助你的情况。


干杯

再次感谢你的链接。事情进展得相当顺利,直到最后突然变得很糟糕,我没想到!在阅读了你们的元制作帖子后,我对我的问题进行了更具体的编辑。为了补充我的答案,你们可以看看其中的哪个是在考虑元编程和某种项目管理的情况下编写的。这个makefile不正确。没有依赖于
foo DEBUG.ao
等的目标,因此它们永远不会被构建。没有办法构建这些
.ao
文件。目标取决于诸如
bar_tests.ao等先决条件,这些先决条件在任何地方都没有定义为目标。这看起来像是一些基本的东西,但实际上它们是至关重要的,因为如果不了解如何使用这些东西,我们就无法为您提供有关如何构造makefile的建议。一般来说,您希望使用自动变量,如
$@
$。实际上,这是makefile的一个片段,目前正在开发中。我在这个问题上又加了几行,希望能澄清一下。谢谢你的耐心。