2009年5月7日星期四

Google Summer of Code 2009 第一阶段工作总结及下一阶段工作计划

Google Summer of Code 2009 第一阶段工作总结及下一阶段工作计划

关尔昱 2009年5月6日

一、概述

1、目标

本次项目的题目是"Porting OpenSuSE to MIPS Platform",也就是移植OpenSuSE到MIPS架构上。更具体一些,就是要让OpenSuSE可以跑在以龙芯(loongson2f)作为处理器的Gdium上网本上。当然,要完成的还只是一个可使用的系统原型(没有软件仓库,仅有文本模式,有开发构建其他软件包的环境),要达到真正可发布的程度还需要非常非常多的后期工作,这就不是一个人的力量可以完成的了。
本次项目是由Coly li来指导的,感谢Coly li给于我的巨大帮助!

2、起因

这要追溯到今年的寒假,coly在群里发布了一条消息,问是否有人对移植OpenSuSE到MIPS上感兴趣。从那时开始我就有心做这个项目了,但还有点 犹豫和担心,因为之前没做过这方面的任何东西。当时还不知道会把这个项目放到GSoC上。开学之后,在本学期2月第一次linuxfb活动会场上,我和 coly说了我的意愿,coly很支持,并说可能会被放到GSoC上。我当时的想法是是否被放到GSoC上无所谓,能做这个项目才是重点。
就这样,从2月底开始我就准备各种资料了,熟悉交叉编译和CLFS等等。

3、申请过程

申请的起止日期是2009.03.23 - 2009.04.03,在这期间学生可以提交自己的申请并进行修改。在这之前要到GSoC2009的网站上进行注册。
在3月19号我完成了申请的第一版,我知道这一版存在非常多的问题,但是当时还没有太多的思路,只好厚着脸皮骚扰coly让他帮看一下了。果然coly给 我提了很多非常有用的建议,让我把工作细化,列出每一步所需要的软件包等等。又经过五天的准备,最终完成并提交了申请。最后的申请可以在这里找到。
在等待结果的期间,coly以给我的申请提问题的方式,让我可以进一步补充我的申请和最新的进展,这样其他mentor也都能看到我的进度和所做出的努力。
最终在4月21号的时候,收到了google的邮件,通知我的申请已经被接受了。

二、实现方法


在说明每种实现方法之前,需要大概了解一下目标体系结构。MIPS架构有两种endian,而龙芯(loongson2f)是属于mips64el,也就 是64位的小端。所以要构建的交叉编译环境也是要针对mips64el的。(目前对mips体系结构了解还不多,如果需要还得看很多资料)

1、交叉编译整个系统

首先,建立起针对mips64el的交叉编译环境,其中包括glibc,binutils和gcc。然后建立交叉构建rpm包的环境。第三要交叉构建 rpm包。最后安装这些rpm包。这个方法是最开始coly和我大概说过的一个思路。由于我一开始没很好的理解,而是直接想到了第二种实现方法,所以对这 个方法理解不多。

2、交叉编译基本构建系统

这是我写在申请中的方法。跟上一个方法最重要的区别在于不用交叉构建rpm包了,而是利用qemu来模拟mips环境。
首先还是要建立起交叉编译环境。其次,利用交叉编译环境编译出一个可启动的、可用于开发的基系统。第三,利用qemu来启动这个系统并以此系统为基础构建各个所需的rpm包。最后安装构建好的rpm。具体描述可以参考我的申请
在coly的建议下,之后的工作将采用这个方法来实现。

3、交叉编译可启动基本系统

这是目前所采用的方法。第二种方法最大的不足在于第三步,利用自己交叉编译出来的系统来构建各个rpm包。因为这些rpm包要依赖很多开发库和命令,而要交叉编译这些所需的库很可能陷入依赖关系的噩梦,而且很可能不是所有库都是能以我自己的能力完成交叉编译的。
此方法首先建立起交叉编译环境。其次交叉编译出一个可以启动、可以使用rpm命令安装rpm包的基本系统。第三,利用debian系统的mipsel版本 来构建各个rpm包。最后用qemu来启动交叉编译出来的系统并安装这些rpm包。这个方法的好处就是在构建rpm包的时候,需要什么库都可以用 debian的apt系统来安装,非常方便。但也是需要付出代价的,那就是在qemu中跑的mipsel版的debian很慢,平均编译一个包要在半小时 到一小时之间,最长的是gcc,用了100小时。

以上这些方法的共同点是,都需要构建一个交叉编译环境,并且交叉编译出一个可以启动的基本系统。其不同点在于其他软件包的构建方式。


三、已完成的工作

这一部分内容基本上是一个时间流水帐,记录某段时间都做了什么。

目前已经完成了可启动的、可用rpm命令安装rpm包的基本系统的交叉编译工作。完成了大部分基础rpm包的编译工作。

具体已完成的软件包列表可以查看这三个google doc文档,文档一文档二文档三 。软件包链接地址被标注为蓝色的是已经完成的。

1、2月末 ~ 3月初

这段时间主要在熟悉交叉编译和如何建立交叉编译环境。在这期间找了很多关于建立交叉编译环境和CLFS的资料。发现了一篇教你如何构建龙芯系统的文章,《手把手教你源代码制作龙芯64位系统》 大喜过望,这不就是我所需要的吗。还用kvm安装了好多次opensuse11.1系统,可能因为kvm不够稳定,虚拟机经常死掉然后还不能启动,所以装 了很多次,最后放弃了,还是用vbox安装了opensuse11.1。用的光盘是coly在北邮install festival上带去的dvd光盘。

2、3月初 ~ 3月19

初次尝试建立交叉编译环境,是按照《手把手》这篇文章的说明来编译的,还比较顺利。然后着手开始写申请的第一版。这一版申请内容很空洞,因为我自己对这个 项目需要采取什么样的方法来实现还没有一个很清醒的认识。匆匆写了一个就扔给coly来给提意见了。果然coly提出了很多非常有帮助的建议。coly建 议我要细化,究竟哪些包是需要交叉编译的,那些才能称得上是opensuse等等。

3、3月20 ~ 4月5

在听取了coly的建议之后,辛苦的分析opensuse中需要的各个包的依赖关系,并把哪些步骤需要哪些包都详细记录下来,并且在opensuse的src仓库中找到下载链接。在准备好了这些资料之后,又整理了一下自己的思路,开始写申请的第二版,最后提交了这个版本。

4、4月6 ~ 4月15

在这段期间,coly依然给出了很多建议,并建议我改进我的申请。但当时已经过了提交申请的截止日期,申请都不能修改了,所以coly就在我的申请下发表 评论并提问,让我来回答。我也利用这段时间来交叉编译出一个可启动的基本系统,并尝试用qemu来启动它。虽然最后我没有成功,但我把这一段时间的努力和 进展都以回答coly提问的方式更新了我的申请,对最后的结果产生了很好的推动作用。后来coly说一开始我的排名在15,后来升到了第4。
在这期间所做的工作的详细记录可以查看我的这篇blog。总之最后得出结论,不能用《手把手》那篇文章中的方法来建立交叉编译环境和构建系统,因为那是对龙芯2f做了优化的,而qemu还不支持模拟龙芯。这直接促使我采用第三种实现方法。(其中关于mips的各种编译参数还不是很了解,比如-mabi对最后编译结果的影响等)

5、4月16 ~ 4月30

