我正在构建需要多种变体的固件二进制文件。代码中有#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
目标名称中包含标志。如何用一个从目标名称中提取标志的规则替换最后三个规则(这些规则快速相乘)?
还是我走疯了路线,需要重新考虑我的策略?
答案 0 :(得分:1)
这是一个很开放的问题,通常在StackOverflow上不被批准。但是,为了帮助您起步:
首先,最好构建您的makefile,以将所有生成的按目标文件放置在每个目标的单独目录中。生成的公用文件(如果有)可以放在公用目录中。
第二,考虑通过设置变量,然后编写使用这些变量的通用规则来尽可能地定义构建。这样,您就可以通过更改变量的值来创建和修改变体,而不必弄乱复杂的规则。
要实现此目的,您可以看一下Metaprogramming Make博客文章系列(从列出的最后一个开始,这是第一个写的文章),并考虑构造宏名称之类的功能如何帮助您解决问题。
干杯!