亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? uclinux中makefile文件整體分析.txt

?? uClinux中Makefile文件整體分析
?? TXT
字號:
[精華] uClinux中Makefile文件整體分析(他山之石)  回復(fù)  
 
 


--------------------------------------------------------------------------------------- 
uClinux中Makefile文件整體分析 
--------------------------------------------------------------------------------------- 
1、概述 
~~~~~~~ 
uClinux/目錄下的這個Makefile 是個總領(lǐng)式的文件,通過它又層層包含調(diào)用各個目錄、子目錄下面對應(yīng)Makefile,就這樣層層調(diào)用下去,從而完成整個軟件系統(tǒng)的編譯。 


2、具體分析 
~~~~~~~~~~ 
下面根據(jù)uClinux/Makefile 文件的內(nèi)容(內(nèi)容有刪節(jié))大致介紹一下整個編譯的調(diào)用關(guān)系。 

---------------------------------------------------------------------------------------- 
include common.mk 
---------------------------------------------------------------------------------------- 

首先包含common.mk,它里面定義了一些通用的全局變量,例如:common.mk 文件中有如下內(nèi)容: 
.EXPORT_ALL_VARIABLES: 
(相當(dāng)于C 中的extern 關(guān)鍵字,表示下面的宏變量可以為其它文件所使用) 
ROOTDIR = $(shell pwd) 
TOOLS = $(ROOTDIR)/tools 

---------------------------------------------------------------------------------------- 
.EXPORT_ALL_VARIABLES 
---------------------------------------------------------------------------------------- 

輸出下面所有全局變量 

---------------------------------------------------------------------------------------- 
IMAGEFILE = image.bin 
IMAGEZFILE = imagez.bin 
ELFFILE = image.elf 
SRECFILE = image.srec 
IMAGE = $(ROOTDIR)/images/$(IMAGEFILE) 
IMAGEZ = $(ROOTDIR)/images/$(IMAGEZFILE) 
ELFIMAGE = $(ROOTDIR)/images/$(ELFFILE) 
SRECIMAGE = $(ROOTDIR)/images/$(SRECFILE) 
ROMFS = $(ROOTDIR)/romfs 
ROMFSIMG = $(ROOTDIR)/images/romfs.img 
TOPDIR = $(ROOTDIR)/linux 
HOSTCC = unset GCC_EXEC_PREFIX ; gcc -I$(TOPDIR)/include 

DIRS = linux lib user 
---------------------------------------------------------------------------------------- 

all 告訴編譯器執(zhí)行make 都要分完成哪些工作步驟,這是最重要的地方! 
看一個Makefile 首先要從它的all 看起,就相當(dāng)于C 語言的main()函數(shù)的作用。 
然后再從all 層層分析下去。 

---------------------------------------------------------------------------------------- 
all: config-test subdirs build-romfs $(IMAGE) 
---------------------------------------------------------------------------------------- 

這里共四步工作,即: 

---------------------------------------------------------------------------------------- 
* config-test 
* subdirs 
* build-romfs 
* $(IMAGE),即上面的IMAGE 變量,Makefile 中用$(變量名)來使用變量,這中用法對許多熟悉各種腳本語言的用戶并不陌生。 

下面在Makefile 分別找到各步工作對應(yīng)的部分: 

---------------------------------------------------------------------------------------- 
(1) config-test: 
@if [ ! -f .config -o ! -f linux/.config -o ! -f 
vendors/.config ]; then \ 
---------------------------------------------------------------------------------------- 

若找不到.config 文件或者找不到linux/.config 或者找不到 
vendors/.config 文件,就提示需要make config 或者make xconfig 

---------------------------------------------------------------------------------------- 
echo "ERROR: you need to do a 'make config' first" ; \ 
exit 1 ; \ 
fi 
@if [ ! -d romfs ]; then \ 
【必須有romfs 這個目錄】 
echo "ERROR: you need to run 'make romfs' as root first" ;\ 
exit 1 ; \ 
fi 


