Linux优美代码赏析0.0:Makefile

本文深入剖析Linux内核的Makefile,详细解读了交叉编译器设置、依赖生成及目标编译流程。通过理解makefile中的关键指令,如ARCH、CROSS_COMPILE、vmlinux等,读者可以掌握Linux内核的编译机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先阅读根目录下的makefile:

 

1.编译器设置
ARCH            : =  arm
CROSS_COMPILE   :
=  $(shell  if  [  - f .cross_compile ]; then \
                                cat .cross_compile; \
                                fi)

此处说明交叉编译器定义在.cross_compile文件中

 

 

2.生成依赖:
SRCARCH     : =  $(ARCH)

#主目标

all: vmlinux  

#下面文件引入架构相关的编译目录

include $(srctree)
/ arch / $(SRCARCH) / Makefile

#下面引入系统相关的编译目录
# Objects we will link into vmlinux 
/  subdirs we need to visit
init
- y        : =  init /
drivers
- y    : =  drivers /  sound /  firmware /
net
- y        : =  net /
libs
- y        : =  lib /
core
- y        : =  usr /


core
- y         +=  kernel /  mm /  fs /  ipc /  security /  crypto /  block /

vmlinux
- dirs    : =  $(patsubst  %/ , % ,$(filter  %/ , $(init - y) $(init - m) \
             $(core
- y) $(core - m) $(drivers - y) $(drivers - m) \
             $(net
- y) $(net - m) $(libs - y) $(libs - m)))

vmlinux
- alldirs    : =  $(sort $(vmlinux - dirs) $(patsubst  %/ , % ,$(filter  %/ , \
             $(init
- n) $(init - ) \
             $(core
- n) $(core - ) $(drivers - n) $(drivers - ) \
             $(net
- n)  $(net - )  $(libs - n)    $(libs - ))))

#将目录改成目标,即编译成每个目录下的built
- in .o

init
- y        : =  $(patsubst  %/ %/ built - in .o, $(init - y))
core
- y        : =  $(patsubst  %/ %/ built - in .o, $(core - y))
drivers
- y    : =  $(patsubst  %/ %/ built - in .o, $(drivers - y))
net
- y        : =  $(patsubst  %/ %/ built - in .o, $(net - y))
libs
- y1        : =  $(patsubst  %/ %/ lib.a, $(libs - y))
libs
- y2        : =  $(patsubst  %/ %/ built - in .o, $(libs - y))
libs
- y        : =  $(libs - y1) $(libs - y2)

vmlinux
- init : =  $(head - y) $(init - y)
vmlinux
- main : =  $(core - y) $(libs - y) $(drivers - y) $(net - y)
vmlinux
- all  : =  $(vmlinux - init) $(vmlinux - main)
vmlinux
- lds  : =  arch / $(SRCARCH) / kernel / vmlinux.lds

vmlinux: $(vmlinux
- lds) $(vmlinux - init) $(vmlinux - main) vmlinux.o $(kallsyms.o) FORCE


modpost
- init : =  $(filter - out  init / built - in .o, $(vmlinux - init))
vmlinux.o: $(modpost
- init) $(vmlinux - main) FORCE
    $(call if_changed_rule,vmlinux
- modpost)


$(sort $(vmlinux
- init) $(vmlinux - main)) $(vmlinux - lds): $(vmlinux - dirs) ;


PHONY 
+=  $(vmlinux - dirs)
$(vmlinux
- dirs): prepare scripts
    $(Q)$(MAKE) $(build)
= $@
 

3.arch\arm\Makefile
head - y        : =  arch / arm / kernel / head$(MMUEXT).o arch / arm / kernel / init_task.o
textofs
- y    : =   0x00008000

 machine
- $(CONFIG_ARCH_S3C64XX)       : =  s3c6400 s3c6410
    plat
- $(CONFIG_PLAT_S3C64XX)       : =  s3c64xx s3c

TEXT_OFFSET :
=  $(textofs - y)

MACHINE  :
=  arch / arm / mach - $(word  1 ,$(machine - y)) /

machdirs :
=  $(patsubst  % ,arch / arm / mach -%/ ,$(machine - y))
platdirs :
=  $(patsubst  % ,arch / arm / plat -%/ ,$(plat - y))

core
- y                 +=  arch / arm / kernel /  arch / arm / mm /  arch / arm / common /
core
- y                 +=  $(machdirs) $(platdirs)
core
- $(CONFIG_FPE_NWFPE)     +=  arch / arm / nwfpe /
core
- $(CONFIG_FPE_FASTFPE)     +=  $(FASTFPE_OBJ)
core
- $(CONFIG_VFP)         +=  arch / arm / vfp /

drivers
- $(CONFIG_OPROFILE)       +=  arch / arm / oprofile /

libs
- y                : =  arch / arm / lib /  $(libs - y)

boot :
=  arch / arm / boot

# Convert bzImage to zImage
bzImage: zImage

zImage Image xipImage bootpImage uImage: vmlinux
    $(Q)$(MAKE) $(build)
= $(boot) MACHINE = $(MACHINE) $(boot) / $@

zinstall install: vmlinux
    $(Q)$(MAKE) $(build)
= $(boot) MACHINE = $(MACHINE) $@

清晰的获得系统对哪些目标进行了编译。

 

posted on 2011-09-20 08:22  Anpher Zhang 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/zhangsufeng/archive/2011/09/20/2182034.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值