|
all: do-it-all
# 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
#
# 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
# 这里的"+="是追加的意思
#这里完成了驱动的设置,在vivi里边只有两个驱动 一个是串口的驱动,另外一个mtd的驱动
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/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
#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_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 vivi-elf $(CLIBS)
# 这里有个工具NM 是把可执行文件中定义的字符导出,这里重定向到vivi.map文件中,主要用与文件的分析等。
$(NM) -v -l vivi-elf > vivi.map
# 这里需要注意vivi-elf为什么要生成新的vivi,这是因为vivi-elf是在linux下的可执行的二进制文件,
# 而vivi需要少些在裸片上,是一种特殊的二进制镜像文件,所以需要进行转换。这里通过OBJCOPY来转换。
$(OBJCOPY) -O binary -S vivi-elf vivi $(OBJCOPYFLAGS)
# 整个编译的过程到此就结束了