在发现qemu不支持模拟龙芯之后就放弃了实现方法二,而直接采用现成的debian系统来构建rpm包,同时交叉编译出可启动、可使用rpm命令安装 rpm包的基本系统,这个系统需要使用opensuse的启动脚本来启动。所以这段时间基本就在做两件事情,一是在qemu中跑debian,用来 rpmbuild各个rpm包,二是在建立好交叉编译环境之后,根据sysvinit和rpm这两个包的spec文件中所描述的编译和安装步骤来交叉编译 它们并安装到我的基本系统当中。

6、5月1 ~ 5月8

写总结,并整理思路,进行修整。一直在低头赶路,需要抬头看看走过的和前边的路,并稍做休息。

四、各种困难

1、已解决的困难

  • 如何建立交叉编译环境。(CLFS,CLFS 2.0, 手把手)
  • 如何使用qemu模拟mipsel环境(内核的选择,命令行参数等)
  • 如何利用qemu启动交叉编译出的系统(sysvinit,inittab等)
  • 如何交叉编译insserv、fillup、lzmautils、elfutils、sysvinit、rpm等等(自己写了一个补丁,对rpm的Makefile做简单的修改)
  • 如何用debian系统做rpmbuild环境(rpm配置,patch命令,spec文件等)
  • 利用debian作为rpmbuild的host时遇到的各种编译、打包问题(binutils,glibc等)

2、未解决的问题

  • 某些软件包依赖opensuse的一个内核补丁(sysvinit,hwinfo:ioctl 需要TIOCGDEV命令)
  • 一些opensuse特有的包相互之间的依赖关系严重,构建rpm有困难(aaa_base,permissions,openSUSE-build-key等等)
  • 基系统启动不稳定,有事在login的时候出现 Unable to determine your tty name或者INIT: Id "S0" respawning too fast: disabled for 5 minutes这种错误,时好时坏
  • 一些src.rpm打包出现的错误(kernel-source.src.rpm,opensslapps/openssl: symbol lookup error: apps/openssl: undefined symbol: __gcov_indirect_call_profiler等)

3、以后可能遇到的问题

  • 编译出来的rpm包不能很好的安装在交叉编译出的基系统上(这就麻烦了,弄不好要重新编译所有的rpm包)
  • kernel的编译,可能会出现很多问题
  • 包的依赖关系不好解决,比如上边提到的一些opensuse特有的包和yast相关的包
  • to be continued...

五、下一步计划

在8月20号之前还有3个月13天,去掉15天左右的准备中期检查和做其他事情的时间,还有不到3个月的时间。

1、要完成的任务

1) 分析一些基础包的依赖关系,找出哪些包和库需要交叉编译安装到基本boot环境中。

2) 重新使用opensuse中的源码交叉编译出可以启动的、可用来build rpm的构建环境。(这是最关键也是最重要的一步!)

3) 在任务2中交叉编译出的系统上构建各个rpm包。不使用之前在debian系统中构建的rpm包。

4) 把构建出来的rpm包安装到boot系统上,替换掉原来交叉编译出来的二进制文件,完成一个真正的opensuse系统。

5) 把完成的系统拷贝到gdium上进行测试。

6) 整理各种文档。


调整之前的任务计划,用灰色字体

1) 为交叉编译出的基系统安装更多的rpm包。目前除了kernel和正在编译的glibc之外其他的基础包使用--nodeps参数应该都可以安装了。

2) 解决安装rpm中的各种问题,让系统能够顺利启动。同时要理清各种启动脚本的工作方式,让一些基本的服务能够起来。

3) 继续编译rpm包。重点是之前遗留下来的问题包还有与yast相关的一些包。这个应该是很耗时的工作。

4) 安装所有编译出来的rpm包到基系统上,替换交叉编译出来的那些二进制文件和配置文件,完成一个真正的opensuse系统。

5) 把系统拷贝到gdium上,让其能够正常运行。

6) 整理各种文档。

2、进度安排

  • 5月9 ~ 5月15 : 完成任务1
  • 5月16 ~ 6月15 : 完成任务2 。任务2是底线,就算之后的工作没时间或无法完成,任务2也一定要完成。
  • 6月16 ~ 6月30 : 完成任务3大部分包
  • 7月1 ~ 7月10 : 完成中期检查,总结之前的工作
  • 7月11 ~ 7月15 : 完成任务3
  • 7月16 ~ 7月31 : 完成任务4
  • 8月1 ~ 8月10 : 完成任务5
  • 8月11 ~ 8月20 : 完成任务6

3、重要的时间点

  • 5月15 : Deadline to return tax form and proof of enrollment if you want to be paid as part of the initial program payments
  • 7 月1 : Deadline to return tax form and proof of enrollment if you want to be paid as part of the second batch of program payments
  • 7月13 : Mid-term evaluations deadline
  • 8月10 : Suggested 'pencils down' date. Take a week to scrub code, write tests, improve documentation, etc.
  • 8月14 : Deadline to return tax form and proof of enrollment if you want to be paid for participation in the Google Summer of Code 2009 program
  • 8月24 : Final evaluation deadline
  • 8月25 : Final results of GSoC 2009 announced
  • 9月3 : Students can begin submitting required code samples to Google

六、详细描述实现方法(已过时)

目前完成的内容可以分为四步
  • 建立交叉编译环境
  • 交叉编译可启动、可使用rpm命令的基本系统

  • 建立qemu虚拟编译环境
  • 在qemu模拟的debian系统中编译rpm包

(以下都是具体的过程步骤,再无其他内容)

1、建立交叉编译环境

