接下来,分析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的编译过程也就能大概了解了。