(2)subdirs 
~~~~~~~~~~~~ 
subdirs: 
@if [ ! -f linux/.depend ] ; then \ 
【若沒找到linux/.depend 文件,就提示要make dep】 
echo "ERROR: you need to do a 'make dep' first" ; 
exit 1 ; \ 
fi 
for dir in $(DIRS) ; do make -C $$dir || exit 1 ; done 
---------------------------------------------------------------------------------------- 

【上面這一句雖短,但確是最主要的工作所在,注意到前面定義了: 
DIRS = linux lib user 
因此這一句: 
make -C $$dir 
就完成了對內(nèi)核(linux 目錄)的編譯、對libC 庫(lib)的編譯、對所有應(yīng)用程序(user 下所有指定要編譯的目錄)的編譯。 
make -C $$dir 就調(diào)用對應(yīng)那個目錄下的Makefile , 即分別是linux/Makefile,lib/Makefile 和user/Makefile,這Makefile 又層層包含調(diào)用下面的各個目錄的Makefile,從而完成整個編譯過程。】 

其中編譯user 下各個應(yīng)用程序時,每個應(yīng)用程序目錄下的Makefile 中都要執(zhí)行如下一句: 
$(CONVERT) 
這個宏是在uClinux/user/arch/coldfire/目錄下的build.mk 文件中指定的,這個文件的作用就相當(dāng)于uClinux/common.mk,它為應(yīng)用程序的編譯定義了許多公共的宏,例如所采用的編譯器(CC)等。LINUX 內(nèi)核都是用m68k-coff-gcc 編譯的,但應(yīng)用程序可以采用不同的gcc 編譯器。 

這個文件的部分內(nèi)容如下: 
.EXPORT_ALL_VARIABLES: 
CC = $(TOOLS)/m68k-elf-gcc 
CXX = $(TOOLS)/m68k-elf-g++ 
AR = $(TOOLS)/m68k-elf-ar 
LD = $(TOOLS)/m68k-elf-ld 
OBJCOPY = $(TOOLS)/m68k-elf-objcopy 
RANLIB = $(TOOLS)/m68k-elf-ranlib 
ELF2FLT = $(TOOLS)/elf2flt 
GCC_EXEC_PREFIX = $(TOOLS)/m68k-elf- 
LIBC = $(ROOTDIR)/lib/libc/libc.a 
LIBM = $(ROOTDIR)/lib/libm/libmf.a 
LIBNET = $(ROOTDIR)/lib/libnet/libnet.a 
LIBDES = $(ROOTDIR)/lib/libdes/libdes.a 
LIBPCAP = $(ROOTDIR)/lib/libpcap/libpcap.a 
LIBSSL = $(ROOTDIR)/lib/libssl/libssl.a 
LIBCRYPTO = $(ROOTDIR)/lib/libssl/libcrypto.a 
LIBGCC = $(TOOLS)/gcc-lib/libgcc.a 
ARCH = -m5200 -Wa,-m5200 -DCONFIG_COLDFIRE 
DEFS = -Dlinux -D__linux__ -Dunix -DEMBED 
INCS = $(INCGCC) $(INCLIBC) $(INCLIBM) $(INCVEND) 
CCFLAGS = -O2 -msoft-float 【編譯參數(shù)】 
CFLAGS = $(DEBUG_CFLAGS) $(ARCH) $(DEFS) $(CCFLAGS) $(INCS) - 
fno-builtin 【編譯參數(shù)】 
LDFLAGS = --sort-common -r $(STARTUP) 【鏈接參數(shù)】 
最后定義了CONVERT 宏: 
CONVERT = mv $$@.elf .$$@.elf; \ 
$(LD) -T $(LDSCRIPT) -Ur -o $$@.elf .$$@.elf; \ 
$(LD) -T $(LDSCRIPT) -o $$@.gdb .$$@.elf; \ 
rm -f .$$@.elf; \ 
$(ELF2FLT) $$(FLTFLAGS) -o $$@ $$@.elf 
它采用elf2flt 工具將編譯生成的ELF 格式可執(zhí)行文件轉(zhuǎn)換為uClinux 所支持的FLAT 文件格式。 
【注】 
uClinux 唯一支持的可執(zhí)行文件格式就是FLAT 格式。其它都不支持。 
所以所有要在uClinux 上跑的應(yīng)用都必須轉(zhuǎn)換為FLAT 格式。PC REDHATLINUX 不支持這種格式的可執(zhí)行文件,所以這些可執(zhí)行文件都無法在PC 上 
執(zhí)行。 


