使用GBS在本地编译包

1 介绍

关于如何使用Git Build System (GBS)执行本地编译,本文档提供了以下的信息:

  • 准备工作
  • 编译指导
  • 编译的概念和技巧

本文假定以下文档内容您已经阅读过,理解并正确地遵循文档进行操作:

2 编译全部包

本节介绍如何编译所有包,镜像的创建需要这些包(本地完整编译)。

要执行本地完整编译,请执行下列步骤:

意:

  • 要透彻地理解本地完整编译命令,请参考"编译概念"。
  • 要在硬件允许的条件下,加快编译过程,请参考“加快本地编译”。
  1. 按照2.2节或3.2节中克隆Tizen源代码的内容,来克隆所有项目的源代码。

    在成功克隆源代码后,一个完整GBS的配置文件会产生,其名字是.gbs.conf,该件是从Tizen项目列表的gbs-config项目中,拷贝到<Tizen_Project>的顶层目录,在这里可以执行repo sync命令。

  2. 切换到包含所有Tizen工程的目录。

    $ cd <Tizen_Project>
    
  3. 配置默认的.gbs.conf。

    (3-1)添加自定义的远程repo(强制的)。

    针对Tizen 3.0 common,IVI和移动电话垂直设备,默认的GBS配置文件如下所示:

    • Common

      [general]
      tmpdir=/var/tmp/
      profile = profile.tizen3.0_common
      work_dir=.
       
      [repo.tizen3.0_x86]
      url=${work_dir}/pre-built/toolchain-x86/
       
      [repo.tizen3.0_arm]
      url=${work_dir}/pre-built/toolchain-arm/
       
      [profile.tizen3.0_common]
      repos=repo.tizen3.0_x86,repo.tizen3.0_arm
      buildconf=${work_dir}/scm/meta/build-config/build.conf
       
      # For wayland ia32
      # buildconf=${work_dir}/scm/meta/build-config/build-ia32-wayland.conf
      # For emulator32 wayland
      # buildconf=${work_dir}/scm/meta/build-config/build-emulator32-wayland.conf
      # For wayland x86_64
      # buildconf=${work_dir}/scm/meta/build-config/build-x86_64-wayland.conf
      # For wayland arm32
      # buildconf=${work_dir}/scm/meta/build-config/build-arm-wayland.conf
      # For wayland arm64
      # buildconf=${work_dir}/scm/meta/build-config/build-arm64-wayland.conf
      
    • IVI

      [general]
      tmpdir=/var/tmp/
      profile = profile.tizen3.0_ivi
      work_dir=.
       
      [repo.tizen3.0_x86]
      url=${work_dir}/pre-built/toolchain-x86/
       
      [profile.tizen3.0_ivi]
      repos=repo.tizen3.0_x86
      buildconf=${work_dir}/scm/meta/build-config/build.conf
      
    • 移动

      [general]
      tmpdir=/var/tmp/
      profile = profile.tizen3.0_mobile
      work_dir=.
       
      [repo.tizen3.0_x86]
      url=${work_dir}/pre-built/toolchain-x86/
       
      [repo.tizen3.0_arm]
      url=${work_dir}/pre-built/toolchain-arm/
       
      [profile.tizen3.0_mobile]
      repos=repo.tizen3.0_x86,repo.tizen3.0_arm
      buildconf=${work_dir}/scm/meta/build-config/build.conf
      

    有关远程repo自定义的详细信息,请参阅“可用分支和相应的远程Repos”。

    有关.g​​bs.conf的更多信息,请参阅GBS配置文件。

    (3-2)指定build.conf。 (可选,仅适用于Tizen 3.0 common)

    基于其变化,根据实际情况,选择下面的一项,以及取消下面一项的注释:

    • wayland ia32

      buildconf=${work_dir}/scm/meta/build-config/build-ia32-wayland.conf

    • emulator32 wayland

      buildconf=${work_dir}/scm/meta/build-config/build-emulator32-wayland.conf

    • wayland x86_64

      buildconf=${work_dir}/scm/meta/build-config/build-x86_64-wayland.conf

    • wayland arm32

      buildconf=${work_dir}/scm/meta/build-config/build-arm-wayland.conf

    • wayland arm64

      buildconf=${work_dir}/scm/meta/build-config/build-arm64-wayland.conf

  4. 根据实际情况,从下列命令中选一个执行,以编译镜像创建所需要的所有包:

    • i586

      $ gbs build -A i586 --threads=4 --clean-once --exclude=gcc,cmake,filesystem,aul,libmm-sound,libtool
      
    • armv7l

      $ accel_pkgs="bash,bzip2-libs,c-ares,cmake,coreutils,diffutils,eglibc,elfutils-libelf,elfutils-libs,elfutils,fdupes,file,findutils,gawk,gmp,gzip,libacl,libattr,libcap,libcurl,libfile,libgcc,liblua,libstdc++,make,mpc,mpfr,ncurses-libs,nodejs,nspr,nss-softokn-freebl,nss,openssl,patch,popt,rpm-build,rpm-libs,rpm,sed,sqlite,tar,xz-libs,zlib,binutils,gcc"
      $ gbs build -A armv7l --threads=4 --clean-once --exclude=${accel_pkgs},filesystem,aul,libmm-sound,libtool
      

    对于Tizen分支的详细信息,请参阅“可用分支和相应的远程Repos”。

    意::
    • “--exclude”对于Tizen 3.0不是必须的。

    • 从GBS 0.22开,在gbs.conf的profile分支持exclude_packages属性,该属性可以被用于设置要排除的包列表,或者用于打破依赖循环,即使用以下的命令:

      $ accel_pkgs="bash,bzip2-libs,c-ares,cmake,coreutils,diffutils,eglibc,elfutils-libelf,elfutils-libs,elfutils,fdupes,file,findutils,gawk,gmp,gzip,libacl,libattr,libcap,libcurl,libfile,libgcc,liblua,libstdc++,make,mpc,mpfr,ncurses-libs,nodejs,nspr,nss-softokn-freebl,nss,openssl,patch,popt,rpm-build,rpm-libs,rpm,sed,sqlite,tar,xz-libs,zlib,binutils,gcc"
      $ gbs build -A armv7l --threads=4 --clean-once --exclude=${accel_pkgs},filesystem,aul,libmm-sound,libtool
      

      相当于运行以下命令:

      $ gbs build -A armv7l --threads=4 --clean-once
      

      在gbs.conf添加下面的内容后:

      [profile.tizen]
      exclude_packages=bash,bzip2-libs,c-ares,cmake,coreutils,diffutils,eglibc,elfutils-libelf,elfutils-libs,elfutils,fdupes,file,findutils,gawk,gmp,gzip,libacl,libattr,libcap,libcurl,libfile,libgcc,liblua,libstdc++,make,mpc,mpfr,ncurses-libs,nodejs,nspr,nss- softokn-freebl,nss,openssl,patch,popt,rpm-build,rpm-libs,rpm,sed,sqlite,tar,xz-libs,zlib,binutils,gcc,filesystem,aul,libmm-sound,libtool
      
  5. 在必要时跟进。 有关详细信息,请参阅“执行另一个编译“。

