一.目标
在Ubuntu环境中,为spmp8k配置安装toolchain,并使用该toolchain编译由Alemaxx为spmp8制作的函数库libspmp8k。最终产生适合spmp8k平台的SDK。
二.制作环境
主机系统:Ubuntu-10.10-desktop-i386,以下将该系统简称为Ubuntu。为了便于工作,Ubuntu使用了Vmware(版本为7.1.2 build-301548)安装。
主机gcc版本:4.4.5
三.配置安装toolchain
1.总体过程
(1)编译安装binutils
在步骤(2)、步骤(3)、步骤(4)中,都要用到在这个步骤中编译出来的binutils,所以这个工具最先编译安装。
(2)编译安装bootstrap gcc (初始编译器)
在这个步骤中,只编译出目标平台(spmp8k)的C编译器,并称这个编译器为bootstrap gcc (初始编译器)。叫这个名称是因为:这个编译器是很原始的,它没有newlib的支持;而且这个编译器将会被废弃,而由步骤(4)编译出来的编译器所替代。编译安装bootstrap gcc的目的只是为了编译newlib。
(3)编译译安装newlib
适合嵌入式系统环境的近标准C库。
(4)编译安装完整的gcc
在这个步骤中,编译安装目标系统的C编译器和C++编译器。注意这个步骤编译出来的编译器有newlib作为近标准C库
2.具体过程
安装所缺的包
在原版的Ubuntu中,还缺少一些制作spmp8k toolchain的过程中要用到的包。可以使用以下的命令进行安装这些包。
$sudo apt-get install texinfo bison flex gawk patch
有些缺少的包无法通过apt-get来安装。对于这样的包,通过下载它们的源码包,进行编译后再安装。需要按这样的方法安装的包有gmp和mpfr。
gmp-4.3.2.tar.bz2
ftp://ftp.gmplib.org/pub/gmp-4.3.2/gmp-4.3.2.tar.bz2
假设下载的gmp-4.3.2.tar.bz2放在了当前用户的home目录(即目录~)下,则安装方法如下:
$cd ~
$bunzip2 0<gmp-4.3.2.tar.bz2 | tar -xvf -
$cd gmp-4.3.2
$./configure
$make
$make check
$make install
mpfr-3.0.0.tar.bz2
http://www.mpfr.org/mpfr-3.0.0/mpfr-3.0.0.tar.bz2
假设下载的mpfr-3.0.0.tar.bz2放在了当前用户的home目录(即目录~)下,则安装方法如下:
$cd ~
$bunzip2 0<mpfr-3.0.0.tar.bz2 | tar –xvf -
$cd mpfr-3.0.0
$./configure
$make
$make check
$make install
准备所需的toolchain源码包
binutils-2.20.1.tar.bz2
http://ftp.gnu.org/gnu/binutils/binutils-2.20.1.tar.bz2
newlib-1.18.0.tar.gz
ftp://sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz
gcc-core-4.3.3.tar.bz2
http://gcc.igor.onlinedirect.bg/releases/gcc-4.3.3/gcc-core-4.3.3.tar.bz2
gcc-g++-4.3.3.tar.bz2
ftp://sources.redhat.com/pub/newlib/newlib-1.18.0.tar.gz
创建相关目录
$sudo mkdir -v /spmp8k
$sudo chown $LOGNAME:$LOGNAME /spmp8k //将目录spmp8k的拥有前交给当前用户
注意:使用sudo命令时,可能当提示输入密码,输入当前用户的密码即可。
$mkdir -v /spmp8k/src //放源文件的目录
$mkdir -v /spmp8k/build //build目录
$mkdir -v /spmp8k/toolchain //工具链的安装目录
$mkdir -v /spmp8k/build/binutils
$mkdir -v /spmp8k/build/newlib
$mkdir -v /spmp8k/build/gcc
解压源码包
将以下文件放在目录/spmp8k/src下。
binutils-2.20.1.tar.bz2
newlib-1.18.0.tar.gz
gcc-core-4.3.3.tar.bz2 //只包含C编译器的源码和所有编译器的公共部分
gcc-g++-4.3.3.tar.bz2 //g++源码
然后
$cd /spmp8k/src
$bunzip2 0<binutils-2.20.1.tar.bz2 | tar -xvf -
$gunzip 0<newlib-1.18.0.tar.gz | tar -xvf -
$bunzip2 0<gcc-core-4.3.3.tar.bz2 | tar -xvf -
$bunzip2 0<gcc-g++-4.3.3.tar.bz2 | tar -xvf -
注意:gcc-core-4.3.3.tar.bz2和gcc-g++-4.3.3.tar.bz2解压后会自动生成同一个目录:gcc-4.3.3。
编译安装binutils
$cd /spmp8k/build/binutils
$/spmp8k/src/binutils-2.20.1/configure /
--target=arm-elf --prefix=/spmp8k/toolchain /
2>&1 | tee binutils_configure.out
$make -w all 2>&1 | tee binutils_make.out
等待编译完成,然后安装:
$make -w install 2>&1 | tee binutil_install.out
编译安装bootstrap gcc(初始化编译器)
$gedit ~/.bashrc &
往.bashrc 添加以下内容,然后保存退出:
PATH=/spmp8k/toolchain/bin:$PATH
$export PATH=/spmp8k/toolchain/bin:$PATH
$cd /spmp8k/build/gcc
$/spmp8k/src/gcc-4.3.3/configure --target=arm-elf --prefix=/spmp8k/toolchain /
--disable-nls --disable-libssp --disable-libgomp --disable-libmudflap --enable-languages=c /
--with-gnu-as --with-gnu-ld --with-cpu=arm926ej-s /
2>&1 | tee configure.out
其中:
--disable-libssp
表示不编译保护缓冲区溢出的运行时库。
--disable-libgomp
表示不编译 GOMP 使用的运行时库和工具。
--disable-libmudflap
表示不编译边界检查函数的运行时库。
--enable-languages=c
表示只编译生成C语言编译器
--with-gnu-as --with-gnu-ld
分别表示使用gnu汇编器和gnu连接器。
$make -w all 2>&1 | tee bootstrap_gcc_make.out
等待编译完成,然后安装:
$make -w install 2>&1 | tee bootstrap_gcc_install.out
编译安装newlib
$cd /spmp8k/build/newlib
$/spmp8k/src/newlib-1.18.0/configure /
--target=arm-elf --prefix=/spmp8k/toolchain --disable-newlib-supplied-syscalls /
2>&1 | tee newlib_make_configure.out
$make all -w 2>&1 | tee newlib_make.out
等待编译完成,然后安装:
$make install -w 2>&1 | tee newlib_install.out
编译完整的gcc
$cd /spmp8k/build/gcc
$rm -rf *
$/spmp8k/src/gcc-4.3.3/configure --target=arm-elf --prefix=/spmp8k/toolchain /
--disable-nls --disable-libssp --disable-libgomp --disable-libmudflap --enable-languages=c,c++ /
--with-gnu-as --with-gnu-ld --with-cpu=arm926ej-s --with-newlib /
2>&1 | tee full_gcc_configure.out
$make all -w 2>&1 | tee full_gcc_make.out
等待编译完成,然后安装:
$make install -w 2>&1 | tee full_gcc_install.out
到此为止,适合spmp8k的gcc toolchain编译安装完成。接下来我们利用刚这个刚编译toolchain,来编译由Alemaxx为spmp8制作的函数库libspmp8k。
四.编译libspmp8k
libspmp8k的作者是Alemaxx。
libspmp8k的下载地址为:
http://libspmp8k.googlecode.com/svn/trunk/
注意:下载libspmp8k时,要用TortoiseSVN。TortoiseSVN是个源代码管理工具,它的官网站为http://tortoisesvn.net/。
假设下载的libpmp8k放在了当前用户的home目录(即目录~)下,则使用以下命令编译这个代码库中的内容。
$cd ~/libspmp8k
$make
编译过程中,会出现一些错误。估计原因主要是:1.在这里制作的编译环境跟Alemmax使用的编译环境不同,而libspmp原本是在Alemmax使用的编译环境工作的;2.Alemmax没及时Check In最新的libspmp。所以要成功编译libspmp8k,得做一些额外的工作。具体是:
将libsmp8k/demo/keydemo/Makefile中的
OBJS = libgame.o glue.o dmsg.o font6x8.o
改为
OBJS = libgame.o glue.o dmsg.o font6x8.o start.o
将libsmp8k/demo/doom110/i_main.c中的#include "rls_text.h"删去,再将其中的 dmsg_puts(rls_text1);
dmsg_puts(rls_text2);
改为
dmsg_puts(“Hello World”); //在运行编译出来的doom0.bin的启动画面中,将见到Hello World
将libspmp8k/demos/uarttest/Makefile中的
LIBDIR = -L/usr/local/lib/gcc/arm-elf/4.3.3/ -L../../libspmp8k
改为LIBDIR = -L/spmp8k/toolchain/lib/gcc/arm-elf/4.3.3/ -L../../libspmp8k
将libspmp8k/demos/libgame/glue.c中的
extern int errno;
改为int errno;
注意:在Spmp8kSdk-Src中提供的libspmp8k已经做了以上修改。
安装libpng
编译libspmp8k的png2c这个工具时,需要使用到函数库libpng。使用下面的命令安装这个函数库。
$sudo apt-get install libpng12-dev
安装G++
编译libpmp8k的某些工具时,需要用到G++编译器,而Ubuntu在默认情况下没有安装这个编译器。使用以下命令安装g++:
$sudo apt-get install g++
最后
准备好这些工作后,用cd命令进入目录libspmp8k,然后执行命令make,即可编译libspmp8k。
参考资料:
http://alemaxx.al.funpic.de/spmp8000/sp8hc.html
http://ecos.sourceware.org/getstart.html
http://www.mp4nation.net/forum/viewtopic.php?f=24&t=17095&sid=9340c9f33ee43207cad9ef42f0f0019a