(3)build-romfs 
~~~~~~~~~~~~~~~ 
build-romfs: images 
make -f romfs.mk 
build-romfs 后面跟了images,表明它依賴于images 先執(zhí)行的結(jié)果: 
images: 
[ -d images ] || mkdir images 
images 只是檢查是否有images 目錄,若沒有就創(chuàng)建該目錄。 
下面的make -f romfs.mk 就調(diào)用執(zhí)行romfs.mk。 
下面是romfs.mk 文件中的內(nèi)容: 
這也是個Makefile,因此如前所述,要從它的all 入口看起: 
all: copy-files 
$(TOOLS)/genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d 
$(ROMFSDIR) 
all 要先依賴copy-files 部分的完成: 
copy-files: 
cp $(RAMFSy) romfs/etc/ramfs.img 
[ ! "$(BINy)" ] || cp $(BINy) romfs/bin/. 
rm romfs/etc/services 
rm romfs/etc/inetd.conf 
make -C user build-romfs 
-find romfs -name CVS | xargs rm -rf 
這里主要的工作就是一句: 
[ ! "$(BINy)" ] || cp $(BINy) romfs/bin/. 
完成user/下各個參與的應(yīng)用程序目錄下的編譯生成的可執(zhí)行文件的收集,將它們復(fù)制到romfs/bin/目錄下。 
下一步就是romfs 目錄的打包,生成romfs.img 二進(jìn)IMAGE 文件,它就是我們常說的ROMFS 文件系統(tǒng)的映像文件: 
$(TOOLS)/genromfs -v -V "ROMdisk" -f $(ROMFSIMG) -d $(ROMFSDIR) 
至此就完成了romfs.mk 中的工作,下面返uClinux/Makefile 的內(nèi)容繼續(xù): 