3 编译指定包

本节将介绍如何编译指定包。

要编译指定工程的包,请执行下列步骤:

  1. 按照“克隆Tizen源代码”的第3节内容,克隆特定工程的源代码。

  2. 切换到包含指定工程的目录。

    cd <Specific_Project>
    
  3. 创建GBS配置文件 <Specific_Project>/.gbs.conf.

    Tizen 2.2 GBS配置文件的一个示例如下所示:

    [general]
    tmpdir=/var/tmp/
    profile = profile.tizen2.2
    work_dir=.
     
    [repo.tizen2.2]
    url = http://download.tizen.org/releases/2.2/tizen-2.2/
     
    [profile.tizen2.2]
    repos=repo.tizen2.2
    

    关于.g​​bs.conf的更多信息,请参阅“GBS配置文件”。

    有关远程repo的更多定制信息,请参阅“可用分支”和“相应的远程Repos”。

  4. 为该工程编译包。

    $ gbs build -A <Arch> --include-all
    

4 附录

本节提供了本地编译的补充信息,包括以下内容:

  • 可用分支
  • 编译概念
  • 编译技巧

4.1 可用的分支和相应的远程Repos

可用的分支,对应的分支名称和远程repos如下:

4.2 GBS编译的概念

编译概念可帮助开发者们透彻地了解完整的编译命令,如下所示:

  • 预编译的二进制包

    <Tizen_Project>/pre-built目录包含一组预编译的工程,为GBS编译提供基础和工具链二进制RPM包。

  • Repo的循环

    GBS不支持编译循环依赖的包。 已知循环如下:

    gcc->eglibc->gcc
    gcc->binutils->gettext->gcc
    gettext->gcc->eglibc->gettext
    cmake->curl->c-ares->cmake
    filesystem->setup->filesystem
    aul->privacy-manager-server->aul
    libtool->texinfo->libzio->bzip2->libtool
    libmm-sound->avsystem->pulseaudio->system-server->libfeedback->libmm-sound
    

