Nachos Notes -- Preparations

February 25, 2014

Makefile 规则

首先推荐一个非常好的资源GNU make中文手册,上面的讲解非常详细,已经超出了理解Nachos系统Makefile的需求。

make是构建和管理工程的非常便利的工具,使用Makefile作为自己的配置文件,在合理配置的条件下,能够实现自动化编译,因此,也成为Linux程序员的必修课。作为配置文件,Makefile中必须包括所有描述工程链接,编译甚至清理工作的详细解释。学习Makefile的语法,可以说是使用make工具的基础,也是重点。

Makefile的基本结构很简单,可以说是数个称作“规则”的句式组成的。

目标… : 依赖… 指令…

目标是一个名字,目的只是给后面的依赖以及指令一个标识,在命令行能够使用make your_target这样的语法执行一个特定的目标中的内容。默认的make则总是执行第一个目标。

依赖是通常是一个或者多个文件,也可能是另一个目标,用空格隔开。他们指的是实现目标需要哪些文件,如果没有,则递归寻找或编译之。依赖中可以使用通配符。

指令是当依赖满足是,需要执行的bash指令。一般来说都是带参数的编译,链接,清理文件,输出Log到控制台等等。

有两个地方值得注意

其一是当依赖的文件数量过多时,可以用反斜杠\另起一行,但\后不能有空格。

其二是指令必须使用[Tab]随进一格。

make工具默认带有编译功能,当一个.o文件列入依赖中时,make会自动寻找是否有同名的另一个目标,如果没有则默认使用同名的.c文件和其所依赖的.h文件编译之。但如果需要复杂参数的编译,仍需自己手写指令。

Makefile中的include语句与C语言类似,直接将所包含文件原封不动的读入后继续解析。这为复杂Makefile的多文件组织提供了很好的支持。

Makefile同样支持变量语法。

变量的定义如下:

变量1:文件1 文件2 $(变量2) …

变量类似C语言中的宏变量,直接进行字符串替换。使用时需在变量周围加上表示,以便与一般字符串区别

$(变量1)

Nachos Makefile中使用到的语法和规则大概就是以上了。

Nachos 的 Makefile 结构

根目录下的Makefile中并没有什么难懂的内容,all目标递归的对子文件夹调用make,clean目标则顾名思义,print目标打印出所有的文件。

根目录下还有Makefile.common和Makefile.dep两个文件,被子文件夹中的Makefile引用。各级目录的Makefile看似很长,事实上都是利用指令生成的,注意看根目录Makfile下调用make的方式,

1 $(MAKE) depend
2 $(MAKE) nachos

其中depend阶段就是在生成该目录下的Makefile。具体如何生成的,再Makefile.commom下的depend任务中写的很详细。

Makefile.common中有较多的gcc编译参数:

  • -E 表示只运行预编译,一般需要将结果重定向到另一个文件中。
  • -g 表示生成一些调试信息。
  • -Wshadow 当局部变量遮蔽(shadow)了参数、全局变量或者是其他局部变量时,该警告选项会给我们以警告信息。
  • -Wall 开启警告。注意这里的all所有并不包含所有警告,它只包含:-Wuninitialized -Wunused -Wswitch -Wsequence-point -Wparentheses -Wmissing-braces -Wimplicit -Wformat -Wcomment -Wchar-subscripts
  • -fwritable-strings 将string存储为可写数据。
  • -M 自动为.c文件加入.h共同编译。
  • -I 手动添加编译路径。
  • -P 禁用 -E 中的行数标号。 还有一些参数没弄明白意思,手册上也没发现,先挖个坑吧。注意到文件中的

CPP= gcc -E

这里的CPP显然就不是C-Plus-Plus而是C-PreProcessing了。

各级Makefile中用到了不少32位linux特有的库函数,对Ubuntu Desktop用户来说,有些可能并不是安装自带的。如果没有相关依赖,可以输入指令

1 $ sudo apt-get install build-essential
2 $ sudo apt-get install g++

安装完这两个包之后,就可以正常编译了。

Keyboard Stroke Frequency Analysis

Count and show keyboard strokes.

Koans Games

Published on May 12, 2014

About VIM and It’s Philosophy

Published on May 01, 2014