Tuesday, May 05, 2009

从写Makefile谈起

最近一段时间,有所想,故整理成文。

上上个星期,去一家网络公司面试,面试官问我Makefile文件熟悉不?我说,很熟,现在工具很多了,automake一下子就搞定,听说cmake更厉害了。他不同意我的观点,说手写的Makefile要精通,了解各个文件,包的依赖关系,如果给你写一个类似于automake的工具,你会怎么写?我一时懵了,从没想过这个问题,只好瞎掰一番。

确实,在Linux下,普遍用automake,cmake工具。结合我现在的项目,mtk,via平台都是手写的Makefile,这么大的工程,automake,cmake等无法达到完美的方案。其重要原因是代码目录繁多,对于不同客户定制的,不同目标版本,要定义很多很多的宏。

昨晚把c++ primer 3th关于STL algorithm的例子代码编译一下,从12点开始,后面发现竟然花了1个小时,震撼啊!睡之前,想想,干嘛要花那么多的时间啊!明儿要找到原因。

首先,从网上找一个万能的Makefile文件,不过那个Makefile的功能是把所有的.c或.cpp文件编译成为一个bin文件,要动手对其修改.

ls *.C >> Makefile

OBJECTS= \
alg0.exe \
alg10.exe \
alg11.exe \
alg12.exe

CC = g++

CCFLAGS = -ansi -W -Wall

all: $(OBJECTS)

%.o:%.C
$(CC) $(CCFLAGS) -c $< -o $@
%.exe: %.o
$(CC) $(CCFLAGS) $< -o $@

clean:
rm -rf *.o

clobber: clean
rm -rf *.exe istream_iter

一共50多个.C文件,
然后手动一个个
(1) 把 *.C 改为 *.exe
(2) 在*.exe前面加一个tab
(3) 还有在除了末尾一个exe外,其他 *.exe后加tab,再加\符号

而且还是用 vim的 . 重复操作,觉得没什么.

今天想想,实在是太费时间了。
(1) :%s/\>.C/.exe/g
(2) 无意中浏览了水木社区的vi版FAQ才恍然大悟,写代码的时候,缩进时会用>,可是写Makefile文件时,却不会用了。
(3) :m,ns/$\t\\/g



C++ primer 3th 一些内容不是C++标准,那时C++标准还没出来。


(1)
#include <iostream.h> 要改为
#include <iostream>

using namespace std;

一些C库头文件 xxxx.h 改为 cxxxx

我不厌其烦的输入 using namespace std;
输入到到 spaces时,我还特意按了 tab,一下子就自动补充了,很爽啊。
可是,为什么不弄个单词缩写呢。
:abbr usn using namespace std

输入 usn后面再加; 不是很好么?

(2)
vector<int, allocator>
vector<string, allocator>
list<string, allocator>
改为
vector<int>
vecotr<string>
list<string>
就是把 , allocator 去掉. 我一边make,一边看error,一边修改。

三行shell,搞定:

for file in *.C
sed -i 's/, allocator//g' $file
done


总结:
1. 弄清楚,自己在干啥,宁可用错的方法去做对的事情,也不要用对的方法去做错误的事情。
2. 想想自己做的到底是不是重复的劳动?找到解决策略。
3. 节约时间,早点休息。

No comments: