多个构建变体目标

时间:2019-09-08 16:24:21

标签: makefile

我正在构建需要多种变体的固件二进制文件。代码中有#ifdef个用于不同版本的开发板,不同的外围设备和不同的参数。因此,对于具有LCD且为rev的欧洲版开发板,我使用的文件名类似foo-REVC-LCD-EUR.elf。 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

目标名称中包含标志。如何用一个从目标名称中提取标志的规则替换最后三个规则(这些规则快速相乘)?

还是我走疯了路线,需要重新考虑我的策略?

1 个答案:

答案 0 :(得分:1)

这是一个很开放的问题,通常在StackOverflow上不被批准。但是,为了帮助您起步:

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

第二,考虑通过设置变量,然后编写使用这些变量的通用规则来尽可能地定义构建。这样,您就可以通过更改变量的值来创建和修改变体,而不必弄乱复杂的规则。

要实现此目的,您可以看一下Metaprogramming Make博客文章系列(从列出的最后一个开始,这是第一个写的文章),并考虑构造宏名称之类的功能如何帮助您解决问题。

干杯!