首先要准备一个空白分区,我这里用的是sda10,并挂载到了/media/sda10
建立用户并准备环境
sudo groupadd lfs
sudo useradd -s /bin/bash -g lfs -m -k /dev/null lfs
sudo passwd lfs
sudo chown lfs:lfs /media/sda10/* -R
sudo su - lfs
cat > ~/.bashrc << "EOF"
set +h
umask 022
export TARGET_DIR=/media/sda10
export LC_ALL=POSIX
export CROSS_HOST="i386-unknow-linux-gnu"
export CROSS_TARGET="mipsel-unknown-linux-gnu"
export PATH=${TARGET_DIR}/cross-tools/bin:/bin:/usr/bin
unset CFLAGS
unset CXXFLAGS
EOF
source ~/.bash_profile

根据《手把手》中的说明,下载必要的源码和补丁,并建立一些必要的文件
一下命令都是以$TARGET_DIR/build这个目录作为当前目录的

安装内核头文件
tar xf ../source/kernel/linux-2.6.26.tar.bz2
cd linux-2.6.26/
make mrproper
make ARCH=mips headers_check
make ARCH=mips INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* ${TARGET_DIR}/usr/include
cd ..
rm linux-2.6.26/ -rf

安装binutils交叉工具
tar xf ../source/loongson/binutils-2.18.50.tar.bz2
cd binutils-2.18.50/
patch -Np1 -i ../../source/patches/2fpatch/binutils-2.18.50-loongson-2f-3.patch
mkdir -pv ../binutils-build
cd ../binutils-build
CC="gcc" AR="ar" ../binutils-2.18.50/configure --prefix=${TARGET_DIR}/cross-tools \
--build=${CROSS_HOST} --target=${CROSS_TARGET} --host=${CROSS_HOST} \
--enable-64-bit-bfd --with-sysroot=${TARGET_DIR} \
--disable-nls --enable-shared

make configure-host
make
make install
cp -v ../binutils-2.18.50/include/libiberty.h ${TARGET_DIR}/usr/include
cd ..
rm binutils-* -rf

目标系统glibc头文件
tar xf ../source/loongson/glibc-2.7.tar.bz2
cd glibc-2.7/
cp configure{,.orig}
sed -e 's/3.4/3.[0-9]/g' configure.orig > configure
tar xf ../../source/loongson/glibc-ports-2.7.tar.gz
mv glibc-ports-2.7 ports
patch -Np1 -i ../../source/patches/2fpatch/glibc-2.7-mips_fixes-1.patch
echo "" > ports/sysdeps/mips/mips64/n32/Makefile
echo "" > ports/sysdeps/mips/mips32/Makefile
sed -i 's/-mabi=$mips_config_abi//g' ports/sysdeps/mips/preconfigure
mkdir -pv ../glibc-build
cd ../glibc-build
echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache
echo "libc_cv_mips_tls=yes" >> config.cache
echo "install_root=${TARGET_DIR}" > configparms
CC="gcc" ../glibc-2.7/configure --prefix=/usr \
--host=${CROSS_TARGET} --build=${CROSS_HOST} \
--with-headers=${TARGET_DIR}/usr/include --cache-file=config.cache

make install-headers
install -dv ${TARGET_DIR}/usr/include/bits
touch ${TARGET_DIR}/usr/include/bits/stdio_lim.h
touch ${TARGET_DIR}/usr/include/gnu/stubs.h
cp -v ../glibc-2.7/ports/sysdeps/unix/sysv/linux/mips/nptl/bits/pthreadtypes.h \
${TARGET_DIR}/usr/include/bits
cd ..
rm glibc-* -rf


GCC交叉工具(仅支持C语言)

sed -i 's/include-fixed/include/g' fixincludes/mkheaders.in gcc/Makefile.in
mkdir -pv ../gcc-build
cd ../gcc-build
../gcc-4.4-20090407/configure --prefix=${TARGET_DIR}/cross-tools \
--host=${CROSS_HOST} --build=${CROSS_HOST} --target=${CROSS_TARGET} \
--with-sysroot=${TARGET_DIR} \
--disable-multilib \
--disable-nls --disable-shared --disable-threads --enable-languages=c

make all-target-libgcc
make install-gcc
make install-target-libgcc

目标系统的glibc
tar xf ../source/loongson/glibc-2.7.tar.bz2
cd glibc-2.7/
tar xf ../../source/loongson/glibc-ports-2.7.tar.gz
mv glibc-ports-2.7 ports
patch -Np1 -i ../../source/patches/2fpatch/glibc-2.7-libgcc_eh-1.patch
patch -Np1 -i ../../source/patches/2fpatch/glibc-2.7-localedef_segfault-1.patch
patch -Np1 -i ../../source/patches/2fpatch/glibc-2.7-cross_hacks-1.patch
patch -Np1 -i ../../source/patches/2fpatch/glibc-2.7-mips_fixes-1.patch
patch -Np1 -i ../../source/patches/2fpatch/glibc-2.7-gcc4.4-mips_fixes-1.patch
echo "" > ports/sysdeps/mips/mips64/n64/Makefile
echo "" > ports/sysdeps/mips/mips64/n32/Makefile
echo "" > ports/sysdeps/mips/mips32/Makefile
sed -i '/default) machine=/s/n32/64/g' ports/sysdeps/mips/preconfigure
如果是gcc4.3那么关于inline的定义有变化,做一个dirty的patch
或者在后来做?
echo "libc_cv_gnu89_inline=yes" >> config.cache
if test "$(gcc -dumpversion 2>&1 | cut -d'.' -f1,2)" = "4.3"; then
echo "founded gcc ver4.3! apply dirty patch"
sed -i 's/^const struct keyword_t \*$/static &/' locale/programs/charmap-kw.h
sed -i 's/^const struct keyword_t \*$/static &/' locale/programs/locfile-kw.h
fi
mkdir -pv ../glibc-build
cd ../glibc-build
echo "libc_cv_forced_unwind=yes" > config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache
echo "libc_cv_mips_tls=yes" >> config.cache
echo "libc_cv_slibdir=/lib" >> config.cache
echo "install_root=${TARGET_DIR}" > configparms
echo "libdir=/usr/lib" >> configparms
BUILD_CC="gcc" CC="${CROSS_TARGET}-gcc ${BUILD_ARCH} ${BUILD_MABI}" AR="${CROSS_TARGET}-ar" \
RANLIB="${CROSS_TARGET}-ranlib" ../glibc-2.7/configure --prefix=/usr \
--libexecdir=/usr/lib/glibc --host=${CROSS_TARGET} --build=${CROSS_HOST} \
--disable-profile --enable-add-ons --with-tls --enable-kernel=2.6.26 \
--with-__thread --with-binutils=${TARGET_DIR}/cross-tools/bin \
--with-headers=${TARGET_DIR}/usr/include --cache-file=config.cache
make
make install
make localedata/install-locales
cat > ${TARGET_DIR}/etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF

cp -v --remove-destination ${TARGET_DIR}/usr/share/zoneinfo/Asia/Shanghai \
${TARGET_DIR}/etc/localtime

cat > ${TARGET_DIR}/etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
# End /etc/ld.so.conf
EOF

GCC交叉工具(支持c和c++语言)
sed -i 's/include-fixed/include/g' fixincludes/mkheaders.in gcc/Makefile.in
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.4-20090407/configure --prefix=${TARGET_DIR}/cross-tools --host=${CROSS_HOST} \
--build=${CROSS_HOST} --target=${CROSS_TARGET} --with-sysroot=${TARGET_DIR} \
--disable-nls --enable-shared --enable-__cxa_atexit \
--disable-multilib \
--enable-c99 --enable-long-long --enable-threads=posix --enable-languages=c,c++

make
make install

File软件包
tar xf ../source/loongson/file-4.24.tar.bz2
cd file-4.24/
./configure --prefix=${TARGET_DIR}/cross-tools
make
make install
cd ..
rm ./file-4.24/ -rf

Groff软件包
tar xf ../source/loongson/groff-1.19.2.tar.gz
cd groff-1.19.2/
PAGE=A4 ./configure --prefix=${TARGET_DIR}/cross-tools --without-x
make
make install
cd ..
rm groff-1.19.2/ -rf

Shadow软件包
tar xf ../source/loongson/shadow-4.0.18.1.tar.bz2
cd shadow-4.0.18.1/
patch -Np1 -i ../../source/patches/2fpatch/shadow-4.0.18.1-useradd_fix-2.patch
patch -Np1 -i ../../source/patches/2fpatch/shadow-4.0.18.1-sysroot_hacks-1.patch
echo "shadow_cv_passwd_dir=${TARGET_DIR}/bin" > config.cache
echo "ac_cv_func_lckpwdf=no" >> config.cache
./configure --prefix=${TARGET_DIR}/cross-tools --sbindir=${TARGET_DIR}/cross-tools/bin \
--sysconfdir=${TARGET_DIR}/etc --disable-shared --without-libpam --without-audit \
--without-selinux --program-prefix=${CROSS_TARGET}- --cache-file=config.cache

cp config.h{,.orig}
sed "/PASSWD_PROGRAM/s/passwd/${CROSS_TARGET}-&/" config.h.orig > config.h
make
make install
cd ..
rm shadow-4.0.18.1/ -rf

2、交叉编译可启动、可使用rpm命令的基本系统


环境设置
export CC="${CROSS_TARGET}-gcc ${BUILD_ARCH} ${BUILD_MABI}"
export CXX="${CROSS_TARGET}-g++ ${BUILD_ARCH} ${BUILD_MABI}"
export AR="${CROSS_TARGET}-ar"
export AS="${CROSS_TARGET}-as"
export RANLIB="${CROSS_TARGET}-ranlib"
export LD="${CROSS_TARGET}-ld"
export STRIP="${CROSS_TARGET}-strip"

将环境变量设置到~/.bashrc中,以方便重新进入时自动设置
echo "export CC=\"${CROSS_TARGET}-gcc ${BUILD_ARCH} ${BUILD_MABI}\"" >> ~/.bashrc
echo "export CXX=\"${CROSS_TARGET}-g++ ${BUILD_ARCH} ${BUILD_MABI}\"" >> ~/.bashrc
echo "export AR=\"${CROSS_TARGET}-ar\"" >> ~/.bashrc
echo "export AS=\"${CROSS_TARGET}-as\"" >> ~/.bashrc
echo "export RANLIB=\"${CROSS_TARGET}-ranlib\"" >> ~/.bashrc
echo "export LD=\"${CROSS_TARGET}-ld\"" >> ~/.bashrc
echo "export STRIP=\"${CROSS_TARGET}-strip\"" >> ~/.bashrc

安装GMP
tar xf ../source/loongson/gmp-4.2.2.tar.bz2
cd gmp-4.2.2/
patch -Np1 -i ../../source/patches/2fpatch/gmp-4.2.2-loongson-1.patch
./configure --host=${CROSS_TARGET} --prefix=/usr
make
make DESTDIR=${TARGET_DIR} install
cd ..
rm gmp-4.2.2/ -rf

安装MPFR
tar xf ../source/loongson/mpfr-2.3.1.tar.bz2
cd mpfr-2.3.1/
patch -Np1 -i ../../source/patches/2fpatch/mpfr-2.3.1-loongson-1.patch
patch -Np1 -i ../../source/patches/2fpatch/mpfr-2.3.1-rpath-1.patch
./configure --host=${CROSS_TARGET} --prefix=/usr
make
ln -s libmpfr.la .libs/libmpfr.lai
make DESTDIR=${TARGET_DIR} install
cd ..
rm mpfr-2.3.1/ -rf

安装coreutils
tar xf ../source/coreutils/coreutils-6.12.tar.gz
cd coreutils-6.12/
patch -Np1 -i ../../source/patches/2fpatch/coreutils-6.12-cross_compiler-1.patch
touch man/hostname.1 man/*.1
echo "fu_cv_sys_stat_statfs2_bsize=yes" > config.cache
echo "fu_cv_sys_stat_statvfs=yes" >> config.cache
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr \
--enable-install-program=hostname --enable-no-install-program=kill,uptime --cache-file=config.cache
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/usr/bin/{cat,chgrp,chmod,chown,cp,date} ${TARGET_DIR}/bin
mv -v ${TARGET_DIR}/usr/bin/{dd,df,echo,false,hostname,ln,ls,mkdir,mknod} ${TARGET_DIR}/bin
mv -v ${TARGET_DIR}/usr/bin/{mv,pwd,rm,rmdir,stty,true,uname} ${TARGET_DIR}/bin
mv -v ${TARGET_DIR}/usr/bin/chroot ${TARGET_DIR}/usr/sbin
mv -v ${TARGET_DIR}/usr/bin/{[,basename,head,install,nice} ${TARGET_DIR}/bin
mv -v ${TARGET_DIR}/usr/bin/{readlink,sleep,sync,test,touch} ${TARGET_DIR}/bin
ln -svf ../../bin/install ${TARGET_DIR}/usr/bin
cd ..
rm -rf coreutils-6.12

安装ncurses
tar xf ../source/loongson/ncurses-5.6.tar.bz2
cd ncurses-5.6/
patch -Np1 -i ../../source/patches/2fpatch/ncurses-5.6-bash_fix-1.patch
patch -Np1 -i ../../source/patches/2fpatch/ncurses-5.6-coverity_fixes-1.patch
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --with-shared \
--without-debug --without-ada --with-build-cc=gcc --libdir=/lib
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/lib/lib{panel,menu,form,ncurses,ncurses++,curses}.a ${TARGET_DIR}/usr/lib
rm -v ${TARGET_DIR}/lib/lib{ncurses,menu,panel,form,curses}.so
ln -svf ../../lib/libncurses.so.5 ${TARGET_DIR}/usr/lib/libcurses.so
ln -svf ../../lib/libncurses.so.5 ${TARGET_DIR}/usr/lib/libncurses.so
ln -svf ../../lib/libmenu.so.5 ${TARGET_DIR}/usr/lib/libmenu.so
ln -svf ../../lib/libpanel.so.5 ${TARGET_DIR}/usr/lib/libpanel.so
ln -svf ../../lib/libform.so.5 ${TARGET_DIR}/usr/lib/libform.so
chmod -v 755 ${TARGET_DIR}/lib/lib{panel,menu,form,ncurses}.so.5.6
cd ..
rm -rf ncurses-5.6

安装procps
tar xf ../source/loongson/procps-3.2.7.tar.gz
cd procps-3.2.7/
cp -v Makefile{,.orig}
sed -e "/^install :=/s/--owner 0 --group 0//" \
-e "/^ldconfig :=/s/= ldconfig/=/" Makefile.orig > Makefile
make
make DESTDIR=${TARGET_DIR} lib64=lib install
cd ..
rm procps-3.2.7/ -rf

安装readline
tar xf ../source/loongson/readline-5.2.tar.gz
cd readline-5.2/
patch -Np1 -i ../../source/patches/2fpatch/readline-5.2-fixes-5.patch
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --libdir=/lib
make SHLIB_XLDFLAGS=-lncurses
make DESTDIR=${TARGET_DIR} install
chmod -v 755 ${TARGET_DIR}/lib/lib{readline,history}.so*
mv -v ${TARGET_DIR}/lib/lib{readline,history}.a ${TARGET_DIR}/usr/lib
rm -v ${TARGET_DIR}/lib/lib{readline,history}.so
ln -svf ../../lib/libreadline.so.5 ${TARGET_DIR}/usr/lib/libreadline.so
ln -svf ../../lib/libhistory.so.5 ${TARGET_DIR}/usr/lib/libhistory.so
cd ..
rm -rf readline-5.2

安装bash
tar xf ../source/loongson/bash-3.2.tar.gz
cd bash-3.2/
tar xf ../../source/loongson/bash-doc-3.2.tar.gz
patch -Np1 -i ../../source/patches/2fpatch/bash-3.2-fixes-7.patch
echo "bash_cv_sys_named_pipes=yes" > config.cache
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --bindir=/bin \
--cache-file=config.cache --without-bash-malloc --with-installed-readline
make
make DESTDIR=${TARGET_DIR} htmldir=/usr/share/doc/bash-3.2 install
ln -sv bash ${TARGET_DIR}/bin/sh
cd ..
rm -rf bash-3.2

安装bzip2
tar xf ../source/loongson/bzip2-1.0.5.tar.gz
cd bzip2-1.0.5/
patch -Np1 -i ../../source/patches/2fpatch/bzip2-1.0.5-install_docs-1.patch
cp Makefile{,.orig}
sed -e "/^all:/s/ test//" Makefile.orig > Makefile
make -f Makefile-libbz2_so CC="${CC}" AR="${AR}" RANLIB="${RANLIB}"
make clean
make CC="${CC}" AR="${AR}" RANLIB="${RANLIB}"
make PREFIX=${TARGET_DIR}/usr install
cp -v bzip2-shared ${TARGET_DIR}/bin/bzip2
cp -av libbz2.so* ${TARGET_DIR}/lib
ln -sv ../../lib/libbz2.so.1.0 ${TARGET_DIR}/usr/lib/libbz2.so
rm -v ${TARGET_DIR}/usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 ${TARGET_DIR}/bin/bunzip2
ln -sv bzip2 ${TARGET_DIR}/bin/bzcat
cd ..
rm -rf bzip2-1.0.5

安装gzip
tar xf ../source/loongson/gzip-1.3.12.tar.gz
cd gzip-1.3.12/
sed -i 's/futimens/gl_&/' gzip.c lib/utimens.{c,h}
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/usr/bin/gzip ${TARGET_DIR}/bin
rm -v ${TARGET_DIR}/usr/bin/{gunzip,zcat}
ln -sv gzip ${TARGET_DIR}/bin/gunzip
ln -sv gzip ${TARGET_DIR}/bin/zcat
ln -sv gzip ${TARGET_DIR}/bin/compress
ln -sv gunzip ${TARGET_DIR}/bin/uncompress
cd ..
rm -rf gzip-1.3.12


安装findutils
tar xf ../source/loongson/findutils-4.2.33.tar.gz
cd findutils-4.2.33/
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr \
--libexecdir=/usr/lib/locate --localstatedir=/var/lib/locate
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/usr/bin/find ${TARGET_DIR}/bin
cp ${TARGET_DIR}/usr/bin/updatedb{,.orig}
sed 's@find:=${BINDIR}@find:=/bin@' ${TARGET_DIR}/usr/bin/updatedb.orig \
> ${TARGET_DIR}/usr/bin/updatedb
rm ${TARGET_DIR}/usr/bin/updatedb.orig
cd ..
rm -rf findutils-4.2.33

安装gettext
tar xf ../source/loongson/gettext-0.16.1.tar.gz
cd gettext-0.16.1/
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr
make
make DESTDIR=${TARGET_DIR} install
cd ..
rm -rf gettext-0.16.1

安装grep
tar xf ../source/loongson/grep-2.5.3.tar.bz2
cd grep-2.5.3/
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --bindir=/bin \
--disable-perl-regexp
make
make DESTDIR=${TARGET_DIR} install
cd ..
rm -rf grep-2.5.3

安装inetutils
tar xf ../source/loongson/inetutils-1.5.tar.gz
cd inetutils-1.5/
patch -Np1 -i ../../source/patches/2fpatch/inetutils-1.5-no_server_man_pages-2.patch
for dir in ping rcp rlogin rsh; do
cp ${dir}/Makefile.in{,.orig}
sed '/^SUIDMODE =/s/-o root//' ${dir}/Makefile.in.orig > ${dir}/Makefile.in
done
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --libexecdir=/usr/sbin \
--sysconfdir=/etc --localstatedir=/var --disable-logger --disable-syslogd \
--disable-whois --disable-servers
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/usr/bin/ping{,6} ${TARGET_DIR}/bin
mv $TARGET_DIR/usr/bin/ifconfig $TARGET_DIR/sbin
cd ..
rm -rf inetutils-1.5

安装iproute2
tar xf ../source/loongson/iproute2-2.6.26.tar.bz2
cd iproute2-2.6.26/
for dir in ip misc tc; do
cp ${dir}/Makefile{,.orig}
sed 's/0755 -s/0755/' ${dir}/Makefile.orig > ${dir}/Makefile
done
cp misc/Makefile{,.orig}
sed '/^TARGETS/s@arpd@@g' misc/Makefile.orig > misc/Makefile
make CC="${CC}" SBINDIR=/sbin
make DESTDIR=${TARGET_DIR} SBINDIR=/sbin install
cd ..
rm -rf iproute2-2.6.26

安装less
tar xf ../source/loongson/less-418.tar.gz
cd less-418/
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --sysconfdir=/etc
make
make prefix=${TARGET_DIR}/usr install
mv -v ${TARGET_DIR}/usr/bin/less ${TARGET_DIR}/bin
cd ..
rm -rf less-418

安装zlib
tar xf ../source/loongson/zlib-1.2.3.tar.gz
cd zlib-1.2.3/
patch -Np1 -i ../../source/patches/2fpatch/zlib-1.2.3-fPIC-1.patch
./configure --prefix=/usr --shared
make AR="${AR} rc"
make prefix=${TARGET_DIR}/usr install
mv -v ${TARGET_DIR}/usr/lib/libz.so.* ${TARGET_DIR}/lib
ln -svf ../../lib/libz.so.1 ${TARGET_DIR}/usr/lib/libz.so
chmod -v 644 ${TARGET_DIR}/usr/lib/libz.a
cd ..
rm -rf zlib-1.2.3

安装module-init-tools
tar xf ../source/module-init-tools/module-init-tools-3.4.tar.bz2
cd module-init-tools-3.4/
patch -Np1 -i ../../source/patches/2fpatch/module-init-tools-3.4-manpages-1.patch
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/ --enable-zlib
make
make DESTDIR=${TARGET_DIR} INSTALL=install install
cd ..
rm -rf module-init-tools-3.4

安装psmisc
tar xf ../source/loongson/psmisc-22.6.tar.gz
cd psmisc-22.6/
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --exec-prefix=""
patch -Np1 -i ../../source/patches/2fpatch/psmisc-22.6-fixes-1.patch
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/bin/pstree* ${TARGET_DIR}/usr/bin
ln -sv killall ${TARGET_DIR}/bin/pidof
cd ..
rm -rf psmisc-22.6

安装shadow
tar xf ../source/loongson/shadow-4.0.18.1.tar.bz2
cd shadow-4.0.18.1/
patch -Np1 -i ../../source/patches/2fpatch/shadow-4.0.18.1-useradd_fix-2.patch
echo "ac_cv_func_setpgrp_void=yes" > config.cache
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --libdir=/lib --sysconfdir=/etc \
--enable-shared --without-libpam --without-audit --without-selinux \
--cache-file=config.cache
cp src/Makefile{,.orig}
sed 's/groups$(EXEEXT) //' src/Makefile.orig > src/Makefile
cp man/Makefile{,.orig}
sed -e '/groups1.xml/d' -e 's/groups.1//' man/Makefile.orig > man/Makefile
make
make DESTDIR=${TARGET_DIR} install
cp ${TARGET_DIR}/etc/login.defs login.defs.orig
sed -e 's@#MD5_CRYPT_ENAB.no@MD5_CRYPT_ENAB yes@' -e 's@/var/spool/mail@/var/mail@' \
login.defs.orig > ${TARGET_DIR}/etc/login.defs
mv -v ${TARGET_DIR}/usr/bin/passwd ${TARGET_DIR}/bin
mv -v ${TARGET_DIR}/lib/libshadow.*a ${TARGET_DIR}/usr/lib
rm -v ${TARGET_DIR}/lib/libshadow.so
ln -svf ../../lib/libshadow.so.0 ${TARGET_DIR}/usr/lib/libshadow.so
${CROSS_TARGET}-pwconv
${CROSS_TARGET}-grpconv
${CROSS_TARGET}-passwd root
输入root密码
cd ..
rm -rf shadow-4.0.18.1

安装sysklogd
tar xf ../source/loongson/sysklogd-1.5.tar.gz
cd sysklogd-1.5/
cp Makefile{,.orig}
sed -e 's/-o ${MAN_USER} -g ${MAN_GROUP}//' -e 's/500 -s/500/' Makefile.orig > Makefile
make CC="${CC}"
make prefix=${TARGET_DIR} install
cd ..
rm -rf sysklogd-1.5
cat > ${TARGET_DIR}/etc/syslog.conf << "EOF"
# Begin /etc/syslog.conf
auth,authpriv.* -/var/log/auth.log
*.*;auth,authpriv.none -/var/log/sys.log
daemon.* -/var/log/daemon.log
kern.* -/var/log/kern.log
mail.* -/var/log/mail.log
user.* -/var/log/user.log
*.info;mail.none;authpriv.none;cron.none -/var/log/messages
*.emerg
*
# log the bootscript output:
local2.* -/var/log/boot.log

# End /etc/syslog.conf
EOF

File软件包
tar xf ../source/loongson/file-4.24.tar.bz2
cd file-4.24/
./configure --prefix=${TARGET_DIR}/cross-tools
make
make install
cd ..
rm ./file-4.24/ -rf

Groff软件包
tar xf ../source/loongson/groff-1.19.2.tar.gz
cd groff-1.19.2/
PAGE=A4 ./configure --prefix=${TARGET_DIR}/cross-tools --without-x
make
make install
cd ..
rm groff-1.19.2/ -rf

安装e2fsprogs
tar xf ../source/loongson/e2fsprogs-1.41.0.tar.gz
cd e2fsprogs-1.41.0/
patch -Np1 -i ../../source/patches/2fpatch/e2fsprogs-1.41.0-linux-gcc4.4-1.patch
mkdir -v build
cd build
../configure \
--build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --with-root-prefix="" \
--enable-elf-shlibs --disable-evms
make
make DESTDIR=${TARGET_DIR} install
make DESTDIR=${TARGET_DIR} install-libs
cd ../..
rm -rf e2fsprogs-1.41.0


安装util-linux-ng
tar xf ../source/loongson/util-linux-ng-2.13.1.1.tar.bz2
cd util-linux-ng-2.13.1.1/
cp hwclock/hwclock.c{,.orig}
sed 's@etc/adjtime@var/lib/hwclock/adjtime@g' hwclock/hwclock.c.orig > hwclock/hwclock.c
mkdir -pv ${TARGET_DIR}/var/lib/hwclock
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} \
--enable-partx --disable-wall --enable-write \
--disable-makeinstall-chown
make
make DESTDIR=${TARGET_DIR} install
mv -v ${TARGET_DIR}/usr/bin/logger ${TARGET_DIR}/bin
cd ..
rm -r util-linux-ng-2.13.1.1

Shadow软件包
tar xf ../source/loongson/shadow-4.0.18.1.tar.bz2
cd shadow-4.0.18.1/
patch -Np1 -i ../../source/patches/2fpatch/shadow-4.0.18.1-useradd_fix-2.patch
patch -Np1 -i ../../source/patches/2fpatch/shadow-4.0.18.1-sysroot_hacks-1.patch
echo "shadow_cv_passwd_dir=${TARGET_DIR}/bin" > config.cache
echo "ac_cv_func_lckpwdf=no" >> config.cache
./configure --prefix=${TARGET_DIR}/cross-tools --sbindir=${TARGET_DIR}/cross-tools/bin \
--sysconfdir=${TARGET_DIR}/etc --disable-shared --without-libpam --without-audit \
--without-selinux --program-prefix=${CROSS_TARGET}- --cache-file=config.cache

cp config.h{,.orig}
sed "/PASSWD_PROGRAM/s/passwd/${CROSS_TARGET}-&/" config.h.orig > config.h
make
make install
cd ..
rm shadow-4.0.18.1/ -rf

安装tar
tar xf ../source/loongson/tar-1.20.tar.bz2
cd tar-1.20/
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --bindir=/bin \
--libexecdir=/usr/sbin
make
make DESTDIR=${TARGET_DIR} install
cd ..
rm -rf tar-1.20

安装udev
cp -r ../source/rpmbuild/udev-128/ .
cd udev-128/
find . -name "*.[78]" -exec touch '{}' \;
./configure \
--prefix=/usr \
--exec-prefix= \
--sysconfdir=/etc \
--with-libdir-name=lib \
--with-selinux \
CFLAGS="-O2" --build=i386-cross-linux-gnu --host=mipsel-unknown-linux-gnu
make
make DESTDIR=$TARGET_DIR install
mkdir -p $TARGET_DIR/usr/bin
ln -s ../../sbin/udevadm $TARGET_DIR/usr/bin/udevinfo
ln -s udevadm $TARGET_DIR/sbin/udevsettle
cp rules/packages/64-device-mapper.rules $TARGET_DIR/lib/udev/rules.d/
cp rules/packages/64-md-raid.rules $TARGET_DIR/lib/udev/rules.d/
cp rules/packages/40-zaptel.rules $TARGET_DIR/lib/udev/rules.d/
cp rules/suse/*.rules $TARGET_DIR/lib/udev/rules.d/
install -m755 -D $TARGET_DIR/source/rpmbuild/boot.udev $TARGET_DIR/etc/init.d/boot.udev
install -m755 -D $TARGET_DIR/source/rpmbuild/boot.udev_retry $TARGET_DIR/etc/init.d/boot.udev_retry
install -m644 -D $TARGET_DIR/source/rpmbuild/pnp-aliases $TARGET_DIR/etc/modprobe.d/pnp-aliases
mkdir -p $TARGET_DIR/lib/udev/devices
mkdir -p $TARGET_DIR/lib/udev/devices/pts
mkdir -p $TARGET_DIR/lib/udev/devices/shm
mkdir -p $TARGET_DIR/lib/udev/devices/net
ln -sn /proc/self/fd/ $TARGET_DIR/lib/udev/devices/fd
ln -sn /proc/self/fd/0 $TARGET_DIR/lib/udev/devices/stdin
ln -sn /proc/self/fd/1 $TARGET_DIR/lib/udev/devices/stdout
ln -sn /proc/self/fd/2 $TARGET_DIR/lib/udev/devices/stderr
ln -sn /proc/kcore $TARGET_DIR/lib/udev/devices/core
cd ..
rm udev-128/ -rf

安装vim
tar xf ../source/loongson/vim-7.2.tar.bz2
tar xf ../source/loongson/vim-7.2-extra.tar.gz
tar xf ../source/loongson/vim-7.2-lang.tar.gz
cd vim72
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
echo "vim_cv_toupper_broken=yes" > src/auto/config.cache
echo "vim_cv_terminfo=yes" >> src/auto/config.cache
echo "vim_cv_tty_group=yes" >> src/auto/config.cache
echo "vim_cv_tty_mode=yes" >> src/auto/config.cache
echo "vim_cv_getcwd_broken=yes" >> src/auto/config.cache
echo "vim_cv_stat_ignores_slash=yes" >> src/auto/config.cache
echo "ac_cv_sizeof_int=4" >> src/auto/config.cache
echo "vim_cv_memmove_handles_overlap=yes" >> src/auto/config.cache
./configure --build=${CROSS_HOST} --host=${CROSS_TARGET} --prefix=/usr --enable-multibyte \
--enable-gui=no --disable-gtktest --disable-xim --with-features=normal \
--disable-gpm --without-x --disable-netbeans --with-tlib=ncurses --cache-file=config.cache
make
make DESTDIR=${TARGET_DIR} install
ln -sv vim ${TARGET_DIR}/usr/bin/vi
ln -sv ../vim/vim72/doc ${TARGET_DIR}/usr/share/doc/vim-7.2
cd ..
rm -rf vim72
cat > ${TARGET_DIR}/etc/vimrc << "EOF"
" Begin /etc/vimrc
set nocompatible
set backspace=2
syntax on
if (&term == "iterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF

安装libsepol
tar xf ../source/libsepol/libsepol-2.0.32.tar.bz2
cd libsepol-2.0.32/
make
make DESTDIR=${TARGET_DIR} install
cd ..
安装libselinux
tar xf ../source/libselinux/libselinux-2.0.71.tar.bz2
cd libselinux-2.0.71/
cp -v src/Makefile{,.orig}
sed -e 's/^TLSFLAGS/#TLSFLAGS/' src/Makefile.orig > src/Makefile
make
make DESTDIR=${TARGET_DIR} install
cd ..

安装sysvinit
首先把rpmbuild -bp命令产生的源码cp到build目录
export CFLAGS="-Wall -O2 -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE -D__NO_STRING_INLINES -pipe"
cp -v src/Makefile src/Makefile.orig
sed -e 's@/dev/initctl@$(ROOT)&@g' -e 's@\(mknod \)-m \([0-9]* \)\(.* \)p@\1\3p; chmod \2\3@g' \
-e '/^ifeq/s/$(ROOT)//' -e 's@/usr/lib@$(ROOT)&@' src/Makefile.orig > src/Makefile
make -C src CFLAGS="$CFLAGS" CC="$CC"
pushd contrib/
$CC $CFLAGS -o start-stop-daemon start-stop-daemon.c
popd
pushd ../powerd-2.0.2
./configure --prefix= --bindir='$(TARGET_DIR)/sbin' \
--mandir='$(TARGET_DIR)/usr/share/man' \
--sbindir='$(TARGET_DIR)/sbin' --build=${CROSS_HOST} --host=${CROSS_TARGET}
make CFLAGS="-I../sysvinit-2.86/src $CFLAGS" CC="$CC"
popd
pushd ../startpar-0.52
make CFLAGS="$CFLAGS" CC="$CC"
popd
make install -C src MANPATH=/usr/share/man ROOT=${TARGET_DIR}
install contrib/start-stop-daemon ${TARGET_DIR}/sbin/
test -p ${TARGET_DIR}/dev/initctl || {
rm -f ${TARGET_DIR}/dev/initctl
mknod ${TARGET_DIR}/dev/initctl p
chmod 600 ${TARGET_DIR}/dev/initctl
}
pushd ../powerd-2.0.2
make install DESTDIR=${TARGET_DIR}
cp README README.powerd
cp SUPPORTED SUPPORTED.powerd
cp FAQ FAQ.powerd
echo '# ' > ${TARGET_DIR}/etc/powerd.conf
echo '# /etc/powerd.conf for powerd version-2.02' >> ${TARGET_DIR}/etc/powerd.conf
echo '# ' >> ${TARGET_DIR}/etc/powerd.conf
echo '# read manual page of detectups(8) and powerd(8) its self.' >> ${TARGET_DIR}/etc/powerd.conf
echo '# ' >> ${TARGET_DIR}/etc/powerd.conf
mkdir -p ${TARGET_DIR}/etc/init.d
install -m 0744 ${TARGET_DIR}/source/rpmbuild/rc.powerd ${TARGET_DIR}/etc/init.d/powerd
popd
pushd ../startpar-0.52
make install DESTDIR=${TARGET_DIR}
popd
install -d $TARGET_DIR/lib/mkinitrd/scripts
install -m 0755 ${TARGET_DIR}/source/rpmbuild/mkinitrd-boot.sh $TARGET_DIR/lib/mkinitrd/scripts/boot-blogd.sh
install -m 0755 ${TARGET_DIR}/source/rpmbuild/mkinitrd-kill1.sh $TARGET_DIR/lib/mkinitrd/scripts/boot-killblogd.sh
install -m 0755 ${TARGET_DIR}/source/rpmbuild/mkinitrd-kill2.sh $TARGET_DIR/lib/mkinitrd/scripts/boot-killblogd2.sh
mknod -m 0640 ${TARGET_DIR}/dev/blog p
unset CFLAGS

安装mingetty
cp -r ../source/rpmbuild/mingetty-1.0.7s/ .
cd mingetty-1.0.7s/
make RPM_OPT_FLAGS="-O2 -D_FILE_OFFSET_BITS=64" DEFTERM=linux CC="$CC"
mkdir -p ${TARGET_DIR}{/sbin,/usr/share/man/man8}
make install MANPATH=/usr/share/man DESTDIR=${TARGET_DIR}
cd ..
rm mingetty-1.0.7s/ -rf

安装lzma-utils
cp -r $TARGET_DIR/source/rpmbuild/lzma-utils $TARGET_DIR/build
pushd $TARGET_DIR/build/lzma-utils
export CFLAGS="-O2" CXXFLAGS="-O2"
./configure --with-pic --disable-rpath --enable-werror --disable-shared --build=i386-cross-linux-gnu --host=mipsel-unknown-linux-gnu
make CC="$CC"
make install DESTDIR=$TARGET_DIR
unset CFLAGS CXXFLAGS
popd
rm -rf $TARGET_DIR/build/lzma-utils

安装elfutils
cp -r $TARGET_DIR/source/rpmbuild/elfutils-0.137 $TARGET_DIR/build
pushd $TARGET_DIR/build/elfutils-0.137
autoreconf -fi
./configure --program-prefix=eu- --build=i386-cross-linux-gnu --host=mipsel-suse-linux-gnu
cp Makefile Makefile.orig
sed -e '/^SUBDIRS/s/libebl//' -e '/^SUBDIRS/s/libcpu//' -e '/^SUBDIRS/s/backends//' Makefile.orig > Makefile
make CC="$CC"
make DESTDIR=$TARGET_DIR install
popd
rm -rf $TARGET_DIR/build/elfutils-0.137

安装rpm
cp -r $TARGET_DIR/source/rpmbuild/rpm-4.4.2.3 $TARGET_DIR/build
pushd $TARGET_DIR/build/rpm-4.4.2.3
export CFLAGS="-O2 -fno-strict-aliasing -ffunction-sections"
export LDFLAGS="-Wl,-Bsymbolic-functions -ffunction-sections"
rm -rf zlib
cp $TARGET_DIR/usr/share/gettext/config.rpath .
cp popt/autogen.sh beecrypt
cp popt/autogen.sh file
./autogen.sh --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --libdir=/usr/lib --sysconfdir=/etc --localstatedir=/var --with-lua --with-selinux --enable-shared --build=i386-cross-linux-gnu --host=mipsel-suse-linux-gnu --without-python
rm po/de.gmo
patch -Np1 -i ../../source/patches/mypatch/rpm-4.4.2.3-cross.patch
cp -v file/magic/Makefile file/magic/Makefile.orig
sed -e "/-C -m /s/\/src\/file/\/cross-tools\/bin\/file/" -e "/-C -m /s/top_builddir/TARGET_DIR/" file/magic/Makefile.orig > file/magic/Makefile
make
mkdir -p $TARGET_DIR/usr/lib
mkdir -p $TARGET_DIR/usr/share/locale
ln -s ../share/locale $TARGET_DIR/usr/lib/locale
make DESTDIR="$TARGET_DIR" install
rm -f $TARGET_DIR/usr/lib/libpopt.a $TARGET_DIR/usr/lib/libpopt.la
for f in $TARGET_DIR/usr/lib/*.la; do
sed -i -e "s,/usr/lib/libpopt.la,-lpopt,g" $f
done
mkdir -p $TARGET_DIR/etc/init.d
install -m 755 $TARGET_DIR/source/rpmbuild/rpmconfigcheck $TARGET_DIR/etc/init.d
mkdir -p $TARGET_DIR/usr/sbin
ln -sf ../../etc/init.d/rpmconfigcheck $TARGET_DIR/usr/sbin/rcrpmconfigcheck
cp -a $TARGET_DIR/source/rpmbuild/suse_macros $TARGET_DIR/usr/lib/rpm
mv $TARGET_DIR/usr/src/* $TARGET_DIR/usr/src/packages
mkdir -p $TARGET_DIR/var/lib/rpm
mkdir -p $TARGET_DIR/var/spool/repackage
rm -rf $TARGET_DIR/usr/include/beecrypt $TARGET_DIR/usr/lib/libbeecrypt*
gzip -9 $TARGET_DIR/usr/share/man/man[18]/*.[18]
export TARGET_DIR
chmod 755 doc/manual
rm -rf doc/manual/Makefile*
rm -f $TARGET_DIR/usr/lib/rpmpopt
rm -rf $TARGET_DIR/usr/share/man/{fr,ja,ko,pl,ru,sk}
rm -f $TARGET_DIR/usr/share/locale/de/LC_MESSAGES/rpm.mo
mkdir -p $TARGET_DIR/var/adm/fillup-templates
install -c -m 0644 $TARGET_DIR/source/rpmbuild/sysconfig.services-rpm $TARGET_DIR/var/adm/fillup-templates/
rm -f $TARGET_DIR/usr/lib/rpm/cpanflute $TARGET_DIR/usr/lib/rpm/cpanflute2
mv $TARGET_DIR/usr/src/packages/cross/* $TARGET_DIR/usr/src/packages/
rm -rf $TARGET_DIR/usr/src/packages/cross
find $TARGET_DIR/usr/src/packages/* -type d | sed -e "s@$TARGET_DIR@@" >> $TARGET_DIR/usr/lib/rpm/permlist
install -m 755 $TARGET_DIR/source/rpmbuild/rpmsort $TARGET_DIR/usr/lib/rpm
install -m 755 $TARGET_DIR/source/rpmbuild/symset-table $TARGET_DIR/usr/lib/rpm
install -m 755 scripts/find-supplements{,.ksyms} $TARGET_DIR/usr/lib/rpm
install -m 755 scripts/firmware.prov $TARGET_DIR/usr/lib/rpm
rm -f $TARGET_DIR/usr/lib/locale $TARGET_DIR/usr/lib/rpmrc
mkdir -p $TARGET_DIR/etc/rpm
chmod 755 $TARGET_DIR/etc/rpm
pushd $TARGET_DIR/usr/lib/rpm/
for f in rpm2cpio.sh rpm.daily rpmdiff* rpm.log rpm.xinetd freshen.sh u_pkg.sh \
magic magic.mgc magic.mime* rpmfile *.pl javadeps brp-redhat \
brp-strip-static-archive vpkg-provides*.sh http.req sql.req tcl.req \
rpmdb_* brp-sparc64-linux brp-strip-comment-note brp-java-gcjcompile
do
rm $f
done
for i in $TARGET_DIR/usr/share/automake-*/*; do
if test -f "$i" && test -f "${i##*/}"; then
rm -f "${i##*/}"
fi
done
popd
unset CFLAGS LDFLAGS
popd
rm -rf $TARGET_DIR/build/rpm-4.4.2.3

