目标:
使用交叉混合编译(hybrid cross-compiling)从源代码编译龙芯上的llvm/clang-3.4。之所以是混合交叉编译而不是交叉编译,是因为编译的过程中,大部分代码是由性能较高的主体(Host)平台编译,而少部分代码是由性能较低的目标(Target)平台编译。混合交叉编译采用了类似 COMET: Code Offload by Migrating Execution Transparently (OSDI’12) 的思想。其原理是,在目标平台上配置,之后开始编译时,将所有文件同步到主体平台上,并使用主体平台的交叉编译器编译。当需要执行目标平台命令(例如llvm-config
)时,将所有文件同步到目标平台、执行命令,再同步回主体平台,并继续编译。
准备工作:
编译环境:
主体平台
- CPU:Intel Xeon(R) E5620 * 16
- OS:Ubuntu 14.04 + Linux 3.13.0
- 编译器:mipsel-linux-gnu-gcc-4.4/mipsel-linux-gnu-g++-4.4
目标平台
- CPU:loongson 3.2.0-4-loongson-2f, mipsel
- OS:Debian 3.2.51
- 编译器: gcc-4.6.3/g++-4.6.3
预先准备
- 搭建编译环境
- 下载 llvm-3.4的源代码 以及clang-3.4的源代码
- 在主体平台和目标平台上同时创建编译目录并拷贝编译文件
$ mkdir <common/path/prefix>/mips3/llvm
$ cp *-3.4.src.tar.gz <common/path/prefix>/mips3/llvm
$ cd <common/path/prefix>/mips3/llvm
$ tar -xvf *-3.4.src.tar.gz
$ mv clang-3.4 llvm-3.4/tools/clang
$ rm *-3.4.src.tar.gz
以上脚本同时在两个平台上运行。其中<common/path/prefix>
要求两个平台上的路径名称完全相同,这是因为./configure
后的makefile中包含了使用绝对路径的变量,因此如果路径名称不同,会导致编译出错。
3. 创建编译器符号链接
类似的,在两个平台上的编译器名