第1章 搭建编译器
主机环境:Linux debian 2.6.38
目标平台:pc386
1.1 搭建编译器所需要的软件包
Gcc软件包:gcc-4.3.2.tar.bz2
下载目录:
http://ftp.gnu.org/gnu/gcc/gcc-4.3.2
ftp://ftp.rtems.com/pub/rtems/SOURCES
gcc软件包补丁:gcc-4.3.2-20080910.diff
下载目录:ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/
Binutils软件包:binutils-2.20.tar.bz2
下载目录:
http://ftp.gnu.org/gnu/binutils/
ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/
Newlib软件包:
newlib-1.17.0.tar.gz
newlib-1.18.0.tar.gz
Newlib软件包补丁:
newlib-1.17.0-rtems4.10-20091009.diff
newlib-1.18.0-rtems4.11-20101126.diff
下载目录:
ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/
http://www.mmnt.net/db/0/0/ftp.rtems.eu/pub/rtems/4.10.2
备注:我在编译pc386平台时,首先使用的库是newlib-1.17.0.tar.gz,但在配置rtems支持posix接口时,出现sched.h找不到的错误,目前的解决方案是使用newlib-1.18.0.tar.gz库,并应用newlib-1.18.0-rtems4.11-20101126.diff补丁。
下载浮点运算C库包MPFR(multiple-precision floating-point) mpfr-2.4.2.tar.bz2:
下载复数运算C库包mpc-0.9.tar.gz:
http://www.multiprecision.org/index.php?prog=mpc&page=download
备注:该网站同时指出了mpc的最新版本,所依赖的mpfr和gmp的最低版本,比如网站主页指出,对于mpc-0.9.tar.gz版本,需求的gmp和mpfr的版本为:gmp version 4.3.2 或者更高,mpfr version 2.4.2或者更高
下载整数,有理数,浮点数算术库包gmp-5.0.5.tar.bz2:
1.2 RTEMS软件包
rtems源码:rtems-4.10.2.tar.bz2
下载目录:ftp://ftp.rtems.com/pub/rtems/4.10.2/
1.3 开发平台目录树
在我的主机上建立的目录树:
/whatever/prefix/you/choose/archive/ //存放源码包目录
gcc-4.3.2.tar.bz2
gcc-4.3.2-20080910.diff
binutils-2.20.tar.bz2
newlib-1.17.0.tar.gz
newlib-1.17.0-rtems4.10-20091009.diff
rtems-4.10.2.tar.bz2
newlib-1.18.0.tar.gz
newlib-1.18.0-rtems4.11-20101126.diff
gmp-5.0.5.tar.bz2
mpc-0.9.tar.gz
mpfr-2.4.2.tar.bz2
build/ //存放解压包和编译包目录
tools/ //存放编译的交叉包目录
1.3 创建环境变量
在build目录下创建一个set-rtems.sh的脚本文件,内容如下:
#! /bin/sh
export PRJECT=rtems
export PRJROOT=/home/tom/${PRJECT}
export TARGET=i386-rtems4.10
export PREFIX=${PRJROOT}/tools/rtems-4.10
export TARGET_PREFIX=${PREFIX}/${TARGET}
export PATH=${PREFIX}/bin:${PATH}
pwd
cd $PRJROOT
执行命令:
$cd build
$sudo chmod +x ./set-rtems.sh
备注一:给set-rtems.sh加上可执行权限需要用到root权限。
$source ./set-rtems.sh
备注:该命令使得set-rtems.sh中的环境变量在当前shell中可见,也可以使用
$. ./set-rtems.sh
注意:两个点之间至少要有一个空格
备注二:如果编译基于arm平台的编译器,需要将:
export TARGET=i386-rtems4.10
更改为:
export TARGET=arm-rtems4.10
使用库:newlib-1.18.0.tar.gz
同时应用补丁:newlib-1.18.0-rtems4.11-20101126.diff
下载目录:
ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/
需要注意:下载目录中的补丁是逐个累积的,我们只需要应用最新的补丁即可。
第二部建立步骤:
第一步:安装binutils工具包
$cd build
$tar xvf ../archive/binutils-2.20.tar.bz2
$mkdir b-binutils
$cd b-binutils
$../ binutils-2.20/configure --target=$TARGET --prefix=$PREFIX
$make
$make install
第二步:解压gcc-4.3.2.tar.bz2,并应用补丁
$cd build
$ tar xvf ../archive/gcc-4.3.2.tar.bz2
$cd gcc-4.3.2
$patch -p1 <../../archive/gcc-4.3.2-20080910.diff //应用补丁
$find . -name "*.rej" -print //如果没有扩展名为.rej的文件,说明补丁应用成功
第三步:解压newlib-1.18.0.tar.gz,并应用补丁
$cd build
$tar xvf tar xvf ../archive/ newlib-1.18.0.tar.gz
$cd newlib-1.18.0
$patch -p1 <../../archive/ newlib-1.18.0-rtems4.11-20101126.diff //应用补丁
$find . -name "*.rej" -print //如果没有扩展名为.rej的文件,说明补丁应用成功
第四步:为了避免通常的两步编译gcc(即第一步:编译bootstrap gcc,第二步编译:full gcc),我们把newlib库昨晚gcc的一个子目录进行编译,我们使用符号链接将newlib库作为一个子目录链接到gcc目录中。
$cd gcc-4.3.2
$ln -s ../newlib-1.16.0/newlib .
$tar xvf ../archive/mpfr-2.4.2.tar.bz2
$cp mpfr-2.4.2/ ./gcc-4.5.4/mpfr -a
$tar xvf ../archive/mpc-0.9.tar.gz
$cp mpc-0.9/ ./gcc-4.5.4/mpc –a
$tar xvf ../archive/gmp-5.0.5.tar.bz2
$cp gmp-5.0.5 ./gcc-4.5.4/gmp –a
第五步:完全编译gcc
$mkdir b-gcc
$cd b-gcc
$../gcc-4.3.2/configure --target=$TARGET \
--with-gnu-as --with-gnu-ld --with-newlib --verbose \
--enable-threads --enable-languages="c,c++" \
--prefix=$PREFIX
$make all
$make info
$make install
经过上面的五步之后,我们的基于i386的交叉编译器就搭建起来了,我们可以用 $i386-rtems4.10-gcc –v 查看我们编译的编译器版本,示意图如下:
第1章 编译RTEMS内核
$cd rtem-i386
$tar xjf ../archive/rtems-4.10.2.tar.bz2
$mkdir build-rtems
$cd build-rtems
编译rtems使其支持posix和网络
$../rtems-4.10.2/configure --target=$TARGET \
--enable-posix --enable-networking --disable-cxx \
--enable-rtemsbsp=pc386 \
--prefix=/home/tom/Public/rtems-i386/install_dir
这样编译的rtems系统就被安装到install_dir目录,示意图如下:
如果用newlib-1.17.0.tar.gz搭建基于i386的编译器,则会出现:
checking sched.h usability... no
checking sched.h presence... no
checking for sched.h... no
configure: error: Required header sched.h not found
configure: error: /bin/sh '../../../../../rtems-4.10.2/c/src/../../cpukit/configure' failed for ../../cpukit
gmake[2]: *** [smdk2410] Error 1
解决办法:把newlib更新至:newlib-1.18.0.tar.gz
同时应用补丁:newlib-1.18.0-rtems4.11-20101126.diff
下载目录:
ftp://ftp.rtems.com/pub/rtems/SOURCES/4.10/
需要注意:下载目录中的补丁是逐个累积的,我们只需要应用最新的补丁即可。
并且使用newlib-1.18.0.tar.gz其它软件包不变,可以直接编译i386平台的编译器,该平台newlib-1.18.0.tar.gz也是需要打newlib-1.18.0-rtems4.11-20101126.diff补丁,否则rtems支持posix接口模块无法编译通过。
- 编译microwindows运行
下载microwindows-full-0.92.tar.gz
下载地址:http://microwindows.censoft.com/
Microwindows的编译依赖于库:
freetype-2.3.12.tar.bz2
下载地址:
http://download.savannah.gnu.org/releases/freetype/freetype-old/
编译并安装freetype-2.3.12.tar.bz2:
$ tar xvf freetype-2.3.12.tar.bz2
$ cd freetype-2.3.12/
$ ./configure -host=i386-rtems4.10 -prefix=/home/tom/Public/rtems-i386/freetypelib
备注:其中-host=i386-rtems4.10指明使用的是交叉编译器的前缀,-prefex指明的是安装路径。freetype自动生成的include文件夹有点小问题,编译完成后的include目录结构是 /include/ft2build.h和 /include/freetype2/freetype/***.h如果直接使用会出现头文件找不到的问题,这里涉及到freetype的一个小技巧:使用freetype时只需要包含ft2build.h这一个头文件即可,因为ft2build.h里面会自动包含其他需要的头文件。而ft2build.h中的包含其他头文件的路径是/freetype/***.h,显然找不到相应的头文件。我们把freetype2中的freetype文件整个拷贝到include目录下,然后把 freetype2删除即可。
然后将其拷贝到rtems的安装目录install_dir/i386-rtems4.10/pc386/lib/include即可。示意图如下:
下载libpng-1.0.62.tar.bz2
http://sourceforge.net/projects/libpng/files/libpng10/1.0.62/
编译安装:
$ tar xvf libpng-1.0.62.tar.bz2
$ cd libpng-1.0.62/
$CC=i386-rtems4.10-gcc ./configure --build=i686-pc-linux --target=i386-rtems4.10 --host=i386-rtems4.10 --prefix=/home/tom/Public/rtems-i386/libpng_install
$make install
然后将生成的库文件和头文件:
拷贝到: rtems-i386\install_dir\i386-rtems4.10\pc386\lib目录中
下载: zlib-1.2.3.tar.bz2
编译安装:
$ tar xvf zlib-1.2.3.tar.bz2 zlib-1.2.3/
$ cd zlib-1.2.3/
$ CC=i386-rtems4.10-gcc ./configure --prefix=/home/tom/Public/rtems-i386/zlib –share
$make install
生成:
拷贝到: rtems-i386\install_dir\i386-rtems4.10\pc386\lib目录中
参考资料:http://blog.chinaunix.net/uid-24875436-id-3013114.html
$tar xvf microwindows-full-0.92.tar.gz
$cd microwindows-full-0.92/src
$RTEMS_MAKEFILE_PATH=/home/tom/Public/rtems-i386/install_dir/i386-rtems4.10/pc386/ \
CONFIG=`pwd`/Configs/config.rtems \
make -f Makefile.rtems clean all >log.txt 2>&1
评论