Web Analytics

为buildc添加setup脚本

buildc在发布0.1.0版时并没有做好安装脚本,当时的建议是直接下载0.1.0的源码包或svn export/checkout源码包,并手工将buildc目录位置加入到用户的PATH环境变量中。近期buildc计划正式投入到项目中使用,为了方便大家安装以及以后的统一升级维护,我花了些时间给buildc加上了setup脚本。 Python有标准的程序分发方案,不过我对这些了解不多。buildc本身很简单,我觉得没有必要把安装做得很复杂,所以就自己动手编写了一个setup.py,不到100行,用于安装buildc。 Python的标准安装脚本也叫setup.py,我这里也借鉴了这个名字。有了setup.py,buildc的安装就简单多了: * 下载buildc Release包(当前最新是buildc-0.1.1) * 解压发布包,在发布包路径下,执行setup.py install [–prefix=YOUR_INSTALL_PATH] ...

February 7, 2012 · 3 min · Tony Bai

也谈C应用安装包制作与部署

虽然部门一直在做C应用,但这么多年来,在C应用的安装包制作以及部署方面做得还是很初级,可以说还没有达到规范的程度。各个产品线的C应用安装包种类多样,水平参差不齐:有些产品的源码包即是安装包,把源码包拿到生产环境下编译后使用;有的项目则将编译好的目标文件(.o)以及第三方库放在安装包中,在生产环境下重新链接生成可执行文件;有的组则稍微专业一些,安装包中放的是编译好的可执行文件,但在目标主机上安装和执行时也都遇到了一些问题,诸如运行环境中的第三方库版本号与程序所依赖的不一致等。 去年年底,我就将"C应用安装包制作和部署"的改进作为今年的一个工作重点。这两天我粗略地考量了一下这方面的内容,这里也简单地谈谈。 ...

February 1, 2012 · 4 min · Tony Bai

也谈C语言应用构建

构建是软件开发过程中最常见的活动之一,也是很容易被忽视的环节。规范以及高效的构建对软件开发过程而言是大有裨益的。C语言并非一门年轻的语言,其历史已甚为悠久了(相对于还年轻的IT领域^_^)。从C语言诞生以来,市面上存在的C语言应用何止千千万万。这些C应用的源码组织形式种类万千,从最简单的单个源文件,到复杂的诸如Apache httpd server这样庞大的Project。不过无论这些C应用的源码组织形态如何,构建都是这些应用开发过程中必不可少的一步。 ...

January 17, 2012 · 8 min · Tony Bai

C语言项目构建管理辅助工具 – buildc

这几年我一直从事C语言项目的开发。这些项目的规模都不算小,少则十几万代码,多则几十万行代码,至少也都算得上是中型项目吧。项目构建工具使用的是传统的Make工具,构建脚本都是自行编写的,构建时直接在顶层目录下敲入make即可。 这种传统的构建方式其实是很耗时费力的。比如执行make之前你需要根据项目代码的实际路径重新设定一些环境变量或修改Makefile中的某些标识路径的变量;你还要将项目依赖的各种内部公共库、第三方开源库悉数找到,并安装在指定目录下,修改Makefile中这些第三方库的路径配置。只有做完这些后,你才能顺利地执行Make。以后每当你更换一个环境,你就要将上面的步骤重复执行一遍。有的项目第三方依赖较多,要完整地搭建一个项目构建环境所耗费的时间也是很惊人的,特别是对一些不熟悉项目构建的新人更是如此。另外随着产品被要求具备在多个平台上运行的能力,你的构建脚本还要支持在多个平台上的构建,你要为项目所依赖的第三方库准备多个平台的版本;当某个依赖库版本进行了升级,你还要手工在多个环境下进行更新。 ...

December 8, 2011 · 10 min · Tony Bai

使用autoconf解决可移植性问题

昨天在编译项目代码时遇到了这样一个错误: xx_base.h:72:2: 错误:#error “One of _BIG_ENDIAN or _LITTLE_ENDIAN must be defined.” 这是预编译器的错误输出。原因很明显:预编译器在处理xx_base.h时没有发现_BIG_ENDIAN或_LITTLE_ENDIAN的定义,#error预处理宏输出了如上错误。下面是出现错误位置的源码片断: ...

August 23, 2011 · 5 min · Tony Bai

偿还N年前的一笔技术债

记得刚来公司时曾参与过一个项目,项目中用到了部门基础库中的一个B+树接口。不过在程序调试过程中我们发现可执行程序总是dump core(在sparc solaris上),经初步分析,断定问题就出在B+树接口处,但一时又找不到问题原因。还好这个B+树的实现者就坐在我的旁边。他分析后告诉我:这个B+树接口要求用户自定义的索引结构体的size应该为4的整数倍。按照他的说法,我为结构体打了padding,以满足结构体size为4的整数倍的要求。修改后果然不再dump core了。当时项目进度紧,我也没有求甚解,这件事也就过去了。 ...

July 21, 2011 · 6 min · Tony Bai

为函数添加enter和exit级trace

日常开发中,我们为了辅助程序调试常常在每个函数的出入口(entry/exit)增加Trace,一般我们多用宏来实现这些Trace语句,例如: #ifdef XX_DEBUG_ #define TRACE_ENTER() printf(“Enter %s\n”, __FUNCTION__) #define TRACE_EXIT() printf(“Exit %s\n”, __FUNCTION__) #else #define TRACE_ENTER() #define TRACE_EXIT() #endif ...

July 13, 2011 · 4 min · Tony Bai

也谈共享库2

我之前写过一篇名为"也谈共享库“的博文,对共享库的查找和符号解析机制做了还算比较详细的说明,不过百密一疏,总有一些意想不到的情况发生。这不今天我又遇到了一个有关共享库的新问题,这里将这个问题及其解决过程记录下来,也算是对上一篇文章中未涉及内容的一个补充吧。 N年前我曾参与过部门的一个可复用系统的设计开发,当时我们设计了一种插件式的系统结构,其中所谓的"插件"是以共享库的形式提供。主程序通过读取配置,获取插件的位置,并在运行期利用dlopen动态加载插件(.so文件),用dlsym查找、绑定并执行.so中的特定业务函数。 ...

July 7, 2011 · 6 min · Tony Bai

使用Make的命令行变量

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

May 19, 2011 · 2 min · Tony Bai

"%05s"行为未定义

下班前,一位同事发来的mail中提到这样一个问题:在Solaris上,新添加到Project中的一段代码编译有Warning,由于我们在Makefile的GCC命令行中设置了"视警告如错误“的-Werror编译选项,导致了项目无法成功Build。 这个Warning内容如下: warning: `0’ flag used with `%s’ printf format 产生这个Warning的那行代码大致是类似这样的:printf("%05s%06s\n”, “11”, “222”); 其实这段代码是从老项目中Copy出来的,在老项目中,这段代码运行的很是正常,也许它在老项目Build时也会产生Warning,不过之前大家也都没有关注。 ...

December 17, 2010 · 2 min · Tony Bai