从零开始编译 Puppy

本文翻译自
http://bkhome.org/t2/index.html

翻译开始于大半年前,中间中断很长的一部分时间。原来是为了 minilinux.net 社区的论坛翻译的,中断前翻译到了“第六步:修正错误”(不含),未翻译完的帖子已经找不到,所以今晚把完整版发布在自己的博客上。

本人对 Puppy Linux 的经验为0,翻译有不当之处,请不吝指出。

全部手工翻译,没有通过机器进行“预处理”,文中提到的Logan即为本人。

在翻译本文之后,我发现下面译文
http://leedd.com/2009/07/puppy/
也翻译自同一篇文章,该译文前言部分提到
引用

因为开到之前在一些网站上有人已经翻译过前面的部分(很少的一部分),但是作者没有坚持翻译完,

即为本人之前的翻译,在 minilinux.net 的论坛中,原文链接已丢失。

从零开始编译 Puppy

前言
T2 项目由一组用于从源码包编译完整 Linux 发行版的 Bash 脚本组成。
Puppy Linux 是最小,最可爱,最易用和最好的小型 Linux 发行版(Logan 注,原文如此)。
把以上两者放到一块,那么就是本文的主题——从零开始编译Puppy。

如果你需要创建你自定义的 Puppy 版本,你有以下三种不同的方式:
1、使用Puppy Remaster-CD 脚本;
2、使用Puppy Unleashed;
3、通过本文所述的方式,一切从零开始。

你可以在Puppy启动后,在 Setup 菜单找到Remaster-CD 脚本。它让你安装你所需要的软件包,然后写入CD/DVD中。所以,你可以拥有一个自己定制软件包的Puppy Live-CD——当然,这种方式的局限在于你只能添加在原CD中已经存在的软件包。

Puppy 发行版是一组二进制软件包的集合,它们都是通过一系列被统称为 Puppy Unleashed 的编译脚本所生成的。我使用Unleashed 来编译每一个新出的官方 Puppy 版本,而 Nathan 生成 Grafpup,John 生成 MeanPup,等等,也采用了同样的方式。基本上,你可以选择 Puppy 中你需要的软件包,然后创建 iso 文件。下面链接详述了 Unleashed 是什么和如何使用它(英文页面):
http://www.puppyos.com/puppy-unleashed.htm

第三种是最底层的方式。这种方式完全通过编译最原始的源码包来得到 Puppy。这个完全是针对核心开发人员之类的角色。比如,我们需要吧GTK库从2.8.17升级到2.12.1 —— 那么需要编译就不只是GTK库,而是所有依赖它的软件包。这样,相关软件才能更加有效和稳定地与新的库相结合。再来一个更加深入的例子,我们可以针对 x86 以外的CPU进行编译(Puppy 现在是针对486(Logan注,这里指486指令集)编译的,所以它可以在任何,486,586,686,奔腾等计算机上运行)。

需要提醒的是,第三种方式只是针对非常有限的用户。如果你对其觉得困惑,请离它远点。T2编译系统并不是从源码来创建Puppy的。它只是简单生成一堆原始的二进制包,然后,你仍需要自行将这些包转换成Unleashed packages和 devx 模块。进一步的自动化转换方式已经在计划中,但是还未实现(Logan注,这句话是这篇文章写的时候说的,现在已经有了Woof等工具)。

一些历史
首次使用T2是在Puppy 2.10,并且持续到2.17.1。在那之后,Puppy进入3.0版,这个版本开始基于 Slackware发行版的二进制包。

在Puppy 4.0时,T2再次被启用,这个版本的Puppy被称为Dingo。所有在Dingo之前的Puppy版本都不能用于完整地编译T2。用于运行T2来创建Puppy 2.10的平台是Vector Linux5.1 STD。

要使用T2,你需要下载核心源码包,和所有所需的程序的源码包。你可以从T2的网站上下载到这些核心源码包,然而,我一个被特别修改的T2源码包版本,为了用其创建适用于Puppy的二进制包儿修改的,名叫t2-dingo-core.tar.gz。

注意:我现在又一个tarball,t2-dingo.tar.gz(没有 -core,Logan注),包含了所有源文件。它很大,逼近1GB。你可以在ibiblio.org找到它。

