welcome: please sign in
location: GentooPrefix

Gentoo Prefix

http://prefix.gentoo.org

http://issues.tuna.tsinghua.edu.cn/issue124

/!\ 本文档已经过时,Gentoo Prefix 已经使用新的 bootstrap 脚本,手动步骤更少了。http://thread.gmane.org/gmane.linux.gentoo.alt/6328

动机

ftp3 上的系统为 CentOS 4.9 ,软件比较古老,无法适应我们的快速开发。我们又不想冒然升级它,因此目前许多包是靠手动编译的,其中一但出现了依赖就会相当麻烦。

加入 Gentoo Prefix 就可以方便我们编译包。

参数

ftp3 上的 Gentoo Prefix 在 /home/gentoo ,用户与组为 ftpadm:ftpadm

Bootstrap

http://www.gentoo.org/proj/en/gentoo-alt/prefix/bootstrap-solaris.xml

成为 ftpadm 用户后 cd /home/gentoo

export EPREFIX="/home/gentoo"
export PATH="$EPREFIX/usr/bin:$EPREFIX/bin:$EPREFIX/tmp/usr/bin:$EPREFIX/tmp/bin:/usr/bin:/bin"
wget http://overlays.gentoo.org/proj/alt/browser/trunk/prefix-overlay/scripts/bootstrap-prefix.sh?format=txt -O bootstrap-prefix.sh
chmod +x bootstrap-prefix.sh

mirror 上有 gentoo destfiles 的 mirror. (注:destfiles 是 gentoo 用的一源代码包们,一般与 upstream 完全一样,只起一个缓存作用)

$ export GENTOO_MIRRORS=http://mirror.tuna.tsinghua.edu.cn/gentoo/distfiles

还要一些国外网的包,先在 tuna4 上搞一个临时的小代理

env http_proxy=http://tuna4.v4.wikithu.cn:8888 ./bootstrap-prefix.sh $EPREFIX tree
./bootstrap-prefix.sh $EPREFIX/tmp make
./bootstrap-prefix.sh $EPREFIX/tmp wget
./bootstrap-prefix.sh $EPREFIX/tmp sed
./bootstrap-prefix.sh $EPREFIX/tmp coreutils
./bootstrap-prefix.sh $EPREFIX/tmp findutils5
./bootstrap-prefix.sh $EPREFIX/tmp app-arch/tar
./bootstrap-prefix.sh $EPREFIX/tmp patch # ebuild dependence
./bootstrap-prefix.sh $EPREFIX/tmp grep
./bootstrap-prefix.sh $EPREFIX/tmp gawk # gcc build dependence
./bootstrap-prefix.sh $EPREFIX/tmp m4 # bison dependence
./bootstrap-prefix.sh $EPREFIX/tmp bison # bash dependence
./bootstrap-prefix.sh $EPREFIX/tmp bash # portage dependence
./bootstrap-prefix.sh $EPREFIX/tmp zlib # needed as python module

为 bash 创建一个 sh link. python 要一个 patch ,需要加上临时小代理,portage 也是

$ env http_proxy=http://tuna4.v4.wikithu.cn:8888 ./bootstrap-prefix.sh $EPREFIX/tmp python
$ env http_proxy=http://tuna4.v4.wikithu.cn:8888 ./bootstrap-prefix.sh $EPREFIX portage

注意,这里的 python 取消了非必须的模块以利 bootstrap

EXTRA_CONF="--without-system-ffi"
PYTHON_DISABLE_MODULES="_ctypes_test readline pyexpat dbm gdbm bsddb _curses _curses_panel _tkinter _elementtree _locale _sqlite3 bsddb185"

注意在编译 portage 的时候目录是 $EPREFIX 而不是 $EPREFIX/tmp .

以下凡是需要上国外网的时候就套个代理下载,不再赘述。

有了 portage 之后,我们刚才下载的临时小脚本 ./bootstrap-prefix.sh 就可以扔到一边了。portage 的环境变量跟 bootstrap-prefix.sh 还有点小区别

export GENTOO_MIRRORS=http://mirror.tuna.tsinghua.edu.cn/gentoo

新的 portage 会默认使用 USE=nls ,我们先禁用它

emerge -1 sed

其中 "-1" 代表 "--oneshot",下面的 "-O" 代表 "--nodeps". 禁用 ncurses 的 cxx 和 unicode.

