make 使用笔记
我们的项目使用的构建工具,从今年初开始,从 boost jam 转移到 gnu make 。
makefile 写起来并不是一件轻松的事情,但是 make 的规则比 jam 要简单许多(比 boost jam 更简洁易懂),很符合 unix 的 KISS 美学。学会用 make 以后,编程方式可以得到极大的扩展,比用 IDE 的时代要灵活许多。尤其是可以用大量的使用自生成代码,或是用工具去生成数据文件,这些在 IDE 里做会相对麻烦。我们的开发,也不用局限在少数几种语言上了。
make 这个工具,我基本上是边学边用的,遇到什么问题临时想个方法弄一下。这最终导致 makefile 看起来很丑陋。但没有关系,写 makefile 跟写程序一样,以后可以不断重构。况且使用 makefile 本身,就很容易做任何自动化的工作了。
今天随便写几个最近遇到的问题,以及解决方案。
跨平台的问题
我们的项目是跨平台的,自然我希望一套代码可以在各种平台下都能通过编译。所以我希望 makefile 里可以识别出具体平台。
Windows 平台的识别比较简单,我们不打算支持 Windows 9x 下编译(但可以在 Win9x 运行)。Windows NT 下,似乎可以读到一个环境变量 OS = Windows_NT 。识别出这个就一定是 Win32 平台了。
Posix 兼容的系统中,大部分代码是可以直接编译的,少部分还需要区分一下具体平台版本。通常会有一个环境变量叫做 OSTYPE ,可惜这个变量里放的是 OS 的具体版本号,比如我的桌面系统就是 freebsd6.2 。Linux 系统下似乎也会带上版本号。
后来我们换了个方法,改调用 shell 指令 uname 来解决这个问题。在 makefile 里写上 OS=$(shell uname) 即可。Freebsd 下是 FreeBSD ,Linux 下统一是 Linux 。
用管道生成数据文件的问题
我们项目中几乎所有的数据文件,都要求在开发期使用人眼可读的文本。这个决定是前几个月才做的,但是这几个月的应用中已经几次获益。人眼可读的文本总是可以很快发现许多开发工具的 bug ,一旦生成的数据有文件,找出来非常容易。
但是由于种种原因(不一定是效率原因),最终我们用到的数据文件可能还需要多最初的文本做一些有限的格式转换。所以我们写了一些数据转换的工具。
不仅如此,我们还有一些源代码生成器,也是需要处理一些文本,生成一些目标数据的。
在我们的项目里便有了许多的文本处理工具,有些可以借用 unix 下的现成工具,有些需要自己写。自己写的那些,为了代码简洁,我们通常没有实现太多的命令行参数,而仅仅用标准输入输出来处理数据。最终看起来是这样的:
cat xxx.src | my_processor.exe > xxx.obj
(windows 下则用 type 代替 cat)
my_processor.exe
是我们自己实现的文本处理器,有时候这个处理器没有被正常生成出来,或者本身处理出错,会导致不能正确的生成 xxx.obj 。
make 会因为程序运行出错而中断 make 流程,但是管道操作却有个特性:无论你程序是否正常退出,管道重定向的目标文件一定会被 shell 创建出来。也就是说, xxx.obj 一定会被创建出来,当出错时,它是一个长度为 0 的空文件。
这种情况下,第 2 次 make ,就会因为 xxx.obj 已经存在,而不会重新 build 它这个目标。
为了解决这个问题,我采用了这样一个做法:
cat xxx.src | my_processor.exe > xxx.obj.tmp && mv xxx.obj.tmp xxx.obj
( Windows 下用 type 代替 cat ,用 move /Y 代替 mv )
一旦中间出错,只会生成临时文件 xxx.obj.tmp 而不会产生 xxx.obj 了。
btw, 前几天鼓动同事在他的笔记本上装了 Ubuntu ,还是很不错的,他已经决定放弃 Windows 了。我不喜欢用本本,继续用 freebsd 做桌面好了。
微软应该不担心开源社区的人鼓捣 gcc kde gnome 这些东西,因为用 windows 的人永远会觉得 VC 更好用,Windows 桌面更强。Firefox 和 opera 能抢下 IE 的部分市场,也只是因为 IE 的安全性实在是值得担忧。真正对 windows 造成威胁的是越来越多的面对最终用户的应用程序可以在其他桌面系统上运行。比如我们正在开发的游戏。
我不反对 Windows ,但是我希望这个世界能有更多选择。
Comments
Posted by: ngn999 | (23) September 27, 2008 11:29 AM
Posted by: srdrm | (22) May 14, 2008 12:24 AM
Posted by: Cloud | (21) January 17, 2008 10:42 PM
Posted by: 你好 | (20) January 17, 2008 09:23 PM
Posted by: Cloud | (19) January 15, 2008 03:42 PM
Posted by: 你好 | (18) January 14, 2008 09:19 PM
Posted by: hw1979 | (17) September 18, 2007 10:58 AM
Posted by: momo | (16) September 13, 2007 10:14 AM
Posted by: Anonymous | (15) September 4, 2007 07:13 PM
Posted by: huyi | (14) September 3, 2007 05:02 PM
Posted by: Felix Wong | (13) September 1, 2007 09:04 PM
Posted by: longtrue | (12) September 1, 2007 06:35 PM
Posted by: missdeer | (11) September 1, 2007 12:59 PM
Posted by: rockcarry | (10) August 31, 2007 12:12 PM
Posted by: yuzhong | (9) August 31, 2007 11:39 AM
Posted by: Gawain | (8) August 31, 2007 11:11 AM
Posted by: Hydralisk | (7) August 31, 2007 11:05 AM
Posted by: alioxp | (6) August 31, 2007 09:23 AM
Posted by: Anonymous | (5) August 31, 2007 09:02 AM
Posted by: Solrex Yang | (4) August 31, 2007 08:50 AM
Posted by: Atry | (3) August 31, 2007 02:13 AM
Posted by: func | (2) August 30, 2007 11:56 PM
Posted by: 红色警戒 | (1) August 30, 2007 11:22 PM