进入T2与Puppy的世界
从源码重新编译所有的东西并不容易。需要相当的一部分Linux经验。一个专门为此准备的变异环境也是必须的,特别是我们需要升级gcc编译器和glibc这个C库,或者针对另一个CPU编译(Logan注,指交叉编译)。并且,源码包也许需要打补丁,或者需要执行一些编译前预处理的脚本(Logan注,原文是have some kind of pre- or post- script executed)。这对绝对是复杂的工作,所以我们组织了T2这个项目,由Rene带领。T2是Rock Linux的一个分支,但是从分支之后,它就发展出了自己的特色和非常积极地开发和维护最新的软件包。

更多关于T2的信息,请访问其官方网站(Logan注,英文版):
http://www.t2-project.org/

当我开始学习怎么去使用T2时,我发现在线文档有几处错误,但是我向邮件列表和Rene(Logan注,我不知道是什么,请指出)提交的问题,却收到了相当有用的反馈(Logan注,原文:When I first started to learn how to use T2, I found the online manual to be incomplete in places, but I posted questions to the mail-list and Rene is extremely helpful. )。那些后来者相信会少一些障碍,因为我做了一个已经为编译Puppy系统配置好的T2编译包。

第一步:准备好一切
Puppy有一个devx_xxx.sfs文件(xxx代表Puppy的版本,比如4.00版,对应着400),这个文件让Puppy变成一个编译环境。你必须使用“Ding”或者以上版本的Puppy。
下载devx文件到 /mnt/home(与pup_save个人信息保存文件放在同一路径下),然后重启。就这么简单。如果你使用完全硬盘安装方式,那么就需要比较复杂的步骤去安装devx文件,请访问以下页面(英文版):
http://www.puppylinux.com/hard-puppy.htm

第二步:安装T2核心编译包
我拥有一个T2核心安装包,是2007年10月15日从SVN上下载的(这篇文章很老了),包名是t2-dingo-core.tar.gz,它已经为Puppy配置好了。因此,不要从T2的网站下载它,而是从我的ibiblio.org文件服务器上下载。这个页面的连接是:
http://www.puppylinux.com/download/downpage.htm

注意:我现在有一个tarball,t2-dingo.tar.gz,包含了所有的源文件。它相当的大,近1GB。你可以在ibiblio.org那里找到他。
链接是:
ftp://ibiblio.org/pub/linux/distributions/puppylinux/t2-dingo/

你需要把它下载到一个至少10GB可用空间的Linux分区。如果你需要编译基础包之外的Puppy软件包,那么,15-20GB的可用空间会更好。
当T2的压缩包解压后,你会看到以下文件夹:
t2-dingo
  architecture
  build
  config piglet001
  download
  misc
  package
  scripts
  source
  target piglet

target文件夹中存放的是Puppy选中的包和特别的配置文件。我创建了一个文件夹叫piglet,用于编译Puppy。如果你进入这个文件夹,那么最值得关注的文件是pkgsel,它列出了所有将编译的包。
如果我们做如下设定:把abiword加入Puppy,指定的版本,指定的下载源和其他相关信息。在package目录下,你会找到我们为每个包所设定的信息。至少,你会找到以.desc,.conf和.cache为扩展名的文件。你可以通过用文本编辑器打开他们来对其有个大致的了解。比如,如果我打开文件package/gnome2/abiword/abiword.desc,我将看到版本号是2.4.6,并给出了原始下载的地址。但是,T2会优先考虑从自己的服务器得到源码包,而不是原始地址。
download文件夹是用于存放下载的源码包的。如果你在线,T2会自动完成相关的下载,但是请注意,即使你只是下载Puppy的必须的包,也达到了约1.5GB。你也可以自行下载相关的包,这时T2会对其进行哈希校验(原文Checksum)。也许自动下载是理想的方式。
config文件夹是你存放用于编译的配置文件的地方。我已经创建了一个piglet001文件夹(Logan注,就是一个配置)在那里。我是通过以下脚本创建该配置的:
# ./scripts/Config -cfg piglet001
当我运行完这个脚本后,我又修改了piglet001中的一些设置。

如果你需要对piglet001做任何的修改,你可以自行运行下面脚本:
# ./scripts/Config -cfg piglet001 (没错,跟上面的一条完全一样)
你将看到一个文本模式的kconfig菜单系统,列出了所有的选择。比如,什么针对什么种类的CPU进行编译,什么包需要通过dietlibc来编译(原文,what packages to compile with dietlibc.)。你可以运行上面的脚本来查看那些选项,而不做任何改动。

