ESP8266交叉编译器xtensa-lx106-elf 在Linux下编译与生成

转发来源:https://blog.csdn.net/flyingcys/article/details/71357261

一、编译环境配置

由于编译crosstool-NG依赖编译环境,本次编译在Ubuntu_16.04.2_64bit下进行,gcc版本为5.4.0,make版本为4.1,可通过gcc -v/make -v查看。
文本后续提到的在编译过程中出现的错误都是基于当前环境下的,如编译环境不一致导致其他错误,可按照类似方法解决。
在编译crosstool-NG之前,我们先安装编译需要的软件包,通过以下命令一次性安装完成:
sudo apt-get install git autoconf build-essential gperf bison flex texinfo libtool libncurses5-dev wget gawk libc6-dev-amd64 python-serial libexpat-dev
使用apt-get之前先确定下软件下载源在国内还是国外,推荐使用国内的阿里云镜像或163镜像速度比较快,不然下载速度就杯具了!记得下载前先sudo apt-get update下。

二、crosstool_NG下载

ESP8266内置Tensilical L106 32bit微处理器,我们使用的是大侠jcmvbkbc制作的Xtensa系列crosstool-NG,可在https://github.com/jcmvbkbc/crosstool-NG查看crosstool-NG源文件。
在命令行输入:git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git ,git clone -b表示只克隆lx106分支,该分支下总共有30425个文件,git表示网络有些慢,需要一些时间。
经过漫长的等待后Clone终于完成,进入crosstool-NG文件夹,我们可以看到:

1.在该目录下执行:./bootstrap

./configure

make

sudo make install
当然也可分开执行4条依次执行。
其中:
./bootstrap通过autoconf生成.configure
./configure –prefix=`pwd`将检查依赖文件包,并通过–prefix配置安装路径为当前目录。pwd指令前后的为反单引号(tab键上面那个按键)。在linux的bash中,其用法同$()相同,用“括起来的内容为一个变量,`pwd`就是当前目录。
如缺少安装软件包某软件包,./configure将自动终止直至安装完成。
我在安装中出现了如下错误:
1)缺少libtool。
解决方法:sudo apt-get install libtool

发现已经安装了libtool,但是版本为2.4.6-0.1版。版本太高了?只能手动安装了!!

① 删除已安装版本sudo apt-get remove libtool
② 至ftp://ftp.gnu.org/gnu/libtool/下载libtool-1.5.26版,并解压libtool-1.5.26目录
③ 在libtool-1.5.26目录下依次执行
a)./configure
b)make
c)sudo make install
libtool完成安装
2.在该目录下执行:./ct-ng xtensa-lx106-elf

三、crosstool_NG配置

crosstool-NG默认配置也可以编译生成Esp8266交叉工具链,但是编译时间特别长,而且特别容易出错。针对这2点进行一些配置。
在crosstool-NG目录下执行./ct-ng menuconfig进行配置

1.配置多线程编译
“Paths and misc options”->“Number of parallel jobs”

默认为0,设置为4;
这个数字不易过大,常见修改方式:CPU内核数*2;如当前PC的CPU为双核,那这里就设置为4;
以上配置设置完成后,在后续执行./ct-ng build时无需手工指定参数。即无需./ct-ng build.4(其实内部还是通过make -j4去执行)。
2.保存编译中间步骤
“Paths and misc options”->“Debug crosstool-NG”->“Save intermediate steps”

crosstool-NG默认配置下每次编译都是重新开始的,无论上一次编译到哪一步,是否成功!
以上配置设置完成后,在后续执行./ct-ng build
完成以上设置后,保存并退出。

四、crosstool_NG编译

完成以上设置后,在crosstool-NG目录下执行./ct-ng build开始编译。编译过程分多个步骤:
1.下载源码包:本次编译需要的源码包有:
gcc-4.8.2
cloog-0.18.4
binutils-2.24
gdb-7.5.1
gmp-5.1.3.tar
isl-0.12
mpc-1.0.2
mpfr-3.1.2.tar
需要下载的源码包名称及版本在根目录下.config文件内配置。源码包下载至根目录下.build/tarballs目录,配置文件和目录为隐藏目录,在Ubuntu下需要按ctrl+h显示才能看到。.config文件和.build/tarballs目录在后面我们都要用到。

2.自动/手动下载源码包
a)自动下载:
在crosstool-NG目录下执行./ct-ng build及开始编译前的第一步工作,编译依赖包下载,该步骤根据网络情况和服务器情况不同,非常耗时。
在未知源码包名称及版本情况下,可一步一步根据build后日志上显示的源码包文件名、版本号、下载路径去下载,然后放至.build/tarballs。下载完一个后,再执行./ct-ng build来确定下一个包。
b)手动下载:我们通过查看根目录下.config文件,得到源码包名称及版本号。下载完成后全部放至.build/tarballs。以下为下载地址:
gcc-4.8.2:ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.2/
cloog-0.18.4:http://www.cloog.org/
binutils-2.24:ftp://ftp.gnu.org/gnu/binutils/
gdb-7.5.1:ftp://ftp.gnu.org/gnu/gdb/
gmp-5.1.3.tar:ftp://ftp.gnu.org/gnu/gmp/
isl-0.12:http://isl.gforge.inria.fr/
mpc-1.0.2:ftp://ftp.gnu.org/gnu/mpc/
mpfr-3.1.2.tar:ftp://ftp.gnu.org/gnu/mpfr/
如果在windows系统下下载以上软件,建议不要使用迅雷等下载工具。将以上下载文件copy至.build/tarballs,然后在根目录下执行./ct-ng build。然后开始满足的编译过程,根据电脑配置不同时间不同,需要耐心等待。

可以看到,我们配置的保存编译过程,可以在出错后只从出错未知开始重新编译

如编译过程中binutils_for_host出错,我们可以直接执行 ./ct-ng binutils_for_host+,之前编译过的就不需要重复运行。

一次性成功,耗时27分钟!是不是感觉so easy?
编译完成的交叉编译器在更目录下builds下,文件名为xtensa-lx106-elf

到这里,我们的交叉编译器生成工作已完成了95%,那剩下的5%呢?现在我们就把xtensa-lx106-elf到Ubuntu系统目录下,编译一下esp8266的工程试试!

五、xtensa-lx106-elf测试

1.在build目录下执行sudo cp -f xtensa-lx106-elf /opt并正确配置环境变量,ubuntu下环境变量配置可参照《Linux环境变量设置》一文。
2.
在github上下载最新esp8266的rtos版本sdk至本地
git clone https://github.com/espressif/ESP8266_RTOS_SDK
ESP8266_RTOS_SDK在linux工程运行配置请参照本文博客《ESP8266交叉编译环境搭建之linux篇》一文,这里不再重复叙述。
运行SDK内部的sample,你就会发现,编译出错了,这就是我们剩下的5%的工作。
1)提示缺少stdint.h文件

执行wget -O include.tgz https://github.com/esp8266/esp8266-wiki/raw/master/include.tgz
下载并解压至交叉编译器对应文件夹
sudo tar zxvf include.tgz -C /opt/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.5/
2)提示缺少libhal.a文件