关于Makefile

几乎所有的Linux项目都是使用make来进行项目管理的.make是依据Makefile来进行工作的.因此书写和阅读Makefile就是Linux程序员必备的一项基本功.

对于像我这样的newbie,写一个稍微复杂的Makefile必定会错误百出,原因是Makefile的命令语法与bash有相似之处,但是还有许多细节上的差别,比如
  • 赋值bash要求"="两边是不能有空格的,但是Makefile就允许.
  • 在bash中用if条件判断,就像VB一样,但是如果要在Makefile中使用的话,需要写到一行中,如果写不下,需要用"\"来告诉make,下面的一行和上面的这一行属于一个逻辑行.
  • Makefile还对TAB,空格有严格的要求,这个仿佛就像是Python.如果你不TAB就写一个命令,make不认为是一个命令,而如果写个ifdef而用了TAB的话,make会把ifdef当作一个命令来执行,而不是一个条件判断.
  • exit在Makefile中貌似起不到Bash中的效果,你要在Makefile中控制其执行情况必须用error才可以.
读Makefile就是执果索因(这是别人总结的),根据结果顺瓜摸藤,就比较容易了.而对于Makefile的语法如果单单能够要求读懂的话,也是比较简单。

一般情况,在一个项目中,用Makefile就完全能够进行项目管理了。但一些项目会由像Rules.mk,Post.mk之类的东西让我们感到望而生畏,仿佛Make是一项深不可测的东西。其实Rules.mk和Post.mk1.mk 2.mk没有什么区别。在一个论坛里面有下面一句话:
IIRC, traditionally, when people set up Makefiles and used files named rules.mk and make.mk, they put all the platform-independent stuff in make.mk, and all the platform-specific stuff in rules.mk. And then their Makefiles just included those, and each Makefile contained the things specific to each thing that was being built (like source filenames and such).

关于Makefile的学习,有一本介绍Makefile的电子书,写得非常好,它是由陈皓撰写,内容与文笔一样的优秀的--《跟我一起写Makefile》。需要下载的朋友,可以google之。BTW,能够表达能力极强的程序员着实太少,倘若都能够像陈皓这样,我们国家的计算机事业应该比印度高不少了吧。他的主页:http://coolshell.cn

<!---全文完--->

附录:
关于项目上的东西,以后时间久了,看它就可以了。
xenarm中的Makefile
Makefile生成的目标文件有4个: xen-bin xen xen.gz xen-syms

xen-bin 
arch/arm/Makefile 
17 $(TARGET): $(TARGET)-bin $(TARGET)-syms
18     @cp $(TARGET)-syms $@
fuck,xen-syms和xen原来是一个东西!
... 
29 $(TARGET)-bin: $(TARGET)-syms
30     $(OBJCOPY) $(OBJCOPYFLAGS) $< $@

xen-syms
 20 $(TARGET)-syms: arch-$(TARGET_MACHINE)/start.o $(ALL_OBJS) xen.lds
 21     $(OBJCOPY) -I binary -O elf32-littlearm -B arm 24.bmp image.o
 22     $(OBJCOPY) -I binary -O elf32-littlearm -B arm 8x16 en.o
 23     #$(OBJCOPY) -I binary -O elf32-littlearm -B arm shut.wav sound.o
 24     #$(OBJCOPY) -I binary -O elf32-littlearm -B arm mini mini.o
 25     $(LD) $(LDFLAGS) -N -T xen.lds arch-$(TARGET_MACHINE)/start.o $(ALL_OBJS    ) en.o image.o -o $@ 

xen
./Rules.mk
 30 TARGET  := $(BASEDIR)/xen

xen.gz
./Makefile
 18 $(TARGET).gz: $(TARGET)
 19     gzip -f -9 < $< > $@.new
 20     mv $@.new $@

--
Li Haifeng
Laboratory of Service Computing Technology and System
Home page:http://tek-life.org

评论

此博客中的热门博文

Linux/ARM Page Table Entry 属性设置分析

提交了30次才AC ---【附】POJ 2488解题报告

笔记