emerge -1O bash
emerge -1O xz-utils
emerge -1 "<=wget-1.13.4"

emerge -1O baselayout-prefix # depend on bash
emerge -1O m4
emerge -1O flex # depend on m4
emerge -1O bison
emerge -1O binutils-config # depend on bash
emerge -1O binutils
emerge -1O gcc-config
emerge -1O "=sys-devel/gcc-4.2*"

针对debian类系统出现$HOME/gentoo/usr/bin/ld: this linker was not configured to use sysroots类错误,需要编译binutils时增加"--with-sysroot"选项

EXTRA_ECONF="--with-sysroot" emerge -1O sys-devel/binutils

emerge -1 coreutils
emerge -1 findutils
emerge -1 app-arch/tar # pulls perl
emerge -1 grep
emerge -1 patch
emerge -1 gawk
emerge -1 make
emerge -1O file
emerge -1O eselect
emerge -1 pax-utils

用新的 portage 把之前由 ./bootstrap-prefix.sh 编译的 portage 覆盖掉。这需要减去 portage 的 collision-protect 功能,它默认不允许 portage 覆盖未被 index 的文件。

env FEATURES="-collision-protect" emerge --oneshot sys-apps/portage # pulls in python

系统已经编译得差不多了,删掉刚才的 tmp 目录。

rm -Rf $EPREFIX/tmp/*
hash -r

把 portage tree 更新一下,首先在 $EPREFIX/etc/make.conf 里面加入一行

SYNC="rsync://mirror.tuna.tsinghua.edu.cn/gentoo-portage-prefix"

然后同步

emerge --sync

把剩下的系统包都安上,顺便升级了

env USE=-git emerge -u system

现在我们有了新的 gcc ,在 $EPREFIX/etc/make.conf 中加入

USE="unicode nls"
CFLAGS="-O2 -pipe -march=nocona"
SYNC="rsync://ftp4.tuna.tsinghua.edu.cn/gentoo-portage-prefix"

查看 /proc/cpuinfo 的 flag:其中有 lm 代表它是 64bit 的 CPU,其中 pni 代表它支持 SSE3,因此使用 gcc 的 nocona 指令优化。

查看可用的 gcc 版本,并选择新的

[ftpadm@ftp3 gentoo]$ gcc-config -l
 [1] i686-pc-linux-gnu-4.2.4 *
 [2] i686-pc-linux-gnu-4.5.3
[ftpadm@ftp3 gentoo]$ gcc-config 2
 * Switching native-compiler to i686-pc-linux-gnu-4.5.3 ...

配置 distcc (optional)

http://www.gentoo.org/doc/en/distcc.xml

http://www.gentoo.org/doc/en/cross-compiling-distcc.xml

下面我们要用新的 gcc-4.5.3 把所有的系统包再编译一遍,在此之前,为了加快速度,上一个 distcc 。

emerge distcc

在 make.conf 中加入

MAKEOPTS="-j16"
FEATURES="distcc"

注:ftp3 上的 glibc 是石器时代的 2.3.4 ,与 tuna4 上的 glibc-2.12.2 很难一同 pump

配置参与编译的机器,在 $EPREFIX/etc/distcc/hosts 加入

localhost 166.111.111.74,cpp,lzo 210.25.130.226,cpp,lzo

注意同时在相应的机器打开 distcc daemon.

最后,把所有的系统包都重新编译一次

emerge -e system

生成一个辅助脚本

$ cd $EPREFIX/usr/portage/scripts
$ ./bootstrap-prefix.sh $EPREFIX startscript

创建了一个 $EPREFIX/startprefix

使用

修改 shell profile (optional)

下面是一个让自己的 shell 自动使用 gentoo prefix 的推荐作法,仅限 bash

在 $HOME/.bash_profile 里加入

EPREFIX=/home/gentoo
if [ -f ${EPREFIX}/startprefix ] && [[ $SHELL != "${EPREFIX}/bin/bash" ]]; then
    exec ${EPREFIX}/startprefix
fi

portage 的基本用法

注意以下所有操作都要以 ftpadm 身份进行

详见 portage, emerge 的 manpage


CategoryManual

GentooPrefix (2012-09-26 11:14:30由heroxbd编辑)