Linuxå
æ ¸çé
置系ç»ç±ä¸ä¸ªé¨åç»æï¼åå«æ¯ï¼
Makefileï¼åå¸å¨ Linux å
æ ¸æºä»£ç ä¸ç Makefileï¼å®ä¹ Linux å
æ ¸çç¼è¯è§åï¼
é
ç½®æ件ï¼config.inï¼ï¼ç»ç¨æ·æä¾é
ç½®éæ©çåè½ï¼
é
置工å
·ï¼å
æ¬é
ç½®å½ä»¤è§£éå¨ï¼å¯¹é
ç½®èæ¬ä¸ä½¿ç¨çé
ç½®å½ä»¤è¿è¡è§£éï¼åé
ç½®ç¨æ·çé¢ï¼æä¾åºäºå符çé¢ãåºäº Ncurses å¾å½¢çé¢ä»¥ååºäº Xwindows å¾å½¢çé¢çç¨æ·é
ç½®çé¢ï¼åèªå¯¹åºäº Make configãMake menuconfig å make xconfigï¼ã
è¿äºé
置工å
·é½æ¯ä½¿ç¨èæ¬è¯è¨ï¼å¦ Tcl/TKãPerl ç¼åçï¼ä¹å
å«ä¸äºç¨ C ç¼åç代ç ï¼ãæ¬æ并ä¸æ¯å¯¹é
置系ç»æ¬èº«è¿è¡åæï¼èæ¯ä»ç»å¦ä½ä½¿ç¨é
置系ç»ãæ以ï¼é¤éæ¯é
置系ç»çç»´æ¤è
ï¼ä¸è¬çå
æ ¸å¼åè
æ é¡»äºè§£å®ä»¬çåçï¼åªéè¦ç¥éå¦ä½ç¼å Makefile åé
ç½®æ件就å¯ä»¥ãæ以ï¼å¨æ¬æä¸ï¼æ们åªå¯¹ Makefile åé
ç½®æ件è¿è¡è®¨è®ºãå¦å¤ï¼å¡æ¯æ¶åå°ä¸å
·ä½ CPU ä½ç³»ç»æç¸å
³çå
容ï¼æ们é½ä»¥ ARM 为ä¾ï¼è¿æ ·ä¸ä»
å¯ä»¥å°è®¨è®ºçé®é¢æç¡®åï¼èä¸å¯¹å
容æ¬èº«ä¸äº§çå½±åã
2ï¼ Makefile
2.1 Makefile æ¦è¿°
Makefile çä½ç¨æ¯æ ¹æ®é
ç½®çæ
åµï¼æé åºéè¦ç¼è¯çæºæ件å表ï¼ç¶ååå«ç¼è¯ï¼å¹¶æç®æ 代ç é¾æ¥å°ä¸èµ·ï¼æç»å½¢æ Linux å
æ ¸äºè¿å¶æ件ã
ç±äº Linux å
æ ¸æºä»£ç æ¯æç
§æ å½¢ç»æç»ç»çï¼æ以 Makefile ä¹è¢«åå¸å¨ç®å½æ ä¸ãLinux å
æ ¸ä¸ç Makefile 以åä¸ Makefile ç´æ¥ç¸å
³çæ件æï¼
Makefileï¼é¡¶å± Makefileï¼æ¯æ´ä¸ªå
æ ¸é
ç½®ãç¼è¯çæ»ä½æ§å¶æ件ã
.configï¼å
æ ¸é
ç½®æ件ï¼å
å«ç±ç¨æ·éæ©çé
ç½®é项ï¼ç¨æ¥åæ¾å
æ ¸é
ç½®åçç»æï¼å¦ make configï¼ã
arch/*/Makefileï¼ä½äºåç§ CPU ä½ç³»ç®å½ä¸ç Makefileï¼å¦ arch/arm/Makefileï¼æ¯é对ç¹å®å¹³å°ç Makefileã
å个åç®å½ä¸ç Makefileï¼æ¯å¦ drivers/Makefileï¼è´è´£æå¨åç®å½ä¸æºä»£ç ç管çã
Rules.makeï¼è§åæ件ï¼è¢«ææç Makefile 使ç¨ã
ç¨æ·éè¿ make config é
ç½®åï¼äº§çäº .configãé¡¶å± Makefile 读å
¥ .config ä¸çé
ç½®éæ©ãé¡¶å± Makefile æ两个主è¦çä»»å¡ï¼äº§ç vmlinux æ件åå
æ ¸æ¨¡åï¼moduleï¼ã为äºè¾¾å°æ¤ç®çï¼é¡¶å± Makefile éå½çè¿å
¥å°å
æ ¸çå个åç®å½ä¸ï¼åå«è°ç¨ä½äºè¿äºåç®å½ä¸ç Makefileãè³äºå°åºè¿å
¥åªäºåç®å½ï¼åå³äºå
æ ¸çé
ç½®ãå¨é¡¶å± Makefile ä¸ï¼æä¸å¥ï¼include arch/$(ARCH)/Makefileï¼å
å«äºç¹å® CPU ä½ç³»ç»æä¸ç Makefileï¼è¿ä¸ª Makefile ä¸å
å«äºå¹³å°ç¸å
³çä¿¡æ¯ã
ä½äºå个åç®å½ä¸ç Makefile åæ ·ä¹æ ¹æ® .config ç»åºçé
置信æ¯ï¼æé åºå½åé
ç½®ä¸éè¦çæºæ件å表ï¼å¹¶å¨æ件çæåæ include $(TOPDIR)/Rules.makeã
Rules.make æ件起çé常éè¦çä½ç¨ï¼å®å®ä¹äºææ Makefile å
±ç¨çç¼è¯è§åãæ¯å¦ï¼å¦æéè¦å°æ¬ç®å½ä¸ææç c ç¨åºç¼è¯ææ±ç¼ä»£ç ï¼éè¦å¨ Makefile ä¸æ以ä¸çç¼è¯è§åï¼
%.s: %.c
$(CC) $(CFLAGS) -S $< -o $@
æå¾å¤åç®å½ä¸é½æåæ ·çè¦æ±ï¼å°±éè¦å¨åèªç Makefile ä¸å
å«æ¤ç¼è¯è§åï¼è¿ä¼æ¯è¾éº»ç¦ãè Linux å
æ ¸ä¸åææ¤ç±»çç¼è¯è§åç»ä¸æ¾ç½®å° Rules.make ä¸ï¼å¹¶å¨åèªç Makefile ä¸å
å«è¿äº Rules.makeï¼include Rules.makeï¼ï¼è¿æ ·å°±é¿å
äºå¨å¤ä¸ª Makefile ä¸éå¤åæ ·çè§åã对äºä¸é¢çä¾åï¼å¨ Rules.make ä¸å¯¹åºçè§å为ï¼
%.s: %.c
$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$(*F)) $(CFLAGS_$@) -S $< -o $@
2.2 Makefile ä¸çåé
é¡¶å± Makefile å®ä¹å¹¶åç¯å¢ä¸è¾åºäºè®¸å¤åéï¼ä¸ºå个åç®å½ä¸ç Makefile ä¼ éä¸äºä¿¡æ¯ãæäºåéï¼æ¯å¦ SUBDIRSï¼ä¸ä»
å¨é¡¶å± Makefile ä¸å®ä¹å¹¶ä¸èµåå¼ï¼èä¸å¨ arch/*/Makefile è¿ä½äºæ©å
ã
常ç¨çåéæ以ä¸å ç±»ï¼
1ï¼ çæ¬ä¿¡æ¯
çæ¬ä¿¡æ¯æï¼VERSIONï¼PATCHLEVEL, SUBLEVEL, EXTRAVERSIONï¼KERNELRELEASEãçæ¬ä¿¡æ¯å®ä¹äºå½åå
æ ¸ççæ¬ï¼æ¯å¦ VERSION=2ï¼PATCHLEVEL=4ï¼SUBLEVEL=18ï¼EXATAVERSION=-rmk7ï¼å®ä»¬å
±åææå
æ ¸çåè¡çæ¬KERNELRELEASEï¼2.4.18-rmk7
2ï¼ CPU ä½ç³»ç»æï¼ARCH
å¨é¡¶å± Makefile çå¼å¤´ï¼ç¨ ARCH å®ä¹ç®æ CPU çä½ç³»ç»æï¼æ¯å¦ ARCH:=arm çã许å¤åç®å½ç Makefile ä¸ï¼è¦æ ¹æ® ARCH çå®ä¹éæ©ç¼è¯æºæ件çå表ã
3ï¼ è·¯å¾ä¿¡æ¯ï¼TOPDIR, SUBDIRS
TOPDIR å®ä¹äº Linux å
æ ¸æºä»£ç æå¨çæ ¹ç®å½ãä¾å¦ï¼å个åç®å½ä¸ç Makefile éè¿ $(TOPDIR)/Rules.make å°±å¯ä»¥æ¾å° Rules.make çä½ç½®ã
SUBDIRS å®ä¹äºä¸ä¸ªç®å½å表ï¼å¨ç¼è¯å
æ ¸æ模åæ¶ï¼é¡¶å± Makefile å°±æ¯æ ¹æ® SUBDIRS æ¥å³å®è¿å
¥åªäºåç®å½ãSUBDIRS çå¼åå³äºå
æ ¸çé
ç½®ï¼å¨é¡¶å± Makefile ä¸ SUBDIRS èµå¼ä¸º kernel drivers mm fs net ipc libï¼æ ¹æ®å
æ ¸çé
ç½®æ
åµï¼å¨ arch/*/Makefile ä¸æ©å
äº SUBDIRS çå¼ï¼åè§4ï¼ä¸çä¾åã
4ï¼ å
æ ¸ç»æä¿¡æ¯ï¼HEAD, CORE_FILES, NETWORKS, DRIVERS, LIBS
Linux å
æ ¸æ件 vmlinux æ¯ç±ä»¥ä¸è§å产ççï¼
vmlinux: $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
$(LD) $(LINKFLAGS) $(HEAD) init/main.o init/version.o
--start-group
$(CORE_FILES)
$(DRIVERS)
$(NETWORKS)
$(LIBS)
--end-group
-o vmlinux
å¯ä»¥çåºï¼vmlinux æ¯ç± HEADãmain.oãversion.oãCORE_FILESãDRIVERSãNETWORKS å LIBS ç»æçãè¿äºåéï¼å¦ HEADï¼é½æ¯ç¨æ¥å®ä¹è¿æ¥çæ vmlinux çç®æ æ件ååºæ件å表ãå
¶ä¸ï¼HEADå¨arch/*/Makefile ä¸å®ä¹ï¼ç¨æ¥ç¡®å®è¢«æå
é¾æ¥è¿ vmlinux çæ件å表ãæ¯å¦ï¼å¯¹äº ARM ç³»åç CPUï¼HEAD å®ä¹ä¸ºï¼
HEAD := arch/arm/kernel/head-$(PROCESSOR).o
arch/arm/kernel/init_task.o
表æ head-$(PROCESSOR).o å init_task.o éè¦æå
被é¾æ¥å° vmlinux ä¸ãPROCESSOR 为 armv æ armoï¼åå³äºç®æ CPUã CORE_FILESï¼NETWORKï¼DRIVERS å LIBS å¨é¡¶å± Makefile ä¸å®ä¹ï¼å¹¶ä¸ç± arch/*/Makefile æ ¹æ®éè¦è¿è¡æ©å
ã CORE_FILES 对åºçå
æ ¸çæ ¸å¿æ件ï¼æ kernel/kernel.oï¼mm/mm.oï¼fs/fs.oï¼ipc/ipc.oï¼å¯ä»¥çåºï¼è¿äºæ¯ç»æå
æ ¸æ为éè¦çæ件ãåæ¶ï¼arch/arm/Makefile 对 CORE_FILES è¿è¡äºæ©å
ï¼
# arch/arm/Makefile
# If we have a machine-specific directory, then include it in the build.
MACHDIR := arch/arm/mach-$(MACHINE)
ifeq ($(MACHDIR),$(wildcard $(MACHDIR)))
SUBDIRS += $(MACHDIR)
CORE_FILES := $(MACHDIR)/$(MACHINE).o $(CORE_FILES)
endif
HEAD := arch/arm/kernel/head-$(PROCESSOR).o
arch/arm/kernel/init_task.o
SUBDIRS += arch/arm/kernel arch/arm/mm arch/arm/lib arch/arm/nwfpe
CORE_FILES := arch/arm/kernel/kernel.o arch/arm/mm/mm.o $(CORE_FILES)
LIBS := arch/arm/lib/lib.a $(LIBS)
5ï¼ ç¼è¯ä¿¡æ¯ï¼CPP, CC, AS, LD, ARï¼CFLAGSï¼LINKFLAGS
å¨ Rules.make ä¸å®ä¹çæ¯ç¼è¯çéç¨è§åï¼å
·ä½å°ç¹å®çåºåï¼éè¦æç¡®ç»åºç¼è¯ç¯å¢ï¼ç¼è¯ç¯å¢å°±æ¯å¨ä»¥ä¸çåéä¸å®ä¹çãé对交åç¼è¯çè¦æ±ï¼å®ä¹äº CROSS_COMPILEãæ¯å¦ï¼
CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
......
CROSS_COMPILE å®ä¹äºäº¤åç¼è¯å¨åç¼ arm-linux-ï¼è¡¨æææç交åç¼è¯å·¥å
·é½æ¯ä»¥ arm-linux- å¼å¤´çï¼æ以å¨å个交åç¼è¯å¨å·¥å
·ä¹åï¼é½å å
¥äº $(CROSS_COMPILE)ï¼ä»¥ç»æä¸ä¸ªå®æ´ç交åç¼è¯å·¥å
·æ件åï¼æ¯å¦ arm-linux-gccã
CFLAGS å®ä¹äºä¼ éç» C ç¼è¯å¨çåæ°ã
LINKFLAGS æ¯é¾æ¥çæ vmlinux æ¶ï¼ç±é¾æ¥å¨ä½¿ç¨çåæ°ãLINKFLAGS å¨ arm/*/Makefile ä¸å®ä¹ï¼æ¯å¦ï¼
# arch/arm/Makefile
LINKFLAGS :=-p -X -T arch/arm/vmlinux.lds
6ï¼ é
ç½®åéCONFIG_*
.config æ件ä¸æ许å¤çé
ç½®åéçå¼ï¼ç¨æ¥è¯´æç¨æ·é
ç½®çç»æãä¾å¦ CONFIG_MODULES=y 表æç¨æ·éæ©äº Linux å
æ ¸ç模ååè½ã
.config è¢«é¡¶å± Makefile å
å«åï¼å°±å½¢æ许å¤çé
ç½®åéï¼æ¯ä¸ªé
ç½®åéå
·æç¡®å®çå¼ï¼y 表示æ¬ç¼è¯é项对åºçå
æ ¸ä»£ç 被éæç¼è¯è¿ Linux å
æ ¸ï¼m 表示æ¬ç¼è¯é项对åºçå
æ ¸ä»£ç 被ç¼è¯æ模åï¼n 表示ä¸éæ©æ¤ç¼è¯é项ï¼å¦ææ ¹æ¬å°±æ²¡æéæ©ï¼é£ä¹é
ç½®åéçå¼ä¸ºç©ºã
2.3 Rules.make åé
åé¢è®²è¿ï¼Rules.make æ¯ç¼è¯è§åæ件ï¼ææç Makefile ä¸é½ä¼å
æ¬ Rules.makeãRules.make æ件å®ä¹äºè®¸å¤åéï¼æ为éè¦æ¯é£äºç¼è¯ãé¾æ¥å表åéã
O_OBJSï¼L_OBJSï¼OX_OBJSï¼LX_OBJSï¼æ¬ç®å½ä¸éè¦ç¼è¯è¿ Linux å
æ ¸ vmlinux çç®æ æ件å表ï¼å
¶ä¸ OX_OBJS å LX_OBJS ä¸ç "X" 表æç®æ æ件使ç¨äº EXPORT_SYMBOL è¾åºç¬¦å·ã
M_OBJSï¼MX_OBJSï¼æ¬ç®å½ä¸éè¦è¢«ç¼è¯æå¯è£
载模åçç®æ æ件å表ãåæ ·ï¼MX_OBJS ä¸ç "X" 表æç®æ æ件使ç¨äº EXPORT_SYMBOL è¾åºç¬¦å·ã
O_TARGETï¼L_TARGETï¼æ¯ä¸ªåç®å½ä¸é½æä¸ä¸ª O_TARGET æ L_TARGETï¼Rules.make é¦å
ä»æºä»£ç ç¼è¯çæ O_OBJS å OX_OBJS ä¸ææçç®æ æ件ï¼ç¶åä½¿ç¨ $(LD) -r æå®ä»¬é¾æ¥æä¸ä¸ª O_TARGET æ L_TARGETãO_TARGET 以 .o ç»å°¾ï¼è L_TARGET 以 .a ç»å°¾ã
温馨提示:答案为网友推荐,仅供参考