第三步:下载源码包
获得和编译Puppy的源码包非常简单。你只需要保持在线,以使T2可以下载所需的包。输入以下命令:
# ./scripts/Download -cfg piglet001 -required
-required 参数指的是不下载全部TarBall包,只下载piglet001配置所必须的。
然后等待,直到1.5GB的软件包下载完毕。注意,如果不使用-required参数,将有约2400个包被下载。
警告:我修改了package目录下的某些.desc文件。比如我修改了 /www/seamonkey/seamonkey.desc文件到一个较新的版本。以下是修改过的内容:
[V] 1.1.5
[D] 1889686604 seamonkey-1.1.5.source.tar.bz2 http://ftp.mozilla.org/pub/mozilla.org/seamonkey/releases/1.0.4/
然后我直接(手动)下载了 seamonkey-1.1.5.source.tar.bz2 到download/mirror/s/下。注意那个数字 1889686604 -- T2使用cksum程序做checksum校验,但是它针对的是解压后的文件。所以,请自行完成这个步骤:
# bunzip2 seamonkey-1.1.5.source.tar.bz2
# cksum seamonkey-1.1.5.source.tar
然后使用结果的第一串数字。
注意那行URL——这是作者是回滚下载站点(原文是:this is the author's fallback download site. 译者注),如果这个包在T2源上不能用。
当然,修正cksum不是必须的。如果你手动下载一个较新的包直接放进download文件夹下,T2将不会校验它的cksum。你真正需要做的只是修改.desc文件中的[V]到正确的版本。
如果T2无法现在一个包,并且你没有自行下载它,那么下载的脚本将停止运行并且显示一些红色加粗的文字。如果你你重新运行脚本,你将得到一个错误的列表:
# ./scripts/Download -cfg piglet001 -required
T2将尝试向原始作者的网站下载相应的包,但是它们是可以被修改的,也就是说,你可以自行查看那些.desc文件,修正错误的URL——并且让我们知道。
我有一个源码URL的列表:
[url]http://www.puppylinux.com/download/downpage.htm [/url]
我的下载页面还有一些指向更多源码包的URL,所以你可以得到所有缺失的包。

第四步:开始编译!
编译结果将输出到build文件夹中。一个完整的从根路径开始的文件系统将在这里被编译,一个模拟的环境,完整地包括它自己的内核和对应的CPU(原文是,A complete root filesystem is built in here, an emulated environment, complete with its own kernel and CPU. 译者注)。二进制包也将在这里以.tar.bz2文件的形式存放,这正是我们Puppy所需要的。
当所有的源码包被下载了之后,整个编译过程将通过以下一行命令所启动:
# ./scripts/Build-Target -cfg piglet001
它将在约一天内完成。
我不是在开玩笑,它需要时间,和占用一些内存(原文是,it takes ages, and needs heaps of space.)。你需要一个2GHz的CPU和至少256MB的内存如果你希望编译在一天内完成。
与此同时,你仍可以使用同一台电脑上网,不过反应将非常的迟钝,更加不可能运行别的大型程序。

第五步:一些编译错误
当T2编译一个包的时候,源码的压缩包(tarball)将被解压,而T2将在t2-trunk文件夹中建立一个软链接指向源码文件夹。点击那个链接将把你带入那个包的编译环境。一般而言,T2将删除这个包的编译环境,除非编译失败。因此,在出错之后,你可以进入该文件夹去寻找失败的原因。
而且,T2维护一个编译记录,放在build/piglet001-8.0-trunk-piglet-x86-i486/var/adm/logs/ 之中。比如,如果Seamonkey编译失败,那么那个路径下将有build/piglet001-8.0-trunk-piglet-x86-i486/var/adm/logs/5-seamonkey.err 文件。
·这个文件对于寻找出错的原因很有帮助。
大量的包的编译失败将导致对应的编译环境不会被及时删除,迅速地吞噬空余空间。在加上会有各种临时文件出现。此时,你可以使用一下命令清理不需要的东西:
# ./scripts/Cleanup
如果你希望把编译好的包也一并删除,从零开始,那么请用以下命令:
# ./scripts/Cleanup -build -cache

第六步:修正错误
一个编译错误也许是,由于缺乏某些先决条件,或者先决条件被安排在出错的包之后编译,所造成的。配置出错也会造成编译错误。
每一个包都有它自己的配置(.con)文件,使得你可以控制编译的过程。比如,Seamonkey 有 package/www/seamonkey/seamonkey.conf。该文件是可以被编辑的,虽然 Rene 建议不要编辑这类文件,这样会影响到它(T2-build-pkg)未来的升级 ── 因为文件编辑之后,从T2的主源更新将变得困难。要解决这个问题,我们需要在 target/puppy5 目录中创建一个“架构之上(over-arch)”的配置(.conf)文件 ── 具体信息请参考在线的T2手册(T2 Handbook)。

当你需要纠正一个错误是,也许清理原来编译的结果(Cleanup)然后重新编译即可。
# ./scripts/Cleanup
# ./scripts/Build-Target -cfg puppy5b

第六步B: 修正 8.0rc-tpup
你需要做一些手动的调整去让 8.0rc-tpup 下面的那些包得以通过编译。在我(作者)写本文的时候,
1. librsvg 的安装, 在 stage 5(不理解这个stage 5的意思 -- Logan 注) 的时候出错。要修复这个,用文本编辑器打开文件 build/..../var/adm/flists/gtk+,把“gdk-pixbuf.loaders”改为其他任意字符,比如 “gdk-pixbuf.loaders-HIDE”,然后:

# ./scripts/Cleanup -cache
# ./scripts/Build-Target -cfg piglet001

在 librsvg 比编译成功之后,编译刚才提及的 gtk+ 文件,把内容改回原样。

2. 这次没有编译 Mplayer,所以不知道下面的做法是否还需要:
Mplayer 编译失败,也是在 stage 5。解决方案是,从 mplayer 的源码复制 libavutil/intreadwrite.h 到 build/..../usr/include/ffmpeg/ 下。

# ./scripts/Cleanup -cache
# ./scripts/Build-Target -cfg piglet001

这是一个 Mplayer 使用外置 ffmpeg 包的问题。

第七步:增加更多的包
打开文件 target/puppy/pkgsel 然后你会看到某些包已经被注释掉了。你可以去掉注释或者在列表里增加更多的包,然后再次运行 Built-Target 脚本。你也可以通过下面方式来增加新的包:

# ./scripts/Build-Target -cfg puppy5b

Puppy 会继续编译和增加新的包到编译结果之中。

Woof: Puppy 的搭建工具
如果你完成了上述的几步,你将拥有超过500个二进制包。现在的问题是,如何将这些变成一个 “Puppy一样的(Puppy-like)”的发行版呢?即一个漂亮的,大约100MB的,拥有 Puppy 为之著名的全部特性和速度的 Live CD。
这就是 Woof 出现的目的:
Woof的介绍 http://bkhome.org/woof/index.html
简单地说,你可以下载 Woof 然后运行指定的 0pre 脚本。该脚本会从T2导入二进制包,然后生成一个Puppy一样的Live CD。

第二种也许更多人会感兴趣的方式是,我上传了所有我所编译过的 T2 的二进制包到我的网站上面。我已经预先配置了 Woof 去识别它们的位置,Woof 会自动下载和使用它们。

当你运行 Woof 的 woof_gui 脚本时,你会得到一个图形界面,在第一个标签页中你可以选择 tpup 或者 quirky 配置,那些配置包含了我放在网站上 T2 二进制包的相关信息。

…那么从现在开始,你应该已经非常理解如何去建立自己的类 Puppy 发行版了。

后记
T2 出了一点小意外,gcc 编译器似乎有点问题。当你使用 Woof 建立你自己的发行版时,启动它然后在 加载了 devx SFS 之后,你需要重新编译 gcc 包,这里是我博客里的文档:
http://bkhome.org/blog/?viewDetailed=01236

当然,在我最近的一次使用 T2 经历中,我就这么做过,并且把 T2 的 ‘gcc-4.3.4.tar.bz2’ 包换成我自己的。这里是它们的地址(Woof 的配置里面有的):
http://bkhome.org/binaries/t2/8.0rc/
。。。所以,如果你使用 Woof 来从我编译的 T2 二进制包中建立一个发行版,这个问题就已经不存在了。

你可能感兴趣的:(linux,cache,SVN,脚本,gcc)