亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1525 | 回復(fù): 0
打印 上一主題 下一主題

Linux內(nèi)核Makefile文件 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-11-09 22:55 |只看該作者 |倒序瀏覽
Makefile包括五部分
--------------------------------------------
        Makefile                    頂層Makefile文件
        .config                     內(nèi)核配置文件
        arch/$(ARCH)/Makefile       機(jī)器體系Makefile文件
        scripts/Makefile.*          所有內(nèi)核Makefiles共用規(guī)則
        Kbuild                      其它makefile文件
   
通過內(nèi)核配置操作產(chǎn)生.config文件,頂層Makefile文件使用該文件的配置。頂層Makefile文件負(fù)責(zé)產(chǎn)生兩個主要的程序:vmlinux
(內(nèi)核image)和modules(模塊)。頂層Makefile文件根據(jù)內(nèi)核配置,通過遞歸編譯內(nèi)核代碼樹子目錄建立這兩個文件。機(jī)器體系
Makefile文件為頂層Makefile文件提供與機(jī)器相關(guān)的信息。每一個子目錄有一個Makefile文件,子目錄Makefile根據(jù)上級目錄
Makefile命令啟動編譯。這些Makefile使用.config文件配置數(shù)據(jù)構(gòu)建各種文件列表,并使用這些文件列表編譯內(nèi)嵌或模塊目標(biāo)文件。
scripts/Makefile.*包含了所有的定義和規(guī)則,與Makefile文件一起編譯出內(nèi)核程序。
角色分工
--------------------------------------------
人們與內(nèi)核Makefile存在四種不同的關(guān)系:
用戶           用戶使用"make menuconfig"配置內(nèi)核(生成.config配置文件)或"make"命令編譯內(nèi)核。他們通常不讀或編輯內(nèi)核Makefile文件或其他源文件。
普通開發(fā)者     普通開發(fā)者維護(hù)設(shè)備驅(qū)動程序、文件系統(tǒng)和網(wǎng)絡(luò)協(xié)議代碼,他們維護(hù)相關(guān)子系統(tǒng)的Makefile文件,因此他們需要內(nèi)核Makefile文件整體性的一般知識和關(guān)于kbuild公共接口的詳細(xì)知識。
體系開發(fā)者     體系開發(fā)者關(guān)注一個整體的體系架構(gòu),比如sparc或者ia64。體系開發(fā)者既需要掌握關(guān)于體系的Makefile文件,也要熟悉內(nèi)核Makefile文件。
內(nèi)核開發(fā)者     內(nèi)核開發(fā)者關(guān)注內(nèi)核編譯系統(tǒng)本身。他們需要清楚內(nèi)核Makefile文件的所有方面。
本文檔的讀者對象是普通開發(fā)者和系統(tǒng)開發(fā)者。
內(nèi)核編譯文件
--------------------------------------------
     內(nèi)核中大多數(shù)Makefile文件是使用kbuild基礎(chǔ)架構(gòu)的Makefile文件。本章介紹kbuild的Makefile中的語法。
目標(biāo)定義
--------------------------------------------
     目標(biāo)定義是Makefile文件的主要部分(核心)。這些目標(biāo)定義行定義了如何編譯文件,特殊的兼容選項和遞歸子目錄。最簡單的Makefile只包含一行: obj-y += foo.o
     這行告訴kbuild在該目錄下名為foo.o的目標(biāo)文件(object),foo.o通過編譯foo.c或者foo.S而得到。如果foo.o編譯成一個模塊,則使用obj-m變量,因此常見寫法如下:
     obj-$(CONFIG_FOO) += foo.o
     [color="#800000"]$(CONFIG_FOO)可以代表y(built-in對象)或m(module對象)。如果CONFIG_FOO不是y或m,那么這個文件不會被編譯和鏈接。
內(nèi)嵌對象 --- [color="#800000"]obj-y
--------------------------------------------
   
