我们继续解析makefile,vivi的makefile的开始部分是设置了一些版本信息以及编译器的一些设置,接下来的工作就开始真是的编译了。
- // wildcard函数的作用
// 函数名称:获取匹配模式文件名函数—wildcard
// 函数功能:列出当前目录下所有符合模式“PATTERN”格式的文件名。
// 返回值:空格分割的、存在当前目录下的所有符合模式“PATTERN”的文件名。
// ifeq用于判断参数是否相等
// ifeq (.config,$(wildcard .config)) # 这里用法的意义就是查找当前目录下是否有.config文件
// 如果当前目录下存在.config文件,则包含该文件
// include .config
// else
// 如果没有该文件存在,则定义变量CONFIGURATION
// 并定义依赖关系, do-it-all依赖文件config
// CONFIGURATION = config
// do-it-all: config
// endif
// 定义do-it-all的规则,依赖version vivi
// do-it-all: Version vivi #如果没有.config文件,就会依赖三个文件: config version vivi - all: do-it-all
- ifeq (.config,$(wildcard .config))
- include .config
- else
- CONFIGURATION = config
- do-it-all: config
- endif
- do-it-all: Version vivi
- #
- # standard CFLAGS
- #
- // CPP预处理器的参数
- CPPFLAGS := -I$(VIVIPATH) -I$(LINUX_INCLUDE_DIR)
- // 编译器的参数
- #CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -Wno-trigraphs -O2 \
- # -fomit-frame-pointer -fno-strict-aliasing -fno-common
- CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes -O2 -fPIC -fomit-frame-pointer
- // 汇编器的参数
- AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS)
- // 定义核心文件,
- CORE_FILES = init/main.o init/version.o lib/lib.o
- // 定义库文件 这些文件后边都会用到
- LIBS := lib/priv_data/priv_data.o
- // 定义子目录 说明以后的MAKEFILE只去这两个子目录去编译
- SUBDIRS = drivers lib
- // 定义驱动程序的 这里的CONFIG_SERIAL与CONFIG_MTD是在.config文件中定义的。在之前的脚本语句中有 include .config
- DRIVERS-y :=
- DRIVERS-$(CONFIG_SERIAL) += drivers/serial/serial.o
- DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtd.o
- DRIVERS := $(DRIVERS-y)
- // 定义了一些变量 是在clean中要删除的文件。
- CLEAN_FILES = \
- vivi-elf \
- vivi \
- vivi.nm \
- vivi.map
- #
- # Location of the gcc arm libs.
- # 这里是设置交叉编译器的一些选项
- // 指定库的路径
- ARM_GCC_LIBS = /usr/lib/gcc-lib/arm-linux/2.95.3
- ARM_C_LIBS = /usr/arm-linux/lib
- #ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-redhat-linux/2.95.3
- // OBJCOPY是一个重要的工具,这里设计与该工具有关的一些参数
- OBJCOPYFLAGS = -R .comment -R .stab -R .stabstr
- // 指定要连接的库
- CLIBS = -L$(ARM_C_LIBS) -L$(ARM_GCC_LIBS) -lgcc -lc
- // 知道那个链接器参数
- LINKFLAGS = -Tarch/vivi.lds -Bstatic
- // 这里是指定在distclean时要删除的文件
- DISTCLEAN_FILES = \
- include/autoconf.h include/version.h \
- scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
- .menuconfig.log \
- .config .config.old TAGS tags
- // 包含arch下的结构makefile 地位比较特殊 通常情况下arch是和平台相关的东西
- include arch/Makefile
- // 导出下边的变量
- export CPPFLAGS CFLAGS AFLAGS
- export DRIVERS LDFLAGS
- // Version的依赖关系,依赖于dummy ,然后执行rm 命令
- Version: dummy
- @rm -f include/compile.h
- // vivi依赖文件,如果文件没有产生则先产生这些文件。
- vivi: include/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs
- $(LD) -v $(LINKFLAGS) \
- $(HEAD) \
- $(CORE_FILES) \
- $(DRIVERS) \
- $(LIBS) \
- -o $@-elf $(CLIBS)
- // 这里有个工具NM 是把可执行文件中定义的字符导出,这里重定向到vivi.map文件中,主要用与文件的分析等。
- $(NM) -v -l $@-elf > $@.map
- // 这里需要注意vivi-elf为什么要生成新的vivi,这是因为vivi-elf是在linux下的可执行的二进制文件,而vivi需要少些在裸片上,是一种特殊的二进制镜像文件,所以需要进行转换。这里通过OBJCOPY来转换。
- $(OBJCOPY) -O binary -S $@-elf $@ $(OBJCOPYFLAGS)
- @echo " ^_^ The vivi boot image file is:" $(shell /bin/pwd)/$@
# 整个编译的过程到此就结束了
阅读(1579) | 评论(0) | 转发(1) |