(4) $(IMAGE) 
~~~~~~~~~~~~~~~~ 
IMAGE 變量為: 
IMAGE = $(ROOTDIR)/images/image.bin 
這就是最后被復(fù)制到/tftpboot/目錄下的image.bin 文件,也就是最后可以燒寫或下載的二進(jìn)制IMAGE 文件。 
$(IMAGE): images images/linux.bin 
cat images/linux.bin $(ROMFSIMG) > $(IMAGE) 
$(TOOLS)/cksum -b -o 2 $(IMAGE) >> $(IMAGE) 
cp $(IMAGE) /tftpboot 
首先依賴于images 和image/linux.bin。 
images/linux.bin: images linux/linux 
$(TOOLS)/m68k-elf-objcopy -O binary 
--set-section-flags=.romvec=CONTENTS,ALLOC,LOAD,READONLY,CODE 
linux/linux images/linux.bin 
image/linux.bin 又依賴linux/linux,它是前面make –C linux 時根據(jù)linux 目錄下的Makefile 規(guī)則編譯生成的。然后用m68k-elf-objcopy 將linux/linux 文件轉(zhuǎn)換為二進(jìn)制文件images/linux.bin。 
然后用: 
cat images/linux.bin images/romfs.img > images/image.bin 
最后,將images/image.bin 復(fù)制到/tftpboot 目錄下,從而完成整個編譯過程。 
【注意】 
Makefile 中使用了許多.PHONY:節(jié),它并沒有什么作用,只是告知編譯器,它的:號后面并不是一個文件。例如: 
.PHONY: romfs (沒有這句也可以,但是若目錄下有一個文件名字叫做romfs,則會報錯make: ` ‘romfs’ is up to date。加了PHONY 就是通知編譯器,不要把romfs 看作一個目標(biāo)文件。) 
romfs: 
…… 
Makefile 還提供了許多獨(dú)立的目標(biāo),可以直接用make 命令指定目標(biāo)單獨(dú)編譯。例如: 
dep: 
@if [ ! -f linux/.config ] ; then \ 
echo "ERROR: you need to do a 'make config' 
first" ; \ 
exit 1 ; \ 
fi 
make -C linux dep 
就可以直接make dep 執(zhí)行。 
romfs: 
make -f romfs_cvs.mk 
[ "$(CONFIG_VENDOR)" ] || echo "******\nrun 'make config' 
first\n******" 
make -C vendors/$(CONFIG_VENDOR)/$(CONFIG_PRODUCT)/. romfs 
就可以直接make romfs 執(zhí)行。 

 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91亚洲精品久久久蜜桃| 97精品国产97久久久久久久久久久久| 久久久久久久久久美女| 欧洲一区二区三区在线| 国内成人精品2018免费看| 一区二区三区在线看| 欧美精品一区二区三区很污很色的| 色伊人久久综合中文字幕| 国产精品自在欧美一区| 蜜臀av国产精品久久久久| 亚洲精品国产一区二区精华液| 久久精品一二三| 日韩亚洲欧美一区二区三区| 欧美影片第一页| 97久久精品人人澡人人爽| 国产99精品视频| 国产一区在线不卡| 免费精品99久久国产综合精品| 亚洲一区二区在线免费观看视频| 国产嫩草影院久久久久| 久久亚洲捆绑美女| 日韩午夜电影在线观看| 欧美日韩二区三区| 欧美日韩免费一区二区三区视频| 色综合久久久久久久| 成人精品高清在线| 粉嫩av一区二区三区在线播放 | 亚洲精品高清在线| 国产欧美一区二区三区沐欲| 精品国产百合女同互慰| 精品捆绑美女sm三区| 日韩欧美在线网站| 欧美一区二区视频免费观看| 欧美日韩久久久一区| 在线观看精品一区| 色狠狠av一区二区三区| 91免费在线播放| 日本韩国欧美三级| 欧美在线观看你懂的| 欧美色视频一区| 欧美日韩精品一区二区三区蜜桃| 在线国产电影不卡| 欧美日韩成人一区二区| 欧美日韩一区二区欧美激情| 欧美精品一二三| 日韩一区二区三免费高清| 777a∨成人精品桃花网| 日韩视频免费观看高清完整版在线观看 | 欧美日韩在线播放三区| 欧美高清激情brazzers| 在线成人免费观看| 欧美一卡在线观看| 日韩欧美国产小视频| ww久久中文字幕| 欧美高清在线精品一区| 自拍偷自拍亚洲精品播放| 亚洲午夜久久久| 热久久一区二区| 国产一区二区三区最好精华液| 国产成人精品影院| 日本精品视频一区二区| 91精品国产福利在线观看| 欧美精品一区二区三区蜜桃| 国产精品欧美极品| 亚洲一区二区三区在线看| 奇米精品一区二区三区在线观看 | 成人动漫精品一区二区| 色综合天天综合网天天看片| 欧美日韩你懂的| 久久亚洲免费视频| 亚洲六月丁香色婷婷综合久久 | 欧美吻胸吃奶大尺度电影| 欧美一级黄色录像| 欧美激情一二三区| 亚洲国产精品久久一线不卡| 国产最新精品精品你懂的| av亚洲精华国产精华精华| 欧美三级视频在线观看| 久久九九99视频| 亚洲电影中文字幕在线观看| 国产中文字幕精品| 在线亚洲免费视频| www欧美成人18+| 亚洲一区二区视频在线观看| 国产一区二区影院| 欧美伊人久久久久久午夜久久久久| 精品国产乱码久久久久久图片 | 国产精品久久三区| 日韩精品乱码av一区二区| 成人高清伦理免费影院在线观看| 欧美日韩性生活| 中文字幕一区二区三区不卡| 青青草伊人久久| 91女厕偷拍女厕偷拍高清| 日韩精品一区国产麻豆| 亚洲综合在线视频| 国产成人av电影在线观看| 欧美日韩高清在线| 亚洲免费在线视频| 国产成人亚洲综合a∨猫咪| 欧美日本一区二区三区四区| 国产精品久久久久久久久免费相片| 免费在线观看一区| 欧美在线播放高清精品| 国产精品亲子乱子伦xxxx裸| 九九精品一区二区| 欧美日韩国产天堂| 一区二区三区四区中文字幕| 国产91精品一区二区麻豆网站 | 亚洲成人www| 91美女在线看| 欧美国产精品久久| 激情综合色综合久久| 7777精品伊人久久久大香线蕉超级流畅| 国产精品免费aⅴ片在线观看| 激情综合网av| 日韩你懂的电影在线观看| 天堂成人国产精品一区| 欧洲av一区二区嗯嗯嗯啊| 中文字幕佐山爱一区二区免费| 国产精品99久久久久久久女警| 欧美一区二区久久久| 亚洲成人资源网| 欧美日韩亚洲综合在线| 夜夜嗨av一区二区三区中文字幕 | 日本电影亚洲天堂一区| 国产精品久久免费看| 成人性色生活片免费看爆迷你毛片| 欧美精品一区二区三区在线播放| 美女视频黄频大全不卡视频在线播放| 色94色欧美sute亚洲线路一ni| 国产精品护士白丝一区av| 高清不卡在线观看| 国产情人综合久久777777| 国产综合色在线| 久久麻豆一区二区| 国产成人三级在线观看| 久久久美女毛片| 国产精品18久久久久久久久久久久 | bt欧美亚洲午夜电影天堂| 国产欧美一区二区精品性色| 国产成人精品一区二| 国产亚洲精品免费| 成人免费毛片嘿嘿连载视频| 国产精品欧美极品| 99久久精品国产麻豆演员表| 亚洲女同ⅹxx女同tv| 色哟哟一区二区在线观看| 一个色妞综合视频在线观看| 欧美日韩亚洲综合一区| 日本vs亚洲vs韩国一区三区| 欧美一区二区三区视频免费| 久久99国产精品麻豆| 国产午夜精品久久久久久免费视| 高清在线观看日韩| 亚洲天堂2016| 欧美午夜精品理论片a级按摩| 日产国产高清一区二区三区 | 亚洲一区二区三区视频在线 | 久久亚洲捆绑美女| 成人动漫中文字幕| 亚洲国产精品自拍| 精品国产自在久精品国产| 成人白浆超碰人人人人| 亚洲一区二区三区自拍| 欧美成人a在线| www.成人在线| 香蕉成人伊视频在线观看| 日韩女同互慰一区二区| 丁香一区二区三区| 亚洲第一电影网| 精品国内二区三区| 91欧美激情一区二区三区成人| 午夜欧美在线一二页| 久久久久久久久久久久久女国产乱| 91在线观看高清| 日韩成人av影视| 国产精品视频在线看| 欧美日韩免费一区二区三区视频| 国产一本一道久久香蕉| 亚洲在线视频一区| 精品国产青草久久久久福利| av在线一区二区三区| 蜜臀久久久久久久| 亚洲欧美日韩在线| 2023国产精品视频| 在线观看日韩国产| 国产一区二三区| 无码av免费一区二区三区试看| 日本一区二区不卡视频| 91精品国产高清一区二区三区 | 日韩精品一区二区三区中文不卡| 成人少妇影院yyyy| 久久精品99国产精品| 亚洲美女免费在线| 久久精子c满五个校花| 7777精品伊人久久久大香线蕉最新版| 不卡av电影在线播放| 免费观看在线综合| 亚洲一区二区三区精品在线|