Makefile文件將為編譯vmlinux的目標(biāo)文件放在$(obj-y)列表中,這些列表依賴于內(nèi)核配置。Kbuild編譯所有的$(obj-y)文
件,然后調(diào)用"$(LD)
-r"合并這些文件到一個built-in.o文件中。built-in.o經(jīng)過父Makefile文件鏈接到vmlinux。$(obj-y)中的文件
順序很重要。列表中文件允許重復(fù),文件第一次出現(xiàn)將被鏈接到built-in.o,后續(xù)出現(xiàn)該文件將被忽略。
     鏈接順序之所以重要是因為一些函數(shù)在內(nèi)核引導(dǎo)時將按照他們出現(xiàn)的順序被調(diào)用,所以要牢記改變鏈接順序意味著也要改變SCSI控制器的檢測順序和重數(shù)磁盤。
     # drivers/isdn/i4l/Makefile
     # 內(nèi)核ISDN子系統(tǒng)和設(shè)備驅(qū)動程序Makefile
     # 每個配置項是一個文件列表
     obj-$(CONFIG_ISDN)            += isdn.o
     obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
可加載模塊 --- [color="#800000"]obj-m
--------------------------------------------
     $(obj-m)表示對象文件(object files)編譯成可加載的內(nèi)核模塊。
     一個模塊可以通過一個源文件或幾個源文件編譯而成。Makefile只需簡單地它們加到$(obj-m)。
     #drivers/isdn/i4l/Makefile
     obj-$(CONFIG_ISDN_PPP_BSDCOMP) += isdn_bsdcomp.o
     注意:在這個例子中$(CONFIG_ISDN_PPP_BSDCOMP)含義是'm'。
     如果內(nèi)核模塊通過幾個源文件編譯而成,使用以上同樣的方法。
     Kbuild需要知道通過哪些文件編譯模塊,因此需要設(shè)置一個[color="#800000"]$(-objs)變量。
     #drivers/isdn/i4l/Makefile
     obj-$(CONFIG_ISDN) [color="#800000"]+= isdn.o
     [color="#800000"]isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o
     在這個例子中,模塊名isdn.o. Kbuild首先編譯$(isdn-objs)中的object文件,然后運行"$(LD) -r"將列表中文件生成isdn.o.
     Kbuild使用后綴-objs、-y識別對象文件。這種方法允許Makefile使用CONFIG_符號值確定一個object文件是否是另外一個object的組成部分。
     #fs/ext2/Makefile
     obj-$(CONFIG_EXT2_FS)        += ext2.o
     ext2-y := balloc.o bitmap.o
     ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o
     在這個例子中,如果$(CONFIG_EXT2_FS_XATTR)表示'y',則ext2.o只有xattr.o組成部分。
     注意: 當(dāng)然,當(dāng)你將對象文件編譯到內(nèi)核時,以上語法同樣有效。因此,如果CONFIG_EXT2_FS=y,Kbuild將先編譯ext2.o文件,然后鏈接到built-in.o。
導(dǎo)出符號目標(biāo)
--------------------------------------------
     在Makefile文件中沒有特別導(dǎo)出符號的標(biāo)記。
