我正在开发一些在 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 $@
其中 ACOBJS 是应处于 ARM 模式的输出对象列表,对于 TCOBJS 和 Thumb 模式也是如此。这些列表是按照通常的方式从源列表创建的
ACOBJS = $(ACSRC:.c=.o)
TCOBJS = $(TCSRC:.c=.o)
目前,这会导致构建中的目标文件散布在源树上,这是我特别不希望的。我一直在尝试将其设置为树外构建,但未能使其正常工作。我不一定需要完全摆脱树构建的工作,但我希望至少能够使用一个输出目录,所有中间文件最终都在该目录下。在这些限制下实现这一目标的最佳策略是什么?
我正在考虑的一种选择是使用 automake 或整个 autotools 工具链来构建 makefile。这似乎支持创建我想要的 makefile 类型,但似乎有点矫枉过正。专为便携式构建而设计的自动工具与裸机嵌入式系统(其中主机元组等内容由目标微控制器决定)之间似乎也存在固有的阻抗不匹配。
这有点旧了,但我只是想做同样的事情,这是谷歌的第一次点击。我认为值得分享另一种方法,因为如果您不使用自动工具并且希望能够使用单个命令在任何目录中构建,然后删除该目录,那么这两个答案都不方便。
下面是一个 Makefile 的示例,它引用与包含该 Makefile 的目录相关的文件。
MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
MFD := $(MAKEFILE_DIR)
CXX=g++
CXXFLAGS=-std=c++14 -Wall -Wextra -pedantic -c
test: test.o adjacency_pointers_graph.o
$(CXX) $^ -o $@
%.o: $(MFD)/%.cpp $(MFD)/adjacency_pointers_graph.h
$(CXX) $(CXXFLAGS) $< -o $@
然后进行某种源构建:
mkdir build
cd build
make -f ../Makefile
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)