My favorites | Sign in
Project Home Downloads Wiki Issues Source
Project Information
Members
Featured
Downloads
Links

buildc是一个C语言项目构建管理辅助工具(需python版本[2.4.3, 3.0.0))。

buildc目前主要实现了三个功能:

  1. 第三方依赖库的远程获取和本地管理
  2. 根据目标主机环境、目标主机本地缓存的第三方库情况以及项目本身所依赖的第三方库的最新配置,自动生成一份包含了依赖库环境变量信息的Make.rules文件,或重新更新已有Make.rules文件(上一次由buildc生成的)。项目中的Makefile只需包含(include)Make.rules文件并使用该文件中的变量即可。
  3. 生成安装工程,构建、清理和上传安装包

一、使用前提

源码工程构建功能使用前提

第三方库必须按特定规划集中存储在一个版本控制服务器中,每个第三方库的组织形式都像下面这样:

package_name/
	- version/
		- CPU_MODE_OS
			- include
			- lib

安装工程创建、安装包构建功能使用前提

buildc支持安装工程(setup)创建、构建、清理与上传安装包,前提是安装工程符合下面目录组织结构:

setup_project/
      - setup.cfg
      - distributions/
         - cn-foo-2.14.0.0-x86-linux-64bit.tar.gz
      - src/
         - setup.py*
         - layout.cfg
         - README
         - app/
         - conf/
         - deps/
           - libevent.so
           - ... ...
         - scripts/
           - deps_check.py
           - env_gen.py

         - others/

二、安装

buildc的安装未采用标准python安装模式。

安装步骤如下:

  • 下载最新发布包或svn export/checkout相关发布版本的源码
  • 在目标主机下执行setup.py(如果安装到默认路径下,需要root权限),buildc会被默认安装到/usr/share/buildc下面;在/usr/bin下会建立buildc可执行程序的符号链接;如果要指定安装路径,则可通过--prefix=INSTALL_PATH命令行参数指定。

buildc安装后的目录结构如下:

buildc*        # 脚本入口
build_utils/   # 源码库
templates/     # Make.rules.in模板
samples/       # 配置样例
  • 卸载方法 执行setup.py uninstall [--prefix=INSTALL_PATH]接口(如果卸载默认路径下的buildc,则需要root权限)

三、源码工程构建使用方法

环境初始化

执行buildc init,buildc会在你的HOME目录下建立.buildc.rc文件。该文件用于配置所有可用的第三方库的信息。

$> buildc init
Copy /home/tonybai/proj/build_tools/samples/buildc.rc.sample to /home/tonybai/.buildc.rc OK!
Please config /home/tonybai/.buildc.rc before you use other buildc commands!
Copy /home/tonybai/proj/build_tools/samples/buildc.cfg.sample to ./buildc.cfg OK!
Please config buildc.cfg before you use other buildc commands!

第三方库的本地缓存管理

有了正确的.build.rc配置,我们就可以初始化第三方库在本地的缓存了,执行buildc cache init。

$> buildc cache init

