ASUS N14U 源码编译过程分析(下)

15 篇文章 0 订阅
10 篇文章 0 订阅

接下来,分析router中的Makefile,接上一篇文章,在转到router目录时,上一级Makefile有如下内容:

	@$(MAKE) -C router all
	@$(MAKE) -C router install

router中这个Makefile看起很大(有两千多行),仔细分析后,发现更简单。

all目标

all: clean-build kernel_header libc version obj_prelibs kernel $(obj-y)
这里面的kernel和$(obj-y)目标最为关键

kernel目标

kernel: $(LINUXDIR)/.config
	@$(SEP)
翻看前面的代码,SEP用来显示一个红底亮色的文字标题(详细描述可以参看我另一篇文章: ANSI/VT100 Terminal Control Escape Sequences),

SEP=echo "\033[41;1m   $@   \033[0m"
然后,进入linux目录,进行kernel的编译

ifeq ($(RTCONFIG_RALINK),y)
	@if ! grep -q "CONFIG_EMBEDDED_RAMDISK=y" $(LINUXDIR)/.config ; then \
	    $(MAKE) -C $(LINUXDIR) vmlinux CC=$(KERNELCC) LD=$(KERNELLD); \
	fi
	if grep -q "CONFIG_MODULES=y" $(LINUXDIR)/.config ; then \
	    $(MAKE) -C $(LINUXDIR) modules CC=$(KERNELCC) LD=$(KERNELLD); \
	fi
else

$(obj-y)目标

用gctwimax对象来举例

gctwimax-0.0.3rc4/stamp-h1:
	touch $@

gctwimax-0.0.3rc4: $@/stamp-h1
	$(MAKE) -C $@

gctwimax-0.0.3rc4-install: gctwimax-0.0.3rc4
	install -D gctwimax-0.0.3rc4/gctwimax $(INSTALLDIR)/gctwimax-0.0.3rc4/usr/sbin/gctwimax
	$(STRIP) $(INSTALLDIR)/gctwimax-0.0.3rc4/usr/sbin/gctwimax
	#install -D gctwimax-0.0.3rc4/src/event.sh $(INSTALLDIR)/gctwimax-0.0.3rc4/usr/share/event.sh
	#install -D gctwimax-0.0.3rc4/src/gctwimax.conf $(INSTALLDIR)/gctwimax-0.0.3rc4/usr/share/gctwimax.conf

gctwimax-0.0.3rc4-clean:
	-@$(MAKE) -C gctwimax-0.0.3rc4 clean
	@rm -f gctwimax-0.0.3rc4/stamp-h1
如果你对中间出现的-install和-clean后缀有点搞不懂的话,可以翻到Makefile的最后面

%:
	@[ ! -d $* ] || ( $(SEP); $(MAKE) -C $* )


%-clean:
	-@[ ! -d $* ] || $(MAKE) -C $* clean

%-install: %
	@echo $*
	@[ ! -d $* ] || $(MAKE) -C $* install INSTALLDIR=$(INSTALLDIR)/$*

%-stage: %
	@echo $*
	@[ ! -d $* ] || $(MAKE) -C $* install DESTDIR=$(STAGEDIR)

%-build:
	$(MAKE) $*-clean $*

该Makefile中,剩下的大量的篇幅就是这些包含这些-install,-clean的目标,读者可以自行下载源码研究。


install目标

install package: $(obj-install) $(LINUXDIR)/.config gen_target

里面最关键的依赖目标是gen_target

gen_target目标

gen_target:
	@$(SEP)

	install -d $(TARGETDIR)

还是故技重施,先显示彩色的标题,这样显得既专业又好看,可以模仿一下:)

仔细跳过中间的内核模块的文件处理流程,然后我们会看到:

	for dir in $(wildcard $(patsubst %,$(INSTALLDIR)/%,$(obj-y))) ; do \
	    (cd $${dir} && tar cpf - .) | (cd $(TARGETDIR) && tar xpf -) \
	done
这部分代码用来逐个拷贝install目录中的文件到target目录,注意里面的一个小技巧,用tar命令带-f参数和管道。

最后,我们要转到image目标(哪里有提及?见我上一篇文章;-)

image目标

image:
ifneq ($(RTCONFIG_BCMARM),y)
	@$(MAKE) -C $(LINUXDIR)/scripts/squashfs $(MKSQUASHFS_TARGET)
	@$(LINUXDIR)/scripts/squashfs/$(MKSQUASHFS) $(TARGETDIR) $(PLATFORMDIR)/target.image -all-root -noappend -nopad | tee target.info
else
	+$(MAKE) -C squashfs-4.2 mksquashfs
	squashfs-4.2/mksquashfs $(TARGETDIR) $(PLATFORMDIR)/$(ROOT_IMG) -noappend -all-root
endif

至此,整个rt-n14u的编译过程也就能大概了解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值