寒假的作业是写一个操作系统。老师给我们的要求比较低,基本上是能看懂学长以前写过的代码就给及格,自己写的像样的基本上良以上了。当然一个学期蜻蜓点水地学了这点东西,写一个操作系统,能不能“操作”,还是个大问号呢。

参考书自然想到了于渊的《一个操作系统的实现》。目前基本上就是抄着大神的代码,然后改改变量名啥的。抄到第三章的时候,看起来以后还要继续编译好多次,所以就干脆写个 Makefile 偷懒。但是这 Makefile 我是需要写的时候就查,写完之后又忘。所以干脆自己写个文章记下来算了。

所以,这篇文章适合那些对 Makefile 有初步了解,但是不常用,需要找点线索来回忆的人(比如我)。如果是对 Makefile 一无所知的话,请 Google 之。

Makefile 是由很多组目标规则组成的。某种角度说,目标分为两种,一种是文件目标,一种是非文件目标。嗯,先写一个简单的 Makefile 吧:

需要注意的是,编写 Makefile 时,命令一定要以 Tab 开始,而不能以空格取代之。所以使用的编辑器一定要支持 Tab 并且不把 Tab 转换成空格才行。

然后,比如在写有上面 Makefile 的目录里,执行了 make all 操作,那么 make 程序将寻找 all 目标的依赖目标,即 test.bin, 是否在 Makefile 里存在。在上例中确实是存在的,所以 make 程序就去看 test.bin 的两个依赖目标,即 main.o 和 func.o 在 Makefile 里是否存在,事实是它们也是存在的。所以 make 先去 main.o 去看它的依赖目标,即 main.c 和 type.h, 但它们不在 Makefile 里,所以 make 程序就去寻找这两个文件是否存在。如果它们有任何一个比 main.o 要新,就执行 main.o 下的命令,把 main.o 编译出来。func.o 也类似。然后回溯到 test.bin, 如果 main.o 和 func.o 任何一个有更新,那么 test.bin 也会更新。然后,整个编译过程就结束了。

感觉这种以依赖的方式控制编译流程是挺好的。

最后把我目前操作系统写的 Makefile 贴出来备忘吧。