看了这样的makefile

11 Dec 2011

GNU make是个非常好的工具. 大部分Linux程序员都自己编写Makefile, 再利用make构建工程. 优秀的程序员编写层次分明的代码, 将它们放在合适的位置, 优雅地用make生成目标文件以及管理工程. 不过, 再好的工具和材料, 到了笨拙建造师手里, 也有可能造出丑陋的建筑. 我就看了这样一个例子.

这个工程共有 3 层目录: 顶层有一个makefile. 要编译某个平台的目标文件首先要进入这个以这个平台名字命名的子目录, 比如 "Linux-x86-xx". 子目录"Linux-x86-xx"内也有个makefile, 打开一看, 部分语句是这样的:

# makefile
compilevos: generateconfigfiles
		$(MAKE) -f ../../makefile xos.o
generateconfigfiles: runtailor
runtailor:
	...

发现上两层目录已经不属于这个工程了. 又看了下readme才知道要编译目标得先运行这个"Linux-x86-xx"目录里面的一个脚本"makelib", 部分语句是这样的:

# makelib
cd obj
make -f ../makefile compilelibs
cd ..

先进入"obj"这个子目录, 这样"makefile" 里面的"$(MAKE) -f ../../makefile xos.o" 其实是调用上层目录的makefile了. 看得我都吐血了. 往下看发现依然现象严重, 写这个makefile的哥儿们竟全用名字诸如"makeobj", "makexox", "maketarget"等脚本调用make的, 关键是在脚本里每次调用之前都先cd到另外一个目录里, 在makefile根本不知道这条命令是在哪个目录里执行的. "goto"都不能比肩.

这么好的make就这样给糟蹋了.