有了BuildBot搭建的持续集成环境还远未结束,具体的构建脚本还得自己来写。我们用的是Make工具,对应要编写的脚本就是Makefile。

Make是日常代码构建常用的工具,尤其是绝大多数C和C++项目都会将Make作为首选构建工具。平时多数情况大家都是直接敲入make命令便开始了构建过程,很少有人为make传入什么参数的(调试Makefile的情况除外)。但是有些时候自定义的Make命令行变量还是很有用处的,特别是在将Make与持续集成环境集成的时候。

实际上这个话题是源于我在搭建持续集成环境时遇到的一个实际问题。我们的产品的目标之一就是支持在不同平台上运行。这样我们需要在不同平台下都能进行构建,这也要求我们的Makefile可以自适应多种环境。以前的产品没有多平台运行的需求,其Makefile的实现也就没有考虑到这一点。在做平台移植的过程中,我们对Makefile脚本做了调整,不过虽然其可以满足在多平台上Build的要求,但是在某些情况下Build前需手工修改Makefile中的某些开关变量,比如是进行64bit编译还是32bit编译等。

这样的Makefile是不能用于持续集成环境下的多平台构建的,因为是自动构建,我们无法在中间进行人工干预。这时我们就需要借助Make命令行变量的帮助来解决这一问题了。举一个简单的例子,看下面的C源文件和对应的Makefile:

/* foo.c */
int main() {
    printf("sizeof(long) = %d\n", sizeof(long));
}

#
# Makefile
#

CMODE = 64-bit

ifeq ($(CMODE), 64-bit)
    CFLAGS += -m64
endif
   
all:
    gcc $(CFLAGS) -o foo foo.c   

显然Makefile中CMODE的取值不同,编译出的foo执行的结果就不同。但我们确有这样的需求,我们需要通过控制CMODE的值来决定Build结果。我们不想改动Makefile,我们可以通过Make的命令行变量设置来解决这个问题。我们只需在执行make时传入"CMODE=32-bit"这个参数即可让Build过程按照非64位方式进行。

一般的带命令行变量的make命令格式是:make [variable1=value1 variable2=value2 ... ... ]。make命令行中传入的变量会覆盖Makefile文件中定义的同名的并且没有使用override修饰的变量。命令行上的变量的赋值也可以用支持直接展开的:=赋值符号。

有了这种方法,我们就可以在BuildBot的build factory实例化时传入带参数的step了,即可以通过不同参数来控制在各个平台上的自动构建了。

© 2011, bigwhite. 版权所有.

Related posts:

  1. 关于Makefile.am中与Build相关的变量设置
  2. Hello,autoconf和automake
  3. 使用Libtool创建库文件
  4. 发布一款轻量级C语言单元测试框架
  5. lcut增加对mock的支持