复制一些opensuse用到的配置文
cp $TARGET_DIR/source/rpmbuild/boot $TARGET_DIR/etc/init.d/
要修改inittab,只启动tty1,开启S0
cp $TARGET_DIR/source/rpmbuild/inittab $TARGET_DIR/etc
cp $TARGET_DIR/source/rpmbuild/rc $TARGET_DIR/etc/init.d
cp $TARGET_DIR/source/rpmbuild/rc.status $TARGET_DIR/etc/
cp $TARGET_DIR/source/rpmbuild/rc.splash $TARGET_DIR/etc/
cp $TARGET_DIR/source/rpmbuild/sysconfig-boot $TARGET_DIR/etc/sysconfig/boot
cp $TARGET_DIR/source/rpmbuild/initscript $TARGET_DIR/etc/
pushd $TARGET_DIR/etc/init.d/boot.d/
ln -sv ../boot.udev S02boot.udev
ln -sv ../boot.udev_retry S13boot.udev_retry
popd

建立必要的节点
pushd $TARGET_DIR/dev
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3
mknod -m 660 ttyS0 c 4 64
mknod -m 660 hda b 3 0
mknod -m 660 hda1 b 3 1
mknod -m 660 hda2 b 3 2
popd

为系统打包
sudo tar cjf /media/MOBILE3/snapshots/basesystem-opensuse_boot-rpm-ubuntu-090424.tar.bz2 . --exclude=build --exclude=cross-tools --exclude=qemu_debian --exclude=rpm.gery --exclude=source

