Linux0.01内核根目录Makefile注释

来源:互联网 发布:pureftpd mac 安装 编辑:程序博客网 时间:2024/04/30 23:22
[plain] view plaincopy
  1. #  
  2. # Makefile for linux.  
  3. # If you don't have '-mstring-insns' in your gcc (and nobody but me has :-)  
  4. # remove them from the CFLAGS defines.  
  5. #  
  6.   
  7. #  
  8. #8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码  
  9. #  
  10. AS86 =as -0 -a   
  11. CC86 =cc -0  
  12. LD86 =ld -0  
  13.   
  14. #  
  15. #GNU汇编编译器和连接器  
  16. #  
  17. AS =gas  
  18. LD =gld  
  19.   
  20. #  
  21. #GNU连接器gld运行时用到的选项  
  22. #-s 输出文件中省略所有的符号信息  
  23. #-x 删除所有的局部符号  
  24. #-M 在标准输出设备(显示器)上打印连接映象(link map).  
  25. #连接映象:由连接程序产生的一种内存地址映象,其中列出了程序装入到内存中的位置信息,具体有如下信息:  
  26. #目标文件及符号信息映射到内存中的位置  
  27. #公共符号如何放置  
  28. #连接中包含的所有文件成员及其引用的符号  
  29. #  
  30. LDFLAGS =-s -x -M  
  31.   
  32. #  
  33. #gcc是GNU C程序编译器,对于UNIX类的脚本程序而言,  
  34. #在引用定义的标识符时,需在前面加上$符号并用括号括住标识符  
  35. #  
  36. CC =gcc  
  37.   
  38. #  
  39. #GCC的选项.  
  40. #-Wall 打印所有的警告信息  
  41. #-O 对代码进行优化  
  42. #-fstrength-reduce 优化循环语句  
  43. #  
  44. CFLAGS =-Wall -O -fstrength-reduce -fomit-frame-pointer -fcombine-regs  
  45.   
  46. #  
  47. #CPP是gcc的预处理程序  
  48. #-nostdinc -Iinclude 不要搜索标准的头文件目录中的文件,  
  49. #而是使用-I选项指定的目录或者是在当前的目录里搜索头文件  
  50. #  
  51. CPP =gcc -E -nostdinc -Iinclude  
  52.   
  53. #   
  54. # kernel目录,mm目录,fs目录所产生的目标代码文件。  
  55. # 为了方便引用,在这里将它们用ARCHIVES(归档文件)标识符表示  
  56. #  
  57. ARCHIVES=kernel/kernel.o mm/mm.o fs/fs.o  
  58.   
  59. #  
  60. # 由lib/目录中生成的通用库文件  
  61. #  
  62. LIBS =lib/lib.a  
  63.   
  64. #  
  65. # make隐式后缀规则  
  66. # 指示make利用下面的命令将所有的.c文件编译生成.s汇编程序  
  67. # ':'表示下面是该规则的命令  
  68. # 规则:指使gcc采用前面CFLAGS所指定的选项以及仅使用include/目录中的头文件,  
  69. # 在适当的编译后不进行汇编就停止(-S),从而产生与输入的各个C文件对应的汇编语言形式的代码文件。  
  70. # 默认情况下所产生的汇编程序文件是原C文件名去掉.c而加上.s后缀。  
  71. # -o表示其后是输出文件的形式。  
  72. # 其中$*.s(或$@)是自动目标变量,$<代表第一个先决条件,这里即是符合条件*.c的文件。  
  73. #  
  74. .c.s:  
  75. $(CC) $(CFLAGS) \  
  76. -nostdinc -Iinclude -S -o $*.s $<  
  77.   
  78. #  
  79. # 将所有.s汇编程序文件编译成.o目标文件。下一条是实现该操作的具体命令  
  80. # 使用gas编译器将汇编程序编译成.o目标文件。-c表示只编译或汇编,但不进行连接操作  
  81. #  
  82. .s.o:  
  83. $(AS) -c -o $*.o $<  
  84.   
  85. #  
  86. # 使用gcc将c语言编译成目标文件但不连接  
  87. #  
  88. .c.o:  
  89. $(CC) $(CFLAGS) \  
  90. -nostdinc -Iinclude -c -o $*.o $<  
  91.   
  92. #  
  93. # all表示创建Makefile所知的最顶层目标。这里即是image文件  
  94. #  
  95. all: Image  
  96.   
  97. #  
  98. # 第一行说明:目标文件(Image文件)是由分号后面的3个元素产生  
  99. # 下面两行是执行的命令  
  100. # 第一行表示使用tools目录下的build工具程序将boot,system文件组装成内核映象文件Image  
  101. # 第二行的sysn同步命令是迫使缓冲块数据立即写盘并更新超级块  
  102. #  
  103. Image: boot/boot tools/system tools/build  
  104. tools/build boot/boot tools/system > Image  
  105. sync  
  106.   
  107. #chmem -- 修改系统内存数据  
  108. tools/build: tools/build.c  
  109. $(CC) $(CFLAGS) \  
  110. -o tools/build tools/build.c  
  111. chmem +65000 tools/build  
  112.   
  113. #  
  114. # 利用上面的.s.o规则生成head.o文件  
  115. #  
  116. boot/head.o: boot/head.s  
  117.   
  118. #  
  119. # 最后的>System.map表示gld需要将连接映象重定向存放在System.map文件中  
  120. #  
  121. tools/system: boot/head.o init/main.o \  
  122. $(ARCHIVES) $(LIBS)  
  123. $(LD) $(LDFLAGS) boot/head.o init/main.o \  
  124. $(ARCHIVES) \  
  125. $(LIBS) \  
  126. -o tools/system > System.map  
  127.   
  128. #  
  129. # 内核目标模块kernel.o  
  130. #  
  131. kernel/kernel.o:  
  132. (cd kernel; make)  
  133.   
  134. #  
  135. # 内核管理模块mm.o  
  136. #  
  137. mm/mm.o:  
  138. (cd mm; make)  
  139.   
  140. #  
  141. # 文件系统目标模块fs.o  
  142. #  
  143. fs/fs.o:  
  144. (cd fs; make)  
  145.   
  146. #  
  147. # 库函数lib.a  
  148. #  
  149. lib/lib.a:  
  150. (cd lib; make)  
  151.   
  152. #  
  153. # 在boot.s程序开口添加一行有关system文件长度信息  
  154. # 首先生成含有 "SYSSIZE = 文件实际长度"一行信息的tmp.s文件,然后将boot.s文件添加在其后。  
  155. # 取得system长度的方法是:  
  156. # 利用ls命令对system文件进行长列表显示  
  157. # 用grep命令取得列表上文件字节数字段信息,并定向保存在tmp.s临时文件中  
  158. # cut命令用于剪切字符串  
  159. # tr用于去除行尾的回车符  
  160. # (实际长度 + 15)/16用于获得'节'表示的长度信息,1节=16字节  
  161. # 用8086汇编和连接器对setup.s文件进行编译生成setup文件  
  162. # -s表示要取出目标文件中的符号信息  
  163. #  
  164. boot/boot: boot/boot.s tools/system  
  165. (echo -n "SYSSIZE = (";ls -l tools/system | grep system \  
  166. | cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.s  
  167. cat boot/boot.s >> tmp.s  
  168. $(AS86) -o boot/boot.o tmp.s  
  169. rm -f tmp.s  
  170. $(LD86) -s -o boot/boot boot/boot.o  
  171.   
  172. #  
  173. # 当执行"make clean"时,就会执行以下命令,去除所有编译连接生成的文件  
  174. # "rm"是文件删除命令,选项-f含义是忽略不存在的文件,并且不显示删除信息  
  175. # (cd mm;make clean)表示进入mm/目录,执行该目录Makefile文件中的clean规则  
  176. #  
  177. clean:  
  178. rm -f Image System.map tmp_make boot/boot core  
  179. rm -f init/*.o boot/*.o tools/system tools/build  
  180. (cd mm;make clean)  
  181. (cd fs;make clean)  
  182. (cd kernel;make clean)  
  183. (cd lib;make clean)  
  184.   
  185. #  
  186. # 该规则首先执行上面的clean规则,然后对linux/目录进行压缩,生成backup.Z压缩文件。  
  187. # "cd .."表示退到linux/的上一级(父)目录  
  188. # "tar cf - linux"表示对linux/目录执行tar归档程序,-cf表示需要创建新的归档文件  
  189. # "| compress -"表示将tar程序的执行通过管道操作('|')传递给压缩程序compress,并将压缩程序的输  
  190. #出存成backup.Z文件  
  191. # sysn同步命令迫使缓冲块数据立即写盘并更新超级块  
  192. #  
  193. backup: clean  
  194. (cd .. ; tar cf - linux | compress16 - > backup.Z)  
  195. sync  
  196.   
  197. #  
  198. # 该规则用于各文件的依赖关系。创建这些依赖关系是为了给make用来确定是否需要重建一个目标对象  
  199. # 比如当某个文件头被改动过后,make就通过生成的依赖关系,重新编译与该头文件有关的所有*.c文件。  
  200. # 具体方法如下:  
  201. # 使用字符串编辑程序sed对Makefile文件(这里即是自己)进行处理,  
  202. # 输出为删除Makefile文件中"### Dependencies"行后面的所有行,并生成tmp_make临时文件  
  203. # 然后对init/目录下的每一个C文件(其实只有一个C文件main.c)执行gcc预处理操作  
  204. # -M标志告诉预处理程序输出描述每个目标文件相关性的规则,并且这些规则符合make语法  
  205. # 对于每一个源文件,预处理程序输出一个make规则,其结果形式是相应源程序文件的目标文件名加上其依赖关系--该源文件中包含的所有头文件列表  
  206. # "$$i"实际上是$($i)的意思,"$i"是前面shell变量的值  
  207. # 然后把预处理结果都加到临时文件tmp_make中,然后将该临时文件复制成新的makefile文件  
  208. #  
  209. dep:  
  210. sed '/\#\#\# Dependencies/q' < Makefile > tmp_make  
  211. (for i in init/*.c;do echo -n "init/";$(CPP) -M $$i;done) >> tmp_make  
  212. cp tmp_make Makefile  
  213. (cd fs; make dep)  
  214. (cd kernel; make dep)  
  215. (cd mm; make dep)  
  216.   
  217. ### Dependencies:  
  218. init/main.o : init/main.c include/unistd.h include/sys/stat.h \  
  219. include/sys/types.h include/sys/times.h include/sys/utsname.h \  
  220. include/utime.h include/time.h include/linux/tty.h include/termios.h \  
  221. include/linux/sched.h include/linux/head.h include/linux/fs.h \  
  222. include/linux/mm.h include/asm/system.h include/asm/io.h include/stddef.h \  
  223. include/stdarg.h include/fcntl.h