庫文件 --- [color="#800000"]lib-y
--------------------------------------------
     obj-*中的object文件用于模塊或built-in.o編譯。object文件也可能編譯到庫文件中--lib.a。     所有羅列在lib-y中的object文件都將編譯到該目錄下的一個單一的庫文件中。
     包含在obj-y中的object文件如果也列舉在lib-y中將不會包含到庫文件中,因為他們不能被訪問。但lib-m中的object文件將被編譯進(jìn)lib.a庫文件。
     注意在相同的Makefile中可以列舉文件到buit-in內(nèi)核中也可以作為庫文件的一個組成部分。因此在同一個目錄下既可以有built-in.o也可以有l(wèi)ib.a文件。
     #arch/i386/lib/Makefile
     lib-y      := checksum.o delay.o
     這樣將基于checksum.o、delay.o創(chuàng)建一個lib.a文件。
     對于內(nèi)核編譯來說,lib.a文件被包含在libs-y中。lib-y通常被限制使用在lib/和arch/*/lib目錄中。
目錄遞歸
--------------------------------------------
     Makefile文件負(fù)責(zé)編譯當(dāng)前目錄下的目標(biāo)文件,子目錄中的文件由子目錄中的Makefile文件負(fù)責(zé)編譯。編譯系統(tǒng)將使用obj-y和obj-m自動遞歸編譯各個子目錄中文件。
     如果ext2是一個子目錄,fs目錄下的Makefile將使用以下賦值語句是編譯系統(tǒng)編譯ext2子目錄。
     #fs/Makefile
     obj-$(CONFIG_EXT2_FS) += ext2/
     如果CONFIG_EXT2_FS設(shè)置成'y(built-in)或'm'(modular),則對應(yīng)的obj-變量也要設(shè)置,內(nèi)核編譯系統(tǒng)將進(jìn)入ext2目錄編譯文件。
   
內(nèi)核編譯系統(tǒng)只使用這些信息來決定是否需要編譯這個目錄,子目錄中Makefile文件規(guī)定那些文件編譯為模塊那些是內(nèi)核內(nèi)嵌對象。當(dāng)指定目錄名時使用
CONFIG_變量是一種良好的做法。如果CONFIG_選項不為'y'或'm',內(nèi)核編譯系統(tǒng)就會跳過這個目錄。
編譯標(biāo)記
--------------------------------------------
     EXTRA_CFLAGS, EXTRA_AFLAGS, EXTRA_LDFLAGS, EXTRA_ARFLAGS
     所有的EXTRA_變量只能使用在定義該變量后的Makefile文件中。EXTRA_變量被Makefile文件所有的執(zhí)行命令語句所使用。
     $(EXTRA_CFLAGS)是使用$(CC)編譯C文件的選項。
     # drivers/sound/emu10k1/Makefile
     EXTRA_CFLAGS += -I$(obj)
     ifdef
          DEBUG EXTRA_CFLAGS += -DEMU10K1_DEBUG
      endif
     定義這個變量是必須的,因為頂層Makefile定義了$(CFLAGS)變量并使用該變量編譯整個代碼樹。
     $(EXTRA_AFLAGS)是每個目錄編譯匯編語言源文件的選項。
     #arch/x86_64/kernel/Makefile
     EXTRA_AFLAGS := -traditional
     $(EXTRA_LDFLAGS)和$(EXTRA_ARFLAGS)用于每個目錄的$(LD)和$(AR)選項。
     例如: #arch/m68k/fpsp040/Makefile
             EXTRA_LDFLAGS := -x
     CFLAGS_$@和AFLAGS_$@只使用到當(dāng)前Makefile文件的命令中。$(CFLAGS_$@)定義了使用$(CC)的每個文件的選項。$@部分代表該文件。
      例如: # drivers/scsi/Makefile
[color="#000000"]             CFLAGS_aha152x.o = -DAHA152X_STAT -DAUTOCONF
[color="#000000"]             CFLAGS_gdth.o     = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ \
-DGDTH_STATISTICS
[color="#000000"]             CFLAGS_seagate.o = -DARBITRATE -DPARITY -DSEAGATE_USE_ASM
     這三行定義了aha152x.o、gdth.o和seagate.o文件的編譯選項。
     $(AFLAGS_$@)使用在匯編語言代碼文件中,具有同上相同的含義。
     例如: # arch/arm/kernel/Makefile
[color="#000000"]             AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -traditional
[color="#000000"]             AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) -traditional
依賴關(guān)系
--------------------------------------------
     內(nèi)核編譯記錄如下依賴關(guān)系:
          1) 所有的前提文件(both *.c and *.h)
         2) CONFIG_選項影響到的所有文件
         3) 編譯目標(biāo)文件使用的命令行
     因此,假如改變$(CC)的一個選項,所有相關(guān)的文件都要重新編譯。
特殊規(guī)則
--------------------------------------------
     特殊規(guī)則使用在內(nèi)核編譯需要規(guī)則定義而沒有相應(yīng)定義的時候。典型的例子如編譯時頭文件的產(chǎn)生規(guī)則。其他例子有體系Makefile編譯引導(dǎo)映像的特殊規(guī)則。特殊規(guī)則寫法同普通的Make規(guī)則。
     Kbuild(應(yīng)該是編譯程序)在Makefile所在的目錄不能被執(zhí)行,因此所有的特殊規(guī)則需要提供前提文件和目標(biāo)文件的相對路徑。
     定義特殊規(guī)則時將使用到兩個變量:
     $(src): $(src)是對于Makefile文件目錄的相對路徑,當(dāng)使用代碼樹中的文件時使用該變量$(src)。
     $(obj): $(obj)是目標(biāo)文件目錄的相對路徑。生成文件使用$(obj)變量。
     例如: #drivers/scsi/Makefile
[color="#000000"]             $(obj)/53c8xx_d.h: $(src)/53c7,8xx.scr $(src)/script_asm.pl
[color="#000000"]             $(CPP) -DCHIP=810 - -objs)包含了所有的用于鏈接最終可執(zhí)行程序的對象。
      例如: #scripts/lxdialog/Makefile
[color="#000000"]             hostprogs-y    := lxdialog
[color="#000000"]             lxdialog-objs := checklist.o lxdialog.o
     擴(kuò)展名.o文件都編譯自對應(yīng)的.c文件。在上面的例子中checklist.c編譯成checklist.o,lxdialog.c編譯為lxdialog.o。最后兩個.o文件鏈接成可執(zhí)行文件lxdialog。
     注意:語法-y不能用于定義主機(jī)程序。
定義共享庫
     擴(kuò)展名為.so的對象是共享庫文件,并且是位置無關(guān)的object文件。內(nèi)核編譯系統(tǒng)提供共享庫使用支持,但使用方法有限制。在下面例子中l(wèi)ibkconfig.so庫文件被鏈接到可執(zhí)行文件conf中。
     例如: #scripts/kconfig/Makefile
[color="#000000"]             hostprogs-y      := conf
[color="#000000"]             conf-objs        := conf.o libkconfig.so
[color="#000000"]             libkconfig-objs := expr.o type.o
     共享庫文件需要對應(yīng)的-objs定義, 在上面例子中庫libkconfig由兩個對象組成:expr.o和type.o。expr.o和type.o將被編譯為位置無關(guān)代碼并被鏈接如libkconfig.so。共享庫不支持C++語言。
C++語言使用方法
     內(nèi)核編譯系統(tǒng)提供了對C++主機(jī)程序的支持以用于內(nèi)核配置,但不主張其它方面使用這種方法。
     例如: #scripts/kconfig/Makefile
[color="#000000"]             hostprogs-y      := qconf
[color="#000000"]             qconf-cxxobjs := qconf.o
     在上面例子中可執(zhí)行文件由C++文件qconf.cc組成 - 通過$(qconf-cxxobjs)標(biāo)識。如果qconf由.c和.cc文件混合組成,附加行表示這種情況。
     例如: #scripts/kconfig/Makefile
[color="#000000"]             hostprogs-y      := qconf
[color="#000000"]             qconf-cxxobjs := qconf.o
[color="#000000"]             qconf-objs      := check.o
輔助程序編譯控制選項
     當(dāng)編譯主機(jī)程序時仍然可以使用$(HOSTCFLAGS)設(shè)置編譯選項傳遞給$(HOSTCC)。這些選項將影響所有使用變量HOST_EXTRACFLAG的Makefile創(chuàng)建的主機(jī)程序。
     例如: #scripts/lxdialog/Makefile
[color="#000000"]             HOST_EXTRACFLAGS += -I/usr/include/ncurses
     為單個文件設(shè)置選項使用下面方式:
     例如: #arch/ppc64/boot/Makefile
[color="#000000"]             HOSTCFLAGS_piggyback.o := -DKERNELBASE=$(KERNELBASE)
     也可以使用附加鏈接選項:
      例如: #scripts/kconfig/Makefile
[color="#000000"]             HOSTLOADLIBES_qconf := -L$(QTDIR)/lib
     當(dāng)鏈接qconf時將使用外部選項"-L$(QTDIR)/lib"。
何時建立輔助程序
     只有當(dāng)需要時內(nèi)核編譯系統(tǒng)才會編譯主機(jī)程序。有兩種方式:
     (1) 在特殊規(guī)則中作為隱式的前提需求
     例如: #drivers/pci/Makefile
[color="#000000"]             hostprogs-y := gen-devlist
[color="#000000"]             $(obj)/devlist.h: $(src)/pci.ids $(obj)/gen-devlist
[color="#000000"]             ( cd $(obj); ./gen-devlist ) [color="#000000"]             hostprogs-y      := lxdialog
[color="#000000"]             always        := $(hostprogs-y)
     這樣就告訴內(nèi)核編譯系統(tǒng)即使沒有任何規(guī)則使用lxdialog也要編譯它。
使用hostprogs-$(CONFIG_FOO)
     在Kbuild文件中典型模式如下:
     例如: #scripts/Makefile
[color="#000000"]             hostprogs-$(CONFIG_KALLSYMS) += kallsyms
     對Kbuild來說'y'用于內(nèi)嵌對象'm'用于模塊。
     因此如果config符號是'm',編譯系統(tǒng)也將創(chuàng)建該程序。換句話說內(nèi)核編譯系統(tǒng)等同看待hostprogs-m和hostprogs-y。但如果不涉及到CONFIG符號僅建議使用hostprogs-y。
編譯清除機(jī)制
--------------------------------------------
    "make clean"命令刪除在編譯內(nèi)核生成的大部分文件,例如主機(jī)程序,列舉在
$(hostprogs-y)、$(hostprogs-m)、$(always)、$(extra-y)和$(targets)中目標(biāo)文件都將被刪除。
代碼目錄數(shù)中的"*.[oas]"、"*.ko"文件和一些由編譯系統(tǒng)產(chǎn)生的附加文件也將被刪除。
     附加文件可以使用$(clean-files)進(jìn)行定義。
     例如: #drivers/pci/Makefile
[color="#000000"]             clean-files := devlist.h classlist.h
     當(dāng)執(zhí)行"make clean"命令時, "devlist.h classlist.h"兩個文件將被刪除。內(nèi)核編譯系統(tǒng)默認(rèn)這些文件與Makefile具有相同的相對路徑,否則需要設(shè)置以'/'開頭的絕對路徑。
     刪除整個目錄使用以下方式:
     例如: #scripts/package/Makefile
[color="#000000"]             clean-dirs := $(objtree)/debian/
     這樣就將刪除包括子目錄在內(nèi)的整個debian目錄。如果不使用以'/'開頭的絕對路徑內(nèi)核編譯系統(tǒng)見默認(rèn)使用相對路徑。
     通常內(nèi)核編譯系統(tǒng)根據(jù)"obj-* := dir/"進(jìn)入子目錄,但是在體系Makefile中需要顯式使用如下方式:
     例如: #arch/i386/boot/Makefile
[color="#000000"]             subdir- := compressed/
     上面賦值語句指示編譯系統(tǒng)執(zhí)行"make clean"命令時進(jìn)入compressed/目錄。
     在編譯最終的引導(dǎo)映像文件的Makefile中有一個可選的目標(biāo)對象名稱是archclean。
     例如: #arch/i386/Makefile
[color="#000000"]             archclean:
[color="#000000"]             $(Q)$(MAKE) $(clean)=arch/i386/boot
     當(dāng)執(zhí)行"make clean"時編譯器進(jìn)入arch/i386/boot并象通常一樣工作。arch/i386/boot中的Makefile文件可以使用subdir-標(biāo)識進(jìn)入更下層的目錄。
      注意1: arch/$(ARCH)/Makefile不能使用"subdir-",因為它被包含在頂層Makefile文件中,在這個位置編譯機(jī)制是不起作用的。
      注意2: 所有列舉在core-y、libs-y、drivers-y和net-y中的目錄將被"make clean"命令清除。
               
               
               

本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/33048/showart_2090262.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP