最近,参考《构建嵌入式LINUX系统(第2版)》以及ptxdist官方网站提供的技术文档,自己动手构建一个最新版的交叉编译工具链,所制作的编译器的版本为arm-v4t-linux-gnueabi-gcc-4.8.2。在网上搜索,可以找到大量类似文档,但在这里,我主要关注于较新的版ptxdist-2013。实际上,在写此文时,最新版本已经到了ptxdist-2014。但其官网上提供的工具链项目范例的最新版本只到2013版。因本人能力有限,这里只写出具体的操作过程,部分关键点会贴出原文档,以供对比。深入分析可参考相关教材以及大牛们的博文。
制作交叉编译工具链前,需下载两个软件包以及官网提供的技术文档:
一个是ptxdist-2013.12.0.tar.bz2,下载网址:http://www.ptxdist.org/software/ptxdist/download/
一个是交叉编译工具链的项目范例OSELAS.Toolchain-2013.12.1.tar.bz2,下载网址:http://www.ptxdist.org/oselas/toolchain/download/
这两个软包都可以从ptxdist的官方网站上下载到,详细信息可去其官网,网址:http://www.ptxdist.org/software/index_en.html。
相关技术文档的下载网址:http://www.ptxdist.org/software/ptxdist/appnotes_en.html
另外,需为编译器构建目录结构,用来组织各种软件和项目组件。在终端输入以下命令:
cd
mkdir cross-tools
cd cross-tools
mkdir build-tools build-tools/downloads my-tools
第一行,进入用户的家目录。第二行,新建一个目录cross-tools, build-tools, build-tools/downloads, my-tools 三个目录。build-tools用来安装ptxdist软件,保存工具链项目范例。build-tools/downloads用来存放下载的各个项目组件,包括glibc, binutils, gcc等项目组件(至于为什么主要用到这三个软件包,可参考上面的参考书。或者百度,网上的说明也很多)。my-tools 用来保存编译好的交叉编译工具链。
准备工作做完后,现在准备制作自己的交叉编译工具链吧。
首选安装ptxdist软件上。将下载的ptxdist软件包复制到cross-tools目录下(我的电脑中,文件默认的下载路径为~/Downloads)
cd ~/Downloads
cp ptxdist-2013.12.0.tar.bz2 ~/cross-tools
顺便也将交叉编译器的项目范例考到cross-tools/build-tools
cp OSELAS.Toolchain-2013.12.1.tar.bz2 ~/cross-tools/build-tools
进入cross-toos目录,解压软件包并进入解压后的目录
cd ~/cross-tools
tar -jxvf ptxdist-2013.12.0.tar.bz2
cd ptxdist-2013.12.0
ls -lF
将显示ptxdist-2013.12.0目录下的文件
total 684
-rw-r--r-- 1 root root 796 Apr 12 10:32 1
-rwxrwxr-x 1 sirzy sirzy 28 Dec 18 17:48 autogen.sh*
drwxrwxr-x 2 sirzy sirzy 4096 Apr 12 10:28 bin/
-rw-rw-r-- 1 sirzy sirzy 115540 Dec 18 17:48 ChangeLog
drwxrwxr-x 12 sirzy sirzy 4096 Dec 18 17:48 config/
-rw-rw-r-- 1 sirzy sirzy 75579 Apr 17 20:04 config.log
-rwxrwxr-x 1 sirzy sirzy 25973 Apr 17 20:04 config.status*
-rwxr-xr-x 1 sirzy sirzy 224087 Dec 19 01:44 configure*
-rw-rw-r-- 1 sirzy sirzy 12196 Dec 18 17:48 configure.ac
-rw-rw-r-- 1 sirzy sirzy 18446 Dec 18 17:48 COPYING
-rw-rw-r-- 1 sirzy sirzy 4048 Dec 18 17:48 CREDITS
drwxrwxr-x 10 sirzy sirzy 4096 Dec 18 17:48 generic/
-rw-rw-r-- 1 sirzy sirzy 57 Dec 18 17:48 INSTALL
-rw-rw-r-- 1 sirzy sirzy 3931 Apr 17 20:04 Makefile
-rw-rw-r-- 1 sirzy sirzy 3868 Dec 18 17:48 Makefile.in
drwxrwxr-x 246 sirzy sirzy 12288 Dec 18 17:48 patches/
drwxrwxr-x 2 sirzy sirzy 4096 Apr 12 10:48 platform/
drwxrwxr-x 2 sirzy sirzy 4096 Dec 18 17:48 platforms/
drwxrwxr-x 4 sirzy sirzy 4096 Dec 18 17:48 plugins/
lrwxrwxrwx 1 sirzy sirzy 7 Dec 18 17:48 projectroot -> generic/
-rw-rw-r-- 1 sirzy sirzy 4268 Dec 18 17:48 README
-rw-rw-r-- 1 sirzy sirzy 2324 Dec 18 17:48 README.devel
drwxrwxr-x 6 sirzy sirzy 69632 Dec 18 17:48 rules/
drwxrwxr-x 9 sirzy sirzy 4096 Dec 18 17:48 scripts/
drwxrwxr-x 2 sirzy sirzy 4096 Dec 18 17:48 tests/
-rw-rw-r-- 1 sirzy sirzy 63516 Dec 18 17:48 TODO
ptxdist 安装前需要确认主机上是否已安装全部所需的软件。ptxdist提供了一个配置脚本文件,会自动完成检测过程。如果主机上缺少必要的依懒软件包,配置脚本会中断执行。运行配置脚本文件
./configure --prefix=~/cross-tools/build-tools
我的电脑上装是ubuntu12.04, 32位版的。在配置过程中,报错,提示缺少必要的软件包。具体的缺少的软件包的名称记不大清了,好像是有bison神马的。另外,我在ubuntu12.04 64位版上安装时,还提示缺少g++等。总之,提示缺少什么软件,就安装什么软件。
sudo apt-get install XXXX (XXXX是报错中提示缺少的软件包)
当所有需要的依懒软件包都安装后,会出现如下信息
configure: creating ./config.status
config.status: creating Makefile
ptxdist version 2013.12.0 configured.
Using '~/cross-tools/build-tools' for installation prefix.
Report bugs to ptxdist@pengutronix.de
(出现这些信息,说明主机上已经安装全部的依懒软件包)
补充说明: --prefix 选项设定ptxdist的安装路径。如果不指定该参数,那么软件将默认安装到/usr/local目录下。另外,如果加上 --help参数,将显示更多可供设置的选项。
配置脚本成功执行完后,执行
make
编译全部程序,如果没有报错,就可以运行下面命令,将ptxdist 安装到prefix指定目录下。
make install
说明:如果程序的安装目录是默认的/usr/local,则应以root权限执行,即 sudo make install。这里,因为我设置的安装目录是家目录下的子目录,不需要root权限。
注意:这里一个需要注意的小细节,也是容易被忽略的细节,在官方提供的技术文档原文中有这么一段话:We need to take care that the bin/ directory below the new installation dir is added to our
$PATH environment variable (for example by exporting it in ̃/.bashrc).大至意思是,要将安装目录下的bin目录加添到路径环境变量中。方法很多 ,我选择其中一种,输入以下命令
cd
vim .bashrc
在最后一行加上 export PATH=$PATH:~/cross-tools/build-tools/bin
source .bashrc
至于为什么是在 .bashrc, 或者,你在家目录下看不到 .bashrc文件,同样去问百度,会有很详细的答案。
首次使用ptxdist时,需要做基本的设置。一般设置好工程目录和下载文件的保存目录。
Project Searchpath 设置为~/cross-tools (工程所在目录)
Source Directories 设置为~cross-tools/build-tools/downloads
在制作交叉编译工具链时,如果需要从网上下载软件包,则ptxdist会自己将下载的软件包保存到这个downloads目录下。所以,在制工具链的过程中,千万不可断网。在官方文档中还有这么一段话:If we are working with more than one PTXdist based project, every project would download its own required archives in this case. To share all source archives between all projects, PTXdist can be configured to share only one archive directory for all projects it handles: Navigate to menu entry Source Directory and enter the path to the directory where PTXdist should store archives to share between its projects。大至意思是,如果我们有多个基于ptxdist的工程,而这几个工程需要共用同一个下载目录下的软件包,则应执行 ptxdist menu,然后将源目录设置成一可共用的目录。
到这里ptxdist安装完成,已经可用了。进入之前下载的项目范例所在目录,并解压项目范例
cd ~/cross-tools/build-tools/
tar -xf OSELAS.Toolchain-2013.12.1.tar.bz2
cd OSELAS.Toolchain-2013.12.1
ptxdist selection ptxconfigs/arm-v4t-linux-gnueabi_gcc-4.8.2_glibc-2.18_binutils-2.24_kernel-3.12-sanitized.ptxconfig
第四行命令,选择一个预定义的编译器版本的配置文件。arm-v4t-linux-gnueabi指定目标平台的架构, gcc-4.8.2_glibc-2.18_binutils-2.24_kernel-3.12这部分则分别指定了gcc,glibc,binutils以及kernel的版本。在官方文档中提到,The last part (kernel-3.12) defines the kernel header in use for this toolchain. This is important, as applications
built with this toolchains must be ran at least on this kernel revision.大至是说,由此编译器编译的软件,必须运行在基于3.12及更高版本内核的系统之上。(但实际上,我将编译的程序放到2.6.4内核版本的系统上,也没出现问题,也可能是我的测试程序太简单问题,还没来得急发现问题。^_^)
再设置用于保存制作好的编译器的目录,设置为~/cross-tools/my-tools/
ptxdist menuconfig
misc ----> prefix for installation 设置成~/cross-tools/my-tools
注:
1. 软件默认的保存目录为/opt/。而且,要安装在该目录下,需要root权限。所以在安装过程,会提示以root权限运行等内容;
2. 如果ptxdist的版本和项目范例的版本不对应,则在执此命令的时候会报错,加上 --force 参数可强制执行,不检测版本号。
到此,全部设置基本完。在官方文档中有一个提示,Please ensure the ’current directory’ (the . entry) is not part of your PATH environment variable. PTXdist tries to sort out this entry, but might not be successfully doing so. Check by running ptxdist print PATH if the output still contains any kind of ’current directory’ as a component. Ifyes, remove it first.大至意思是说,如果当前目录在路径环境变量里,则应该删除掉。执行 ptxdist print PATH命令可以查看当前路径是否是路径环境变量。制作过程中,应注意每个细节,否则容易报错。
ptcdist print PATH
~/cross-tools/build-tools/OSELAS.Toolchain-2013.12.1/platform-arm-v4t-linux-gnueabi-gcc-4.8.2-glibc-2.18-binutils-2.24-kernel-3.12-sanitized/sysroot-host/lib/wrapper:~/cross-tools/build-tools/OSELAS.Toolchain-2013.12.1/platform-arm-v4t-linux-gnueabi-gcc-4.8.2-glibc-2.18-binutils-2.24-kernel-3.12-sanitized/sysroot-host/bin:~/cross-tools/build-tools/OSELAS.Toolchain-2013.12.1/platform-arm-v4t-linux-gnueabi-gcc-4.8.2-glibc-2.18-binutils-2.24-kernel-3.12-sanitized/sysroot-host/sbin:~/cross-tools/tools/build-tools/lib/ptxdist-2013.12.0/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.3/bin:/opt/OSELAS.Toolchain-2013.12.1/arm-v4t-linux-gnueabi/gcc-4.8.2-glibc-2.18-binutils-2.24-kernel-3.12-sanitized/bin:~/cross-tools/tools/build-tools/bin
最后,执行 ptxdist go 命令,将自动下载所需的软件包,直至最终交叉编译工具链的制作完成。时间长短与机器配置、网速均有关。一般一个多少时到四五个小时不等。最后,在官方文档中,给出一条建议,将工具链的全部文件设置成只读文件,或者将文件属主设为root。因为在制作过程中,都是在一般用户权限下进行的,所以,为了保护工具链不被破坏,官方文档强烈建议这么做。
补充:如果还需再制作另外一个工具链,执行以下操作
ptxdist clean
rm selected_ptxconfig
ptxdist select ptxconfigs/any_other_toolchain_def.ptxconfig
ptxdist go
先删除之前选择的配置文件,再重新选择新的配置文件。
******************支持原创,如转载请注明来源*******************