在Tizen包中,除了工具链,GBS如果没有二进制RPM的话,有一些循环依赖是无法被检测出来的。 因此,需要在.gbs.conf中添加一个远程repo。

要通过打破循环依赖以继续编译,就要在运行gbs build命令的时候,添加"--exclude"选项以排特定的包,或者在gbs.conf文件的profile栏位里面,用exclude_packages属性指定要排除的包列表。

  • 加速器包

    Tizen提供交叉编译器及其他加速器套件,如下图所示,ARM编译的工具在 <Tizen_Project>/pre-built/toolchain-arm/里面。

    bash,bzip2-libs,c-ares,cmake,coreutils,diffutils,eglibc,elfutils-libelf,elfutils-libs,elfutils,fdupes,file,findutils,gawk,gmp,gzip,libacl,libattr,libcap,libcurl,libfile,libgcc,liblua,libstdc++,make,mpc,mpfr,ncurses-libs,nodejs,nspr,nss-softokn-freebl,nss,openssl,patch,popt,rpm-build,rpm-libs,rpm,sed,sqlite,tar,xz-libs,zlib,binutils,gcc
    

第一次编译的时候,这些包需要排除在外,否则编译出来的包会被安装和使用,这会导致加速器包工作失败。

4.3 编译技巧

编译技巧包括以下内容:

  • 如何加快本地编译
  • 如何执行另一个编译

4.3.1 加快本地编译

如果RAM和swap的大小都超过8G,挂载GBS BUILD-ROOTS作为tmpfs来加快编译:

$ mkdir -p ~/GBS-ROOT/local/BUILD-ROOTS
$ sudo mount -t tmpfs -o size=16G tmpfs ~/GBS-ROOT/local/BUILD-ROOTS

4.3.2 执行另一个编译

当对第一次编译结果不满意的时候,根据实际情况,通过使用下列命令之一,进行另一次的编译:

  • 第一种情形满足以下条件:

    • 远程repo的URL与之前编译的时候是一样的。
    • 要编译的新包依赖于之前编译的包。
    • 用户要将之前编译的包加入到新的编译中。
    $ gbs build -A <Arch>
    
  • 第二个场景满足以下条件:

    • 远程repo的URL与之前编译的时候是一样的。
    • 要编译的新的包依赖于之前编译的包。
    • 用户要将之前编译出的包加入到新的编译中。
    $ gbs build -A <Arch>
    
  • 第三种情况符合下列条件:

    • 远程repo的URL与之前编译的时候是一样的。
    • 要编译的新的包依赖于之前编译的包。
    • 用户不希望之前编译的包加入到新的编译中。
    $ gbs build -A <Arch> --clean-repos
    
  • 第四种情况符合下列条件:

    • 远程repo的URL已经改变。
    • 要编译的新包不依赖于之前编译的包。
    $ gbs build -A <Arch> --clean
    
  • 第五种情况满足以下条件:

    • 远程repo的URL已经改变。
    • 要编译的新的包依赖于之前编译的包。
    • 用户希望之前编译的包加入到新的编译中。
    $ gbs build -A <Arch> --clean
    
  • 第六种情况符合下列条件:

    • 远程repo的URL已经改变。
    • 要编译的新的包依赖于之前编译的包。
    • 用户不希望之前编译的包加入到新的编译中。
    $ gbs build -A <Arch> --clean --clean-repos
    

在运行的过程中,编译的目录是~/GBS-ROOT/local/BUILD-ROOTS/scratch.`<Arch>.<Number_of_Threads>`,在这里与目前的编译有关联的后续输入会被加载,以建立一个独立的编译环境:

在成功编译后,GBS将生成的RPM包移到输出中,即~/GBS-ROOT/local/repos/<Release_ID>/<Arch>,如果需要的话,其中的内容会自动参与到新的编译中,而且根据已有的包和新的要编译的包之间的依赖关系,可能会对新的编译造成潜在的影响。

基于上述的GBS编译的工作机制,必须遵守以下规则,以保证新的编译的质量:

  • 一旦远程repo的URL改变,需要添加“--clean”。
  • 如果新的待编译的包依赖于先前编译的包,而用户又不希望它们参与到新的编译中,则要添加"--clean-repos"。