知识屋:更实用的电脑技术知识网站
所在位置:首页 > 操作系统 > YLMF—OS

Ylmf OS 编译系统详解

发布时间:2012-07-21 17:30:05作者:知识屋

YLmf OS 编译系统

一、YBS 是什么?

YBS 指的是 Ylmf OS 的打包系统 (Ylmf OS Build System)。这是一种用于从源代码编译软件的类  ports 系统。在 Ylmf OS 中,yget 专门管理二进制软件包,而 YBS 则专门负责把源代码编译,并打包成可安装的 ypk 软件包。Ports 是  FreeBSD 使用的一种系统,它对源码包进行下载、解压缩、打补丁、编译和安装等一系列操作。一个  port 包含一些文件来指导源码的下载和编译安装,系统会自动完成操作。

YBS 由一个目录树构成,位于 /var/ybs/pbslib,它包含许多子目录,每个子目录都属于某一类别,都以相应的可创建的软件包命名。此目录并不包含软件包或源代码,相对的它包含一个 pbs 文件和 files 目录。Package Build Script (简称  pbs)是一个脚本——文本文件(包含对编译和打包过程的指示、包含源码包的下载地址等),files 目录则存放额外的一些文件,例如补丁文件等。YBS 最重要的部分就是 pbs 文件。

1、获得 YBS 树
以 root 身份运行
  1. #ybs --sync
复制代码
可以从服务器同步 YBS 树,git 管理。有了  YBS 树,用户可以自己定制,从源代码编译打包软件。

YBS 包含以下结构和工具的完整工具箱:
YBS 目录树:       /var/ybs/pbslib,包含所有软件的  pbs 文件和相关文件
ybs 命令:           读取 pbs 文件,编译源代码并创建 ypk 包。
pbs 文件:           记录有创建软件包的指示和源代码地址。

2、YBS是用来做这些的:

从源代码编译  Ylmf OS 官方源里没有的软件,当然首先要编写  pbs 文件。
定制现有的软件包以满足你的特定需求,修改已存在的  pbs 文件,通常是开启或禁用相关配置选项
用其它编译器的 flags 重新构建整个系统 。
干净地编译安装你自己定制的内核,只需要修改内核的  pbs 文件。
当然,你也可以按照传统的方式  configure/make/make install 来安装软件,但是 ybs 可以使这个工作实现自动化。


3、全局编译环境   /etc/ybs.conf 指明环境变量和编译器的 flags。
  1. $ cat /etc/ybs.conf 
  2. CC=gcc
  3. CXX=g++
  4. #CFLAGS="-march=native -mtune=native -O2 -fomit-frame-pointer -pipe"
  5. CFLAGS="-march=i686 -mtune=i686 -O2 -pipe"          # 
  6. CXXFLAGS="$CFLAGS"
  7. MAKEOPTS="-j6"                                      # make 的进程数
  8. #YPINST_PREFIX="--prefix=/usr"
  9. YPINST_PREFIX=        
  10. ACCEPT_REPO="stable"                                # 分支 
  11. #YP_I18N="en zh_CN"                                 # 仅需要的语言,其它语言将会被丢掉
  12. YPPATH_DIST_URI="http://pkg.ylmf.com/sources"       # 备用的源代码下载服务器 
  13. AUTO_INSTALL="yes"                                  # 编译打包成功后自动安装到系统
  14. YPPATH_PACKAGE="/var/ypkg/packages"                 # 打包好的 ypk 包存放地址
复制代码
二、  pbs 文件介绍:

1、pbs 文件的位置和命名规则是固定的。
以 leafpad 例, 运行:
  1. # ybs -w leafpad
  2. /var/ybs/pbslib/app-editors/leafpad/leafpad_0.8.18.1.pbs
复制代码
app-editors                 软件类别
leafpad                     软件名
leafpad_0.8.18.1.pbs        软件名_主版本号.pbs  
leafpad_0.8.18.1-ylmf1.pbs  软件名_主版本号-修正版本号.pbs

