在BHuman中,我们编译代码的时候,会在Make/Linux目录下输入make,然后就能够开始进行项目的编译,这主要是依靠于该文件目录下的makefile文件。
makefile具体实现
该文件具体内容如下:
MARE := ../../Util/SimRobot/Util/mare/Linux/bin/mare
CONFIG ?= Develop
QTINCLUDE = `for d in $(shell find /usr/include /usr/local/include -name qt5 \( -type l -or -type d \)); do [ -d $$d/QtCore ] && echo $$d; done | head -n1`
CLANGINCLUDE = `for d in $(shell clang++ -c -v -E - </dev/null 2>&1 | sed -n -e '/here:/,/^End/{/here:/d; /^End/d; p}'); do [ -f $$d/xmmintrin.h ] && echo $$d; done | head -n1`
SSSE3 = `(grep ssse3 </proc/cpuinfo ; echo 'ssse3=false') | head -1 | sed 's/.*ssse3 .*/ssse3=true/'`
AVX2 = `(grep avx2 </proc/cpuinfo ; echo 'avx2=false') | head -1 | sed 's/.*avx2 .*/avx2=true/'`
FLAGS = $(SSSE3) $(AVX2)
.PHONY: all clean
all:
@$(MARE) config=$(CONFIG) qtinclude=$(QTINCLUDE) clanginclude=$(CLANGINCLUDE) $(FLAGS)
clean:
@$(MARE) clean config=$(CONFIG)
%:
@$(MARE) $@ config=$(CONFIG) qtinclude=$(QTINCLUDE) clanginclude=$(CLANGINCLUDE) $(FLAGS)
在具体看代码之前,首先要明确一点,在BHuman中的编译和一般的工程文件编译不同,它并不是把各个文件的编译规则统一都写在makefile中,而是利用了第三方工具Mare,这个工具本身在BHuman中是以执行文件的格式放在代码里的,主要就是用来进行项目的编译。
接下来我们逐行分析:
- 第一行定义了变量MARE,用来记录刚刚提到的第三方工具Mare的可执行文件路径
- 第二行定义了编译的版本,或者说方式,不同的编译方式的差异主要会体现在最终的编译结果上,比如是否编译测试、仿真功能等
- 第三行和第四行分别定义了qt和clang这两个依赖库的环境变量,用于编译
- 五到七行是PC端的一些硬件配置信息,比如CPU指令集等
- 定义all和clean两个伪目标,相当于标签,可以用于索引对应的命令
- 后三行都是对Mare这个第三方库的调用,根据你在终端的输入来执行命令,比如make clean 或 make,分别对应着 clean 和 all 后的 命令。