meg*_*eak 9 build-process makefile gnu-make
我正在研究一些在ARM上运行的裸机嵌入式代码,因此必须处理整个ARM与THUMB模式的区别.当前构建系统使用静态模式规则来确定是以ARM还是THUMB模式编译文件.
$(ACOBJS) : %.o : %.c
@echo
$(CC) -c $(CFLAGS) $(AOPT) -I . $(IINCDIR) $< -o $@
$(TCOBJS) : %.o : %.c
@echo
$(CC) -c $(CFLAGS) $(TOPT) -I . $(IINCDIR) $< -o $@
Run Code Online (Sandbox Code Playgroud)
其中ACOBJS是应该处于ARM模式的输出对象列表,对于TCOBJS和Thumb模式是相同的.这些列表是以通常的方式从源列表创建的
ACOBJS = $(ACSRC:.c=.o)
TCOBJS = $(TCSRC:.c=.o)
Run Code Online (Sandbox Code Playgroud)
目前,这导致构建中的目标文件散布在源树上,我并不特别希望这样.我一直试图在树构建中设置它,但却无法使其工作.我不一定需要充分利用树构建工作,但我希望至少能够使用输出目录,在该目录下所有中间文件最终都会运行.在这些限制条件下实现这一目标的最佳策略是什么?
我正在考虑的一个选项是使用automake或整个autotools工具链来构建一个makefile.这似乎支持创建我想要的makefile类型,但看起来有点矫枉过正.设计用于便携式构建的自动工具和裸机嵌入式系统之间似乎存在固有的阻抗不匹配,其中主机元组之类的东西由目标微观元素决定.
automake如果您使用automake,您几乎就使用了整个自动工具。automake没有 就无法工作autoconf。
Makefile生成的 s支持automake源外构建和交叉编译,因此您应该能够创建子目录arm/以及thumb/run ../configure --host=arm-host-prefixinarm/和 run ../configure --host=thumb-host-prefixin thumb/。(我不知道您为每个编译器使用的实际主机元组。)
make由于您使用的是 GNUMake,因此您可以执行以下操作:
ACOBJS := $(addprefix arm/,$(ACSRC:.c=.o))
TCOBJS := $(addprefix thumb/,$(TCSRC:.c=.o))
Run Code Online (Sandbox Code Playgroud)
使用类似此答案的内容来确保arm/和thumb/目录(以及任何子目录)存在。