首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

Old-linux-0.11中上层Makefile

2013-10-15 
Old-linux-0.11顶层Makefile# Top Makefile## if you want the ram-disk device, define this to be the#

Old-linux-0.11顶层Makefile

# Top Makefile## if you want the ram-disk device, define this to be the# size in blocks.##虚拟内存盘ramdisk = (空)RAMDISK = #-DRAMDISK=512##8086汇编编译器和连接器. -0生成8086目标程序;-a生成与gas和gld部分兼容的代码AS86=as86 -0 -aLD86=ld86 -0##GNU assembler linkerAS=gasLD=gld#LDFLAGS=-s -x -M#连接器gld运行时用到的选项-s  -x  -M#-s 输出文件中省略所有的符号信息#-x 删除所有的局部符号#-M 在标准的输出设备上打印链接映像(link map)#连接映象:由连接程序产生的一种内存地址映象 其中列出了程序装入到内存中的位置信息 具体有如下信息:#目标文件及符号信息映射到内存中的位置  #公共符号如何放置  #连接中包含的所有文件成员及其引用的符号#CC=gcc $(RAMDISK)#RAMDISK =  #CC = gcc#编译工具为gcc#CFLAGS=-Wall -O -fstrength-reduce -fomit-frame-pointer \-fcombine-regs -mstring-insns#-Wall :打印所有的警告信息#-O    :使用该选项  编译器会试着减少目标代码的大小和执行时间。-formit-frame-pointer也会打开(对于无帧指针frame pointer)又支持调试的机器#-fstrength-reduce :优化循环语句#-fcombine-regs    :#-mstring-insns    :不知道这两个干嘛的 新版本的gcc不太支持 不不不  是不支持#CPP=cpp -nostdinc -Iinclude#cpp什么鸟东西?#-nostdinc -Iinclude 不要搜索标准的头文件目录中的文件 而是使用-I选项指定的目录或者是在当前的目录里搜索头文件### ROOT_DEV specifies the default root-device when making the image.# This can be either FLOPPY, /dev/xxxx or empty, in which case the# default of /dev/hd6 is used by 'build'.# in which case :在某种情况下# specifies :指定# FLOPPY :软的软盘ROOT_DEV=/dev/hd6#ROOT_DEV 指定在创建内核映象文件时所使用的默认根文件系统所在的设备ARCHIVES=kernel/kernel.o mm/mm.o fs/fs.o#kernel mm fs等目录所产生的目标代码文件。为了方便引用 在这里将它们用ARCHIVES(归档文件) 标识符表示DRIVERS =kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a  #块和字符设备库文件MATH=kernel/math/math.a#数学运算库文件LIBS=lib/lib.a#由lib/目录中生成的通用库文件#.a表示该文档是个归档文档  也即包含有许多可执行二进制代码子程序集合的库文件  通常是用GNU的ar程序生成。#ar是GNU的二进制文件处理程序 用于创建 修改以及从归档文件中抽取文件##### make老式的隐式后缀规则# 指示make利用下面的命令将所有的.c文件编译生成.s汇编程序 # 指使gcc采用前面CFLAGS所指定的选项以及仅使用include/目录中的头文件# 在适当的编译后不进行汇编就停止(-S) 从而产生与输入的各个C文件对应的汇编语言形式的代码文件。 (晓得这里有个疑问-S是Stop的意思?纳尼?)# 默认情况下所产生的汇编程序文件是原C文件名去掉.c而加上.s后缀。# -o表示其后是输出文件的形式。# 其中$*.s(或$@)是自动目标变量,$<代表第一个先决条件,这里即是符合条件*.c的文件。# ':'表示下面是该规则的命令.c.s:$(CC) $(CFLAGS) \-nostdinc -Iinclude -S -o $*.s $<# 将所有.s汇编程序文件编译成.o目标文件。下一条是实现该操作的具体命令# 使用gas编译器将汇编程序编译成.o目标文件。-c表示只编译或汇编,但不进行连接操作.s.o:$(AS) -c -o $*.o $<# 使用gcc将c语言编译成目标文件但不连接.c.o:$(CC) $(CFLAGS) \-nostdinc -Iinclude -c -o $*.o $<# # all表示创建Makefile所知的最顶层目标。这里即是image文件all:Image# 第一行说明:目标文件(Image文件)是由分号后面的4个元素产生# 下面两行是执行的命令# 第一行表示使用tools目录下的build工具程序将bootsect,setup,system文件以$(ROOT_DEV)为根文件系统设备组装成内核映象文件Image# 第二行的sysn同步命令是迫使缓冲块数据立即写盘并更新超级块#Image: boot/bootsect boot/setup tools/system tools/buildtools/build boot/bootsect boot/setup tools/system $(ROOT_DEV) > Imagesync## 表明disk这个目标要由Image产生# dd为UNIX标准命令:复制一个文件,根据选项进行转换和格式化# bs=表示一次读/写的字节数,if=表示输入的文件.of=表示输出到的文件# /dev/PS0指第一个软盘驱动器(设备文件)#这个可以改成/dev/fd0  编译完之后执行make disk直接把image文件插入到fd0里边,重新执行之后就会显示编译完的内容##为什么这里的/dev/PS0不行 尚不清楚disk: Imagedd bs=8192 if=Image of=/dev/PS0tools/build: tools/build.c$(CC) $(CFLAGS) \-o tools/build tools/build.c#boot/head.o: boot/head.s#tools/system:boot/head.o init/main.o \$(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS)$(LD) $(LDFLAGS) boot/head.o init/main.o \$(ARCHIVES) \$(DRIVERS) \$(MATH) \$(LIBS) \-o tools/system > System.map#最后的>System.map表示gld需要将连接映象重定向存放在System.map文件中#数学协处理函数文件math.a由下一行上的命令实现#进入kernel/math/目录 运行make工具程序kernel/math/math.a:(cd kernel/math; make)# 块设备函数文件 blk_drv.akernel/blk_drv/blk_drv.a:(cd kernel/blk_drv; make)# 字符备函数文件 chr_drv.akernel/chr_drv/chr_drv.a:(cd kernel/chr_drv; make)# 内核目标模块kernel.okernel/kernel.o:(cd kernel; make)# 内核管理模块mm.omm/mm.o:(cd mm; make)# 文件系统目标模块fs.ofs/fs.o:(cd fs; make)# 库函数lib.alib/lib.a:(cd lib; make)## 用8086汇编和连接器对setup.s文件进行编译生成setup文件# -s表示要取出目标文件中的符号信息#boot/setup: boot/setup.s$(AS86) -o boot/setup.o boot/setup.s$(LD86) -s -o boot/setup boot/setup.o# 生成bootsect.o磁盘引导块boot/bootsect:boot/bootsect.s$(AS86) -o boot/bootsect.o boot/bootsect.s$(LD86) -s -o boot/bootsect boot/bootsect.o## 在bootsect.s程序开口添加一行有关system文件长度信息# 首先生成含有 "SYSSIZE = 文件实际长度"一行信息的tmp.s文件,然后将bootsect.s文件添加在其后。# 取得system长度的方法是:# 利用ls命令对system文件进行长列表显示# 用grep命令取得列表上文件字节数字段信息,并定向保存在tmp.s临时文件中# cut命令用于剪切字符串# tr用于去除行尾的回车符# (实际长度 + 15)/16用于获得'节'表示的长度信息,1节=16字节#tmp.s:boot/bootsect.s tools/system(echo -n "SYSSIZE = (";ls -l tools/system | grep system \| cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.scat boot/bootsect.s >> tmp.s## 当执行"make clean"时,就会执行以下命令,去除所有编译连接生成的文件# "rm"是文件删除命令,选项-f含义是忽略不存在的文件,并且不显示删除信息# (cd mm;make clean)表示进入mm/目录,执行该目录Makefile文件中的clean规则clean:rm -f Image System.map tmp_make core boot/bootsect boot/setuprm -f init/*.o tools/system tools/build boot/*.o(cd mm;make clean)(cd fs;make clean)(cd kernel;make clean)(cd lib;make clean)## 该规则首先执行上面的clean规则,然后对linux/目录进行压缩,生成backup.Z压缩文件。# "cd .."表示退到linux/的上一级(父)目录# "tar cf - linux"表示对linux/目录执行tar归档程序,-cf表示需要创建新的归档文件# "| compress -"表示将tar程序的执行通过管道操作('|')传递给压缩程序compress,并将压缩程序的输出存成backup.Z文件# sysn同步命令迫使缓冲块数据立即写盘并更新超级块#backup: clean(cd .. ; tar cf - linux | compress - > backup.Z)sync## 该规则用于各文件的依赖关系。创建这些依赖关系是为了给make用来确定是否需要重建一个目标对象# 比如当某个文件头被改动过后,make就通过生成的依赖关系,重新编译与该头文件有关的所有*.c文件。# 具体方法如下:# 使用字符串编辑程序sed对Makefile文件(这里即是自己)进行处理,# 输出为删除Makefile文件中"### Dependencies"行后面的所有行,并生成tmp_make临时文件# 然后对init/目录下的每一个C文件(其实只有一个C文件main.c)执行gcc预处理操作# -M标志告诉预处理程序输出描述每个目标文件相关性的规则,并且这些规则符合make语法# 对于每一个源文件,预处理程序输出一个make规则,其结果形式是相应源程序文件的目标文件名加上其依赖关系--该源文件中包含的所有头文件列表# "$$i"实际上是$($i)的意思,"$i"是前面shell变量的值# 然后把预处理结果都加到临时文件tmp_make中,然后将该临时文件复制成新的makefile文件#dep:sed '/\#\#\# Dependencies/q' < Makefile > tmp_make(for i in init/*.c;do echo -n "init/";$(CPP) -M $$i;done) >> tmp_makecp tmp_make Makefile(cd fs; make dep)(cd kernel; make dep)(cd mm; make dep)#创建tmp_make并且追加相应内容 然后执行Makefile#打开fs kernel mm 子目录并执行make操作### Dependencies:init/main.o : init/main.c include/unistd.h include/sys/stat.h \  include/sys/types.h include/sys/times.h include/sys/utsname.h \  include/utime.h include/time.h include/linux/tty.h include/termios.h \  include/linux/sched.h include/linux/head.h include/linux/fs.h \  include/linux/mm.h include/signal.h include/asm/system.h include/asm/io.h \  include/stddef.h include/stdarg.h include/fcntl.h # main.o所有的依赖文件。# note : xunus 2013-10-14 00:29####本文参考网络博客 有事请留言。


热点排行