2、简单的 pbs 文件:
以 leafpad 例, 运行:
  1. $ cat /var/ybs/pbslib/app-editors/leafpad/leafpad_0.8.18.1.pbs
  2. #
  3. # YLmf_OS package build script
  4. #
  5.  
  6. DESCRIPTION="GTK+ based simple text editor."
  7. HOMEPAGE="http://tarot.freeshell.org/leafpad/"
  8. LICENSE="GPL-2"
  9. PACKAGER="<[email]ylmfos@115.com[/email]>"
  10.  
  11. SRC_URI="http://savannah.nongnu.org/download/"$N"/"$N-$V$R".tar.gz"
  12.  
  13. RDEPEND="atk cairo expat fontconfig freetype gcc glib2 glibc gtk+ libpng libX11 libXau libxcb libXcomposite libXcursor libXdamage libXdmcp libXext libXfixes libXi libXrandr libXrender pango pixman zlib"
  14. BDEPEND="libpng"
  15.  
  16. pbs_unpack() {
  17.     ypkg_unpack
  18. }
  19.  
  20. pbs_config() {
  21.     ypkg_patch desktop-i18n.patch
  22.     YPB_CONFIG+="--disable-print"
  23.     ypkg_config
  24. }
  25.  
  26. pbs_build() {
  27.     ypkg_make
  28. }
  29.  
  30. pbs_install() {
  31.     ypkg_mkinstall
  32. }
复制代码
运行:
  1. #ybs -s leafpad
复制代码
就可以查询到

运行:
  1. #ybs -i leafpad
复制代码
开始编译和打包 leafpad  

2、ybs 可以使编译打包工作自动化,主要原因是  pbs 文件的编译规则。下面学习更为复杂的 pbs 文件。/var/ybs/pbslib/template.pbs 是一个模板,里面有详细的各个规则。
  1. $ cat /var/ybs/pbslib/template.pbs
复制代码
#
  1. # YLmf_OS package build script
  2. #
复制代码
# 简单的描述,推荐用英文
  1. DESCRIPTION=""         
复制代码
# 软件主页
  1. HOMEPAGE=""
复制代码
# 软件分支,testing 或者 stable, 默认是 stable
  1. REPO=""
复制代码
#  许可协议
  1. LICENSE="GPL"
复制代码
# 优先级,设置为  required,则在软件中心无法删除
  1. PRIORITY="required"
复制代码
# 打包者,写上自己的名字和联系方式
  1. PACKAGER="Ylmf OS Developers <[email]ylmfos@115.com[/email]>"
复制代码
#  源代码包下载地址。
# $N = 软件名,     例如 leafpad
# $V = 主版本号,  例如  0.8.1
# $R = 副版本号,例如  0.8.1-rc1 中的  -rc1  
支持以下 url:
  1. SRC_URI="http://foo.bar.com/$N-$V.tar.bz2"
  2. SRC_URI="http://foo.bar.com/$N.deb"
  3. SRC_URI="http://foo.bar.com/$N.rpm"
  4. SRC_URI="git://foo.bar.com/$N.git"
  5. SRC_URI="git://foo.bar.com/$N"
复制代码
如果已经源代码包是自己手动压缩的,复制到  $YPPATH_SOURCE(/var/ybs/sources), 则可以按照以下方式写:
  1. SRC_URI="" 
  2. SRC_URI="$N-$V.tar.bz2"
复制代码
#绝对路径
  1. SRC_URI="$DIR/$N-$V.tar.bz2"  
复制代码
# 依赖关系  
运行时依赖,ybs 会事先安装; yget install 处理二进制包时也会自动安装。
  1. RDEPEND=""              
复制代码
推荐依赖,ybs 不处理; yget install 处理二进制包时会自动安装。
  1. RECOMMENDED=""           
复制代码
编译依赖, ybs 会事先安装; yget install-dev 会安装,yget install 不处理
  1. BDEPEND=""   
复制代码
可选依赖,这里只是起到一个记录的作用。
  1. OPTIONAL="a: support a   
  2.           b: support b"