===>Begin init repository [svn://10.10.0.156:6666/foo]
Create dir: /home/tonybai/.buildc_libs/foo
library [snmp] does not exist!
Checkout [svn://10.10.0.156:6666/foo/snmp/5.7.0/x86_64_linux]...
Checkout [svn://10.10.0.156:6666/foo/snmp/5.7.0/x86_64_linux] OK!
library [libexpat] does not exist!
Checkout [svn://10.10.0.156:6666/foo/libexpat/2.0.1/x86_64_linux]...
Checkout [svn://10.10.0.156:6666/foo/libexpat/2.0.1/x86_64_linux] OK!
... ...

buildc cache init命令会根据.buildc.rc中的配置,从各个repository中下载对应该主机平台的第三方库,存放在对应的缓存路径下备用。

如果repository有更新,我们可以执行buildc cache update来更新本地缓存:

$ buildc cache update

===>Begin update repository [svn://10.10.125.156:3560/3rds]
Update [snmp]...
Update [snmp] OK!
Update [libexpat]...
Update [libexpat] OK!
... ...

当不需要本地缓存时,我们可以通过buildc cache remove删除之:

$> buildc cache remove

===>Begin remove repository [svn://10.10.0.156:6666/foo]
Remove [/home/tonybai/.buildc_libs/foo] OK!
<=== End remove repository [svn://10.10.0.156:6666/foo]
... ...

生成项目Make.rules

第三方库的本地缓存建立好后,我们就可以来配置项目了。在前面执行完buildc init时,buildc生成了一个项目配置模板文件buildc.cfg(.buildc.rc和buildc.cfg本身也都是Python源文件),我们将该文件移到项目的顶层目录下,然后对该文件进行配置。

配置完成后,就可以通过执行buildc config-make生成对应的Make.rules文件:

$ buildc config-make
Can not found Make.rules in current directory!
Generate [/home/tonybai/proj/foo/Make.rules] ...
Config [/home/tonybai/proj/foo/Make.rules]... 
Config [/home/tonybai/proj/foo/Make.rules] OK!
Generate [/home/tonybai/proj/foo/Make.rules] OK!

利用Make.rules构建项目

可以看出Make.rules中将平台信息和第三方库的依赖信息都放置在对应的变量中了。项目的Makefile只需要包含Make.rules便可以利用这些信息进行项目的构建。可以利用的Make.rules中的主要变量包括:CFLAGS、LIBS。我们甚至可以为项目再编写一个"一键构建"脚本,该脚本中只需包含两行代码即可:

buildc config-make
make

你无需将Make.rules提交到源码版本库中,但需要将buildc.cfg作为项目的一部分。这样在任一一个通过buildc做项目构建管理的环境中,你的项目就都可以进行"一键式"构建了,再也无需为配置项目路径和寻找构建第三方依赖库而发愁了。另外通过buildc进行构建管理的项目将会很容易地集成到持续集成过程中。

四、安装包制作工程(setup project)使用方法

安装工程创建

执行buildc pack create --project=YOUR_SETUP_PROJECT_NAME,即可在当前目录下创建一个empty安装包制作工程。

$> buildc pack create --project=foo_setup
Setup project [foo_setup] create OK!
$> cd foo_setup
$> ls
distributions/	setup.cfg  src/
$> cd src; ls
$> app/  deps/  env/  others/  README  scripts/  setup.py*

配置安装包工程

在生成的安装包工程下面有一个配置文件setup.cfg,其内容示例如下:

distribution = {
  "packname"    : "cn-foo",
  "version"     : "2.14.0.1",
}

source = {
  "trunk"          : "svn://10.10.15.56:4444/cn/trunk/foo",
  "binary_prefix"  : "cn-foo"
}

其中:
distribution.packname - 标识最终安装包的名字
distribution.version - 标识最终安装包的版本号

source.trunk - 指示该安装工程所需的源码工程的svn url
source.binary_prefix - 指出源码工程构建后所生成的二进制可执行文件的名字前缀

构建安装包

在已经创建好的安装包工程中,使用buildc pack build命令可以进行安装包的制作:

$> buildc pack build
Clean [.build] OK!
Clean [.package] OK!
Clean [./src/app] OK!
Clean [./distributions] OK!
Package distribution clean OK!
Create dir [.build] OK!
Export [svn://10.10.15.56:4444/cn/trunk/foo] OK!
Cd /home/tonybai/proj/foo_setup/.build/foo
Config Make.rules OK!
Make Ok
Copy binary file to [/home/tonybai/proj/foo_setup/src/app] Ok
Cd /home/tonybai/proj/foo_setup
Del [.build] OK!
Build source [svn://10.10.15.56:4444/cn/trunk/foo] OK!
Create dir [.package] OK!
Cd /home/tonybai/proj/foo_setup/.package
Generate cn-foo-2.14.0.1-x86-linux-64bit.tar OK!
Zip cn-foo-2.14.0.1-x86-linux-64bit.tar OK!
Cd /home/tonybai/proj/foo_setup
Del [.package] OK!
Make target [cn-foo-2.14.0.1-x86-linux-64bit.tar.gz] OK!

如果在buildc命令行中没有指定--tag=YOUR_SOURCE_TAG,buildc会使用setup.cfg中source['trunk']中的配置检出trunk代码并构建;如果指定了SOURCE TAG,那么buildc就会使用tag中提供的source svn url检出代码并构建,例如下面的命令将检出foo-2.14.0.2标签的代码并构建可执行程序:

$> bulidc pack build --tag=svn://10.10.15.56:4444/cn/tags/foo-2.14.0.2

清理安装包工程

使用buildc pack clean命令可以对安装包工程做清理:

$> buildc pack clean
Clean [.build] OK!
Clean [.package] OK!
Clean [./src/app] OK!
Clean [./distributions] OK!
Package distribution clean OK!

上传安装包

在制作完安装包后,我们一般会将其上传到一个指定的发布服务器上去,buildc提供了上传安装包的功能:使用buildc pack upload --host=HOST --user=USERNAME --passwd=PASSWD --dir=REMOTEDIR --port=FTP_PORT

$> buildc pack upload --host=10.10.1.191 --user=tony --passwd=tony --dir=dist
Cd distributions
Upload [cn-foo-2.14.0.0-x86-linux-64bit.tar.gz] OK!

更多有关buildc背景和使用的介绍请参加作者相关blog

Powered by Google Project Hosting