环境
系统 CentOS Linux release 7.9.2009 (AltArch)
docker虚拟机
创建/home/gcc目录构建整个gcc编译工程目录
mkdir /home/gcc
cd /home/gcc
源码下载
wget http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.xz
解压
tar jxvf gcc-7.3.0.tar.xz
创建中间文件输出目录
mkdir gccbuild
创建最终目标文件输出目录
mkdir gccout
ls查看当前的文件夹,有如下的文件夹
gccout gccbuild gcc-7.3.0
安装gcc的依赖软件
gcc的软件包内提供了自动下载需要软件的脚本: ./contrib/download_prerequisites
会下载四个文件:
gmp-6.1.0.tar.bz2
mpc-1.0.3.tar.gz
isl-0.16.1.tar.bz2
mpfr-3.1.4.tar.bz2
把这几个文件复制到外面一层目录,解压缩
tar jxvf isl-0.16.1.tar.bz2
tar jxvf mpfr-3.1.4.tar.bz2
tar jxvf gmp-6.1.0.tar.bz2
tar zxvf mpc-1.0.3.tar.gz
把解压的目录复制到gcc-7.3.0目录中
mv isl-0.16.1 gcc-7.3.0/isl
mv mpfr-3.1.4 gcc-7.3.0/mpfr
mv gmp-6.1.0 gcc-7.3.0/gmp
mv mpc-1.0.3 gcc-7.3.0/mpc
重置相关的环境变量
unset LIBRARY_PATH CPATH C_INCLUDE_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE
否则会导致宏定义冲突 ,出现大量如下错误
error: Unable to find a suitable type for HOST_WIDE_INT
error: 'HOST_WIDE_INT' does not name a type
error: expected ',' or '...' before 'x' ffs_hwi (unsigned HOST_WIDE_INT x)
error: expected initializer before 'zext_hwi'
zext_hwi (unsigned HOST_WIDE_INT src, unsigned int prec)
最好仔细检查一遍,输出环境变量是否为空
echo $CPLUS_INCLUDE_PATH
构建Makefile
进入gccbuild文件夹,进行编译,目标是将生成的中间文件存放在gccbuild文件夹,避免污染源码
cd gccbuild
../gcc-7.3.0/configure --prefix=/home/gcc/gccout/
可以添加如下相关参数
--enable-languages 表示编译出来的编译器支持哪些语言,例如--enable-languages=c,c++ 说明支持c.c++语言编译
--disable-multilib 表示编译出来的编译器不支持交叉编译其他平台的程序
--disable-checking表示编译出来的编译器不做额外检查
例如
../gcc-7.3.0/configure --prefix=/home/gcc/gccout/ --enable-languages=c,c++ --disable-multilib --host=aarch64-linux-gnu
编译
make -j64
可以通过如下指令,查看有多少CPU加速编译,单核CPU编译耗时2-3小时
cat /proc/cpuinfo | grep "processor" | wc -l
安装
make install
问题
configure: error: building out of tree but ../gcc/gcc-7.3.0 contains host-aarch64-unknown-linux-gnu.
Use a pristine source tree when building in a separate tree
出现该问题是编译输出的中间文件并没有按照上面操作,先进入中间输出文件编译,重新下载源码,按照上面操作即可,重新执行configure无效