复制代码
冲突依赖,ybs 会在编译安装成功之后自动删除冲突包,yget install 处理二进制包时也会自动删除
  1. CONFLICT=""            
复制代码
# 记录一些注意事项
  1. NOTES=""
复制代码
# 指定 desktop 和  icon 文件
  1. DESKTOPFILE="glchess.desktop"   or  "/opt/test/test.desktop"
  2. ICONFILE="test.png"   or  "/opt/test/test.png"
复制代码
# 拆分包。注意开发包( -dev),包含头文件; 文档包( -doc) 是自动处理的。PROVIDE 支持定制的拆分包,规则由以下的   foo_install 函数来处理
  1. PROVIDE="foo"
复制代码
# 编译之前调用,例如某些软件需要创建用户等
  1. pbs_init() {
  2.     #ypkg_useradd -c "$C" -d "$D" -s "$S" -g "$G" "$N"
  3. }
复制代码
#  自动解压源代码包,并 cd 进入解压目录
  1. pbs_unpack() {
  2.     ypkg_unpack
  3. }
复制代码
# 配置编译选项
  1. pbs_config() {
复制代码
# 配置之前 打补丁。$FILES_PATH 是  pbs 文件所在的目录,补丁文件只要放到  $FILES_PATH/files/ 或者  $FILES_PATH/files/patches 会自动被找到。
  1.     ypkg_patch *.patch
复制代码
# 编译选项,默认的是:
  1.     #YPB_CONFIG+=" --prefix=/usr
  2.     #                --sysconfdir=/etc
  3.     #                --localstatedir=/var
  4.     #              --infodir=/usr/share/info
  5.     #                --mandir=/usr/share/man
  6.     #              --disable-static
  7.     #                --enable-shared "
复制代码
#需要额外的在这里加:
  1.     YPB_CONFIG+=""
  2.       ypkg_config
  3. }
复制代码
# 开始编译
  1. pbs_build() {
  2.     ypkg_make
  3. }
复制代码
# 测试,一般不需要
  1. pbs_check() {
  2.     make check
  3. }
复制代码
# 安装到指定目录  $YPPATH_DEST
  1. pbs_install() {
  2.     ypkg_mkinstall
复制代码
#ybs 还提供了几个工具:
        # 复制 systemd 的 service 文件到  "$YPPATH_DEST"/lib/systemd/system  目录
  1.     #ypkg_dounit "N".service                                 
复制代码
# 复制  desktop 和 icon 文件到  "$YPPATH_DEST"/usr/share/applications 目录
  1. #ypkg_dodesktop "*.desktop" "*.png"                        
复制代码
# 复制文档文件到 "$YPPATH_DEST"/usr/share/doc/"$N" 目录
  1.       #ypkg_dodoc AUTHORS ChangeLog COPYING INSTALL NEWS README  
复制代码
# 复制时自动创建目标目录
  1. #ypkg_docp "$FILES_PATH/files/XXXX" "dirname"            
复制代码
  1. #ypkg_domv "$FILES_PATH/files/XXXX" "dirname"               
  2. #ypkg_docp_rename "$1" "$2"                                # 
  3. #ypkg_domv_rename "$1" "$2"
复制代码
# 链接时自动创建目标
  1. #ypkg_doln "$1 "$2"      
复制代码
# 复制 man 文件到指定目录
  1.     #ypkg_doman a.1 b.2 c.3                                 
复制代码
#当 SRC_URI 后缀是 deb 或者 rpm 包时,ybs 自动解压所有文件到 data/ 目录下,这个时候只要以下命令。
  1.     #ypkg_docp data/*  "$YPPATH_DEST"
复制代码
  1. }
复制代码
# 拆分包,函数名必须和 PROVIDE 一致,这个时候的 $N,$YPPATH_DEST 变量已经变成 foo
  1. foo_install() { 
  2.     ypkg_mkinstall
  3. }
