?? makefile
字號:
## if you want the ram-disk device, define this to be the # 如果你要使用RAM 盤設(shè)備的話,就# size in blocks. # 定義塊的大小。#RAMDISK = #-DRAMDISK=512AS86 =as86 -0 -a # 8086 匯編編譯器和連接器,見列表后的介紹。后帶的參數(shù)含義分別LD86 =ld86 -0 # 是:-0 生成8086 目標程序;-a 生成與gas 和gld 部分兼容的代碼。AS =gas # GNU 匯編編譯器和連接器,見列表后的介紹。LD =gldLDFLAGS =-s -x -M # GNU 連接器gld 運行時用到的選項。含義是:-s 輸出文件中省略所# 有的符號信息;-x 刪除所有局部符號;-M 表示需要在標準輸出設(shè)備# (顯示器)上打印連接映象(link map),是指由連接程序產(chǎn)生的一種# 內(nèi)存地址映象,其中列出了程序段裝入到內(nèi)存中的位置信息。具體# 來講有如下信息:head main kernel mm fs libbootsect setup systemBuild 工具內(nèi)核映象文件Image2.8 linux/Makefile 文件# ? 目標文件及符號信息映射到內(nèi)存中的位置;# ? 公共符號如何放置;# ? 連接中包含的所有文件成員及其引用的符號。CC =gcc $(RAMDISK) # gcc 是GNU C 程序編譯器。對于UNIX 類的腳本(script)程序而言,# 在引用定義的標識符時,需在前面加上$符號并用括號括住標識符。CFLAGS =-Wall -O -fstrength-reduce -fomit-frame-pointer \-fcombine-regs -mstring-insns # gcc 的選項。前一行最后的'\'符號表示下一行是續(xù)行。# 選項含義為:-Wall 打印所有警告信息;-O 對代碼進行優(yōu)化;# -fstrength-reduce 優(yōu)化循環(huán)語句;-mstring-insns 是# Linus 自己為gcc 增加的選項,可以去掉。CPP =cpp -nostdinc -Iinclude # cpp 是gcc 的前(預(yù))處理程序。-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'.#ROOT_DEV=/dev/hd6 # ROOT_DEV 指定在創(chuàng)建內(nèi)核映像(image)文件時所使用的默認根文件系統(tǒng)所# 在的設(shè)備,這可以是軟盤(FLOPPY)、/dev/xxxx 或者干脆空著,空著時# build 程序(在tools/目錄中)就使用默認值/dev/hd6。ARCHIVES=kernel/kernel.o mm/mm.o fs/fs.o # kernel 目錄、mm 目錄和fs 目錄所產(chǎn)生的目標代# 碼文件。為了方便引用在這里將它們用# ARCHIVES(歸檔文件)標識符表示。DRIVERS =kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a # 塊和字符設(shè)備庫文件。.a 表# 示該文件是個歸檔文件,也即包含有許多可執(zhí)行二進制代碼子程# 序集合的庫文件,通常是用GNU 的ar 程序生成。ar 是GNU 的二進制# 文件處理程序,用于創(chuàng)建、修改以及從歸檔文件中抽取文件。MATH =kernel/math/math.a # 數(shù)學(xué)運算庫文件。LIBS =lib/lib.a # 由lib/目錄中的文件所編譯生成的通用庫文件。.c.s: # make 老式的隱式后綴規(guī)則。該行指示make 利用下面的命令將所有的# .c 文件編譯生成.s 匯編程序。':'表示下面是該規(guī)則的命令。$(CC) $(CFLAGS) \-nostdinc -Iinclude -S -o $*.s $< # 指使gcc 采用前面CFLAGS 所指定的選項以及# 僅使用include/目錄中的頭文件,在適當?shù)鼐幾g后不進行匯編就# 停止(-S),從而產(chǎn)生與輸入的各個C 文件對應(yīng)的匯編語言形式的# 代碼文件。默認情況下所產(chǎn)生的匯編程序文件是原C 文件名去掉.c# 而加上.s 后綴。-o 表示其后是輸出文件的形式。其中$*.s(或$@)# 是自動目標變量,$<代表第一個先決條件,這里即是符合條件# *.c 的文件。.s.o: # 表示將所有.s 匯編程序文件編譯成.o 目標文件。下一條是實# 現(xiàn)該操作的具體命令。$(AS) -c -o $*.o $< # 使用gas 編譯器將匯編程序編譯成.o 目標文件。-c 表示只編譯# 或匯編,但不進行連接操作。.c.o: # 類似上面,*.c 文件-??*.o 目標文件。$(CC) $(CFLAGS) \-nostdinc -Iinclude -c -o $*.o $< # 使用gcc 將C 語言文件編譯成目標文件但不連接。all: Image # all 表示創(chuàng)建Makefile 所知的最頂層的目標。這里即是image 文件。2.8 linux/Makefile 文件Image: boot/bootsect boot/setup tools/system tools/build # 說明目標(Image 文件)是由# 分號后面的4 個元素產(chǎn)生,分別是boot/目錄中的bootsect 和# setup 文件、tools/目錄中的system 和build 文件。tools/build boot/bootsect boot/setup tools/system $(ROOT_DEV) > Imagesync # 這兩行是執(zhí)行的命令。第一行表示使用tools 目錄下的build 工具# 程序(下面會說明如何生成)將bootsect、setup 和system 文件# 以$(ROOT_DEV)為根文件系統(tǒng)設(shè)備組裝成內(nèi)核映像文件Image。# 第二行的sync 同步命令是迫使緩沖塊數(shù)據(jù)立即寫盤并更新超級塊。disk: Image # 表示disk 這個目標要由Image 產(chǎn)生。dd bs=8192 if=Image of=/dev/PS0 # dd 為UNIX 標準命令:復(fù)制一個文件,根據(jù)選項# 進行轉(zhuǎn)換和格式化。bs=表示一次讀/寫的字節(jié)數(shù)。# if=表示輸入的文件,of=表示輸出到的文件。# 這里/dev/PS0 是指第一個軟盤驅(qū)動器(設(shè)備文件)。tools/build: tools/build.c # 由tools 目錄下的build.c 程序生成執(zhí)行程序build。$(CC) $(CFLAGS) \-o tools/build tools/build.c # 編譯生成執(zhí)行程序build 的命令。boot/head.o: boot/head.s # 利用上面給出的.s.o 規(guī)則生成head.o 目標文件。tools/system: boot/head.o init/main.o \$(ARCHIVES) $(DRIVERS) $(MATH) $(LIBS) # 表示tools 目錄中的system 文件# 要由分號右邊所列的元素生成。$(LD) $(LDFLAGS) boot/head.o init/main.o \$(ARCHIVES) \$(DRIVERS) \$(MATH) \$(LIBS) \-o tools/system > System.map # 生成system 的命令。最后的 > System.map 表示# gld 需要將連接映象重定向存放在System.map 文件中。# 關(guān)于System.map 文件的用途參見注釋后的說明。kernel/math/math.a: # 數(shù)學(xué)協(xié)處理函數(shù)文件math.a 由下一行上的命令實現(xiàn)。(cd kernel/math; make) # 進入kernel/math/目錄;運行make 工具程序。# 下面從66--82 行的含義與此處的類似。kernel/blk_drv/blk_drv.a: # 塊設(shè)備函數(shù)文件blk_drv.a(cd kernel/blk_drv; make)kernel/chr_drv/chr_drv.a: # 字符設(shè)備函數(shù)文件chr_drv.a(cd kernel/chr_drv; make)kernel/kernel.o: # 內(nèi)核目標模塊kernel.o(cd kernel; make)mm/mm.o: # 內(nèi)存管理模塊mm.o(cd mm; make)fs/fs.o: # 文件系統(tǒng)目標模塊fs.o(cd fs; make)lib/lib.a: # 庫函數(shù)lib.a2.8 linux/Makefile 文件(cd lib; make)boot/setup: boot/setup.s # 這里開始的三行是使用8086 匯編和連接器$(AS86) -o boot/setup.o boot/setup.s # 對setup.s 文件進行編譯生成setup 文件。$(LD86) -s -o boot/setup boot/setup.o # -s 選項表示要去除目標文件中的符號信息。boot/bootsect: boot/bootsect.s # 同上。生成bootsect.o 磁盤引導(dǎo)塊。$(AS86) -o boot/bootsect.o boot/bootsect.s$(LD86) -s -o boot/bootsect boot/bootsect.otmp.s: boot/bootsect.s tools/system # 從92--95 這四行的作用是在bootsect.s 程序開頭添加# 一行有關(guān)system 文件長度信息。方法是首先生成含有“SYSSIZE = system 文件實際長度”# 一行信息的tmp.s 文件,然后將bootsect.s 文件添加在其后。取得system 長度的方法是:# 首先利用命令ls 對system 文件進行長列表顯示,用grep 命令取得列表行上文件字節(jié)數(shù)字段# 信息,并定向保存在tmp.s 臨時文件中。cut 命令用于剪切字符串,tr 用于去除行尾的回車符。# 其中:(實際長度 + 15)/16 用于獲得用‘節(jié)’表示的長度信息。1 節(jié) = 16 字節(jié)。(echo -n "SYSSIZE = (";ls -l tools/system | grep system \| cut -c25-31 | tr '\012' ' '; echo "+ 15 ) / 16") > tmp.scat boot/bootsect.s >> tmp.sclean: # 當執(zhí)行'make clean'時,就會執(zhí)行98--103 行上的命令,去除所有編譯連接生成的文件。# 'rm'是文件刪除命令,選項-f 含義是忽略不存在的文件,并且不顯示刪除信息。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) # 進入mm/目錄;執(zhí)行該目錄Makefile 文件中的clean 規(guī)則。(cd fs;make clean)(cd kernel;make clean)(cd lib;make clean)backup: clean # 該規(guī)則將首先執(zhí)行上面的clean 規(guī)則,然后對linux/目錄進行壓縮,生成# backup.Z 壓縮文件。'cd .. '表示退到linux/的上一級(父)目錄;# 'tar cf - linux'表示對linux/目錄執(zhí)行tar 歸檔程序。-cf 表示需要創(chuàng)建# 新的歸檔文件 '| compress -'表示將tar 程序的執(zhí)行通過管道操作('|')# 傳遞給壓縮程序compress,并將壓縮程序的輸出存成backup.Z 文件。(cd .. ; tar cf - linux | compress - > backup.Z)sync # 迫使緩沖塊數(shù)據(jù)立即寫盤并更新磁盤超級塊。dep:# 該目標或規(guī)則用于各文件之間的依賴關(guān)系。創(chuàng)建的這些依賴關(guān)系是為了給make 用來確定是否需要要# 重建一個目標對象的。比如當某個頭文件被改動過后,make 就通過生成的依賴關(guān)系,重新編譯與該# 頭文件有關(guān)的所有*.c 文件。具體方法如下:# 使用字符串編輯程序sed 對Makefile 文件(這里即是自己)進行處理,輸出為刪除Makefile# 文件中'### Dependencies'行后面的所有行(下面從118 開始的行),并生成tmp_make# 臨時文件(也即110 行的作用)。然后對init/目錄下的每一個C 文件(其實只有一個文件# main.c)執(zhí)行g(shù)cc 預(yù)處理操作,-M 標志告訴預(yù)處理程序輸出描述每個目標文件相關(guān)性的規(guī)則,# 并且這些規(guī)則符合make 語法。對于每一個源文件,預(yù)處理程序輸出一個make 規(guī)則,其結(jié)果# 形式是相應(yīng)源程序文件的目標文件名加上其依賴關(guān)系--該源文件中包含的所有頭文件列表。# 111 行中的$$i 實際上是$($i)的意思。這里$i 是這句前面的shell 變量的值。# 然后把預(yù)處理結(jié)果都添加到臨時文件tmp_make 中,然后將該臨時文件復(fù)制成新的Makefile 文件。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) # 對fs/目錄下的Makefile 文件也作同樣的處理。2.8 linux/Makefile 文件- 30 -(cd kernel; make dep)(cd mm; make dep)### 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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -