PUBLISHED
1 介绍
关于如何使用Git Build System (GBS)执行本地编译,本文档提供了以下的信息:
- 准备工作
- 编译指导
- 编译的概念和技巧
本文假定以下文档内容您已经阅读过,理解并正确地遵循文档进行操作:
2 编译全部包
本节介绍如何编译所有包,镜像的创建需要这些包(本地完整编译)。
要执行本地完整编译,请执行下列步骤:
注意:
-
按照2.2节或3.2节中克隆Tizen源代码的内容,来克隆所有项目的源代码。
在成功克隆源代码后,一个完整GBS的配置文件会产生,其名字是.gbs.conf,该文件是从Tizen项目列表的gbs-config项目中,拷贝到<Tizen_Project>的顶层目录,在这里可以执行repo sync命令。
-
切换到包含所有Tizen工程的目录。
$ cd <Tizen_Project>
-
配置默认的.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”。
有关.gbs.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
-
-
根据实际情况,从下列命令中选一个执行,以编译镜像创建所需要的所有包:
-
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
-
-
-
在必要时跟进。 有关详细信息,请参阅“执行另一个编译“。
3 编译指定包
本节将介绍如何编译指定包。
要编译指定工程的包,请执行下列步骤:
-
按照“克隆Tizen源代码”的第3节内容,克隆特定工程的源代码。
-
切换到包含指定工程的目录。
cd <Specific_Project>
-
创建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
关于.gbs.conf的更多信息,请参阅“GBS配置文件”。
有关远程repo的更多定制信息,请参阅“可用分支”和“相应的远程Repos”。
-
为该工程编译包。
$ gbs build -A <Arch> --include-all
4 附录
本节提供了本地编译的补充信息,包括以下内容:
- 可用分支
- 编译概念
- 编译技巧
4.1 可用的分支和相应的远程Repos
可用的分支,对应的分支名称和远程repos如下:
-
Tizen 2.1
- 分支名称:tizen_2.1
- 远程repo: http://download.tizen.org/releases/2.1/tizen-2.1/
-
Tizen 2.2
- 分支名称:tizen_2.2
- 远程repo: http://download.tizen.org/releases/2.2/tizen-2.2/
-
Tizen 3.0
-
分支名称:tizen
-
远程repos:
-
IVI: http://download.tizen.org/releases/daily/tizen/ivi/ivi-release/latest/
-
Mobile: http://download.tizen.org/releases/daily/tizen/mobile/latest/
-
Common:
两种类型的远程repos如下图所示,根据实际情况,选择其中的一项:
-
注意:上面最新的远程repo url是在远程服务器上的一个链接,它总是链接到最新的目录,并且随时可能改变,所以对于指定日期,要确保使用最新的repo,以保证其可用性。 一个示例如下所示:http://download.tizen.org/snapshots/tizen/common/tizen_20140617.9/repos/x86_64-wayland/packages/
-
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>`,在这里与目前的编译有关联的后续输入会被加载,以建立一个独立的编译环境:
- ~/tizen下的源代码
- 本地的RPM包在~/GBS-ROOT/local/repos/<Release_ID>/<Arch>
- 远程的RPM包在http://download.tizen.org/releases/<Tizen_Version>/<Release_ID>
在成功编译后,GBS将生成的RPM包移到输出目录中,即~/GBS-ROOT/local/repos/<Release_ID>/<Arch>,如果需要的话,其中的内容会自动参与到新的编译中,而且根据已有的包和新的要编译的包之间的依赖关系,可能会对新的编译造成潜在的影响。
基于上述的GBS编译的工作机制,必须遵守以下规则,以保证新的编译的质量:
- 一旦远程repo的URL改变,需要添加“--clean”。
- 如果新的待编译的包依赖于先前编译的包,而用户又不希望它们参与到新的编译中,则要添加"--clean-repos"。