复制代码
# 安装后执行:
  1. pbs_postinst() {
  2.     #gnome2_install_schema "$1"
  3.     #gnome2_install_defaut_gconf "$1 $2 $3
  4.     #gnome2_rarian_sk_update
  5.     #gnome2_desktop_database_update
  6.     #gnome2_icon_cache_update /usr/share/icons/titans|titans  $default is /usr/share/icons/hicolor
  7.     #gnome2_gconfd_reload
  8.     #gnome2_gtk_immodules_update
  9.     #gnome2_mime_database_update
  10.     #gnome2_gdk_pixbuf_loaders_update[!--empirenews.page--]分页标题[/!--empirenews.page--]
  11.     #ypkg_dofont /usr/share/fonts/truetype/ttf-dejavu
  12. }
复制代码
# 删除软件包之前执行
  1. pbs_prerm() {
  2.     
  3. }
复制代码
#删除软件之后执行
  1. pbs_postrm() {
  2.     
  3. }
复制代码
3、更多的例子请参考  /var/ybs/pbslib

三、ybs 常用命令介绍:

搜索:
  1. $ ybs -s leafpad
  2. * Searching for leafpad ...
  3. [I] leafpad
  4.     Installed: 0.8.18.1    2011-06-02,09:43:36
  5.     Available: 0.8.17[s]    | 0.8.18.1[s]   
  6.     Homepage: [url]http://tarot.freeshell.org/leafpad/[/url]
  7.     Description: GTK+ based simple text
复制代码
[I] 表示已安装
s表示 stable 分支
t 表示测试分支

定位 pbs 文件,找到可用的最高版本的 pbs 文件
  1. $ ybs -w leafpad
  2. /var/ybs/pbslib/app-editors/leafpad/leafpad_0.8.18.1.pbs
复制代码
编译某个包,同时自动编译依赖包,加上 -p 参数,可以模拟执行:
  1. # ybs -i -p leafpad
  2. * Calculating dependencies...
  3. [E] sys-libs/zlib_1.2.5 
  4. [E] dev-util/pkgconfig_0.23 
  5. [E] app-admin/gamin_0.1.10 
  6. [E] dev-libs/mpfr_2.4.2 
  7. [E] dev-libs/gmp_4.3.2 
  8. [E] x11-libs/xcb-util_0.3.6 
  9. [E] x11-libs/gtk+_2.20.1 
  10. [E] app-editors/leafpad_0.8.18.1
复制代码
[E] 表示已安装,而且无须升级或者降级
[D] 表示此包需要降级
[U] 表示此包需要升级

已经安装的包,强制编译,加上 -F 参数,如果不加上 -p 参数会开始编译 leafpad:
  1. # ybs -i -F -p leafpad
  2. * Calculating dependencies...
  3. [E] dev-util/pkgconfig_0.23 
  4. [E] app-admin/gamin_0.1.10 
  5. [U] sys-apps/linux-headers_2.6.37 ----> sys-apps/linux-headers_2.6.38.2 
  6. [E] dev-libs/mpfr_2.4.2 
  7. [E] dev-libs/gmp_4.3.2 
  8. [E] x11-libs/xcb-util_0.3.6 
  9. [E] x11-libs/gtk+_2.20.1 
  10. [EF] app-editors/leafpad_0.8.18.1
复制代码
[EF] 表示已安装,但是还是强制编译

编译单个软件包,不自动编译依赖。这个方式是在已知依赖完全满足的前提下,如果不加上 -p 参数会立即开始编译 leafpad,不计算依赖。
  1. # ybs -is -p leafpad
  2. * Installing leafpad ...
  3. [EF] app-editors/leafpad_0.8.18.1
复制代码
更多选项请参考 ybs --help

四、
Ylmf OS 系统以及运行其上的软件,由无数软件包组成。而每个软件包的编译规则则由 pbs 文件控制,可以说 pbs 是 Ylmf OS 的灵魂。而 ybs 方式在某种程度上实现了自动化,同时,通过 pbs 文件,也保持了完全的透明度以及对编译安装流程的控制。
(免责声明:文章内容如涉及作品内容、版权和其它问题,请及时与我们联系,我们将在第一时间删除内容,文章内容仅供参考)
收藏
  • 人气文章
  • 最新文章
  • 下载排行榜
  • 热门排行榜