3、建立qemu虚拟环境

创建一个img
qemu-img create -f qcow loongson2f.img 10G
用lfs的liveCD对这个img进行分区
qemu-system-x86_64 -hda loongson2f.img -cdrom lfslivecd-x86-6.3-r2160-nosrc.iso -m 256 -boot d -daemonize
进入到lfsliveCD之后
cfdisk /dev/hda
创建两个分区hda1是ext3文件系统,hda2是swap文件系统
mkfs.ext3 /dev/hda1
mkswap /dev/hda2
mkdir mnt
mount -t ext3 /dev/hda1 mnt
cd mnt
scp gery@59.64.153.106:/path/to/tarball .
tar xf basesystem-opensuse_boot-rpm-ubuntu-090424.tar.bz2
chown root:root ./* -R

然后scp debian的modules和kernel过来,最后启动这个系统
qemu-system-mipsel -M malta -kernel vmlinux-2.6.26-1-4kc-malta.debian -hda loongson2f.img -append "root=/dev/hda1 console=ttyS0" -nographic -m 256 -no-reboot

4、在qemu模拟的debian系统中编译rpm包

一个已经安装好的debian系统可以在这里下载。在debian中安装rpm,然后用rpmbuild -bb *.spec命令编译rpm包。

没有评论:

发表评论

关注者