Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23336
  • 博文数量: 6
  • 博客积分: 1470
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-24 15:08
文章分类
文章存档

2011年(1)

2009年(5)

我的朋友
最近访客

分类:

2009-05-18 19:57:23

VERSION = 0
PATCHLEVEL = 1
SUBLEVEL = 4
VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL) #定义版本号
ARCH := arm   # = 是递归赋值,而 := 是直接赋值  如:very1=test1
        very2=$(very1)
        very1=test2
        echo very2   输出结果为test2
        当very2=$(very1)改为very2:=$(very1)输出为test1
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
 else if [ -x /bin/bash ]; then echo /bin/bash; \
 else echo sh; fi ; fi)
#CONFIG_SHELL := $(shell if [ -x "$$BASH" ];
#    then echo $$BASH;
#   else if [ -x /bin/bash ];
#     then echo /bin/bash;
#   else echo sh;
#    fi ;
#    fi)
TOPDIR := $(shell /bin/pwd)  #定义顶层目录所在的路径
#
# change this to point to the Linux include directory
#
LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include/  #定义内核头文件所在路径

VIVIPATH           = $(TOPDIR)/include  #vivi所在头文件路径
HOSTCC          = gcc
HOSTCFLAGS      = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer  #定义本地编译器及参数
CROSS_COMPILE   = /usr/local/arm/2.95.3/bin/arm-linux-  #定义交叉编译器
#CROSS_COMPILE   = /opt/host/armv4l/bin/armv4l-redhat-linux-
#
# Include the make variables (CC, etc...)
#
#定义交叉编译工具链
AS              = $(CROSS_COMPILE)as
LD              = $(CROSS_COMPILE)ld
CC              = $(CROSS_COMPILE)gcc
CPP             = $(CC) -E
AR              = $(CROSS_COMPILE)ar
NM              = $(CROSS_COMPILE)nm
STRIP           = $(CROSS_COMPILE)strip
OBJCOPY         = $(CROSS_COMPILE)objcopy
OBJDUMP         = $(CROSS_COMPILE)objdump
MAKEFILES       = $(TOPDIR)/.config
MD5SUM  = md5sum
PERL            = perl  #perl是一个脚本
AWK  = awk
#export是导出前面定义的变量,给子makefile使用
export  VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE \
        CONFIG_SHELL TOPDIR VIVIPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
 CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES MD5SUM PERL AWK
#以上为定义变量,下面开始。。。
#第一条规则,最终目标是all,依赖文件是do-it-all
all:  do-it-all
#wildcard函数的作用是列出当前目录下所有符合参数.c文件的列表,
#ifeq是一个关键字,判断参数是否相等,
#而ifeq在这里是判断当前目录下是否有.config文件;
#如果有就包含./config文件,如果没有,定义一个变量CONFIGURATION为config,
#并且do-it-all依赖于.config;
#定义do-it-all依赖于 Version  vivi 2个文件
ifeq (.config,$(wildcard .config))
include .config
else
CONFIGURATION = config
do-it-all: config
endif
do-it-all: Version vivi
#
# standard CFLAGS
#
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 #定义核心文件libs
SUBDIRS         = drivers lib #定义2个子目录drivers lib
DRIVERS-y :=  #定义空变量
DRIVERS-$(CONFIG_SERIAL) += drivers/serial/serial.o  #定义驱动程序,这里的+应该是追加的意思
DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtd.o
DRIVERS := $(DRIVERS-y) #这里是将串口驱动和MTD驱动赋给DRIVERS
CLEAN_FILES = \ #这里是makeclean要删除的文件
 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
OBJCOPYFLAGS = -R .comment -R .stab -R .stabstr  #OBJCPOY工具
CLIBS = -L$(ARM_GCC_LIBS) -lgcc -lc #指定链接库的变量
LINKFLAGS = -Tarch/vivi.lds -Bstatic #指定链接器参数
DISTCLEAN_FILES = \ #这里定义变量,用于彻底删除文件
 include/autoconf.h include/version.h \
 scripts/lxdialog/*.o scripts/lxdialog/lxdialog \
 .menuconfig.log \
 .config .config.old TAGS tags
include arch/Makefile #包含结构makefile
export  CPPFLAGS CFLAGS AFLAGS    #导出变量,它们开始时候都属于local variable(本地变量),
     #只有经过export输出后才能成为environment variable(环境变量),
     #才能被一些命令调用
     
export  DRIVERS LDFLAGS #导出变量
Version: dummy
 @rm -f include/compile.h
vivi: include/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs #依赖文件,这里最主要的也是做难懂的就是linuxsubdirs这个依赖文件,
 $(LD) -v $(LINKFLAGS) \ #将这几个文件链接起来                               #这个文件生成过程也要遵循C文件,而rules.make的主要规则
 $(HEAD) \               #是通过-C进入到最后的目录中执行make,在最后的子目录中生成目标文件 
  $(CORE_FILES) \             #然后推出该目录,一步一步往原来的目录退,再在里面执行make, 
  $(DRIVERS) \              #直到退回到主目录中。在这过程中进入的子目录中还可能遇到obj-y文件
  $(LIBS) \              #只有当该目录中的目标文件都生成后才执行该文件中的obj-y。
  -o vivi-elf $(CLIBS) #生成目标文件      #理解下面2句的含义(这2句是rules.make中的)
            #first_rule: sub_dirs
            #     $(MAKE) all_targets
 $(NM) -v -l vivi-elf > vivi.map
 $(OBJCOPY) -O binary -S vivi-elf vivi $(OBJCOPYFLAGS)
oldconfig:
 $(CONFIG_SHELL) scripts/Configure -d arch/config.in
config:
 $(CONFIG_SHELL) scripts/Configure arch/config.in
menuconfig: include/version.h
 $(MAKE) -C scripts/lxdialog all
 $(CONFIG_SHELL) scripts/Menuconfig arch/config.in
clean:
 find . \( -name '*.o' -o -name core -o -name ".*.flags" \) -type f -print \
 | grep -v lxdialog/ | xargs rm -f
 rm -f $(CLEAN_FILES)
distclean: clean
 rm -f $(DISTCLEAN_FILES)
linuxsubdirs: $(patsubst %, _dir_%, $(SUBDIRS))  # %是通配符,这里的%指的是任意文件,patsubst是一个函数,
        #这里是将SUBDIRS代表的任意文件转换成_dir_格式文件。如:_dir_driver;
$(patsubst %, _dir_%, $(SUBDIRS)) : include/version.h
 $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, $@) #-C为change跳转的意思,跳转到子目录中。$@表示目标文件,
            #这里的目标文件是$(patsubst %, _dir_%, $(SUBDIRS))
$(TOPDIR)/include/version.h: include/version.h
$(TOPDIR)/include/compile.h: include/compile.h
include/compile.h: $(CONFIGURATION) include/version.h
 @echo -n \#define UTS_VERSION \"\#$(VIVIRELEASE) > .ver
 @if [ -f .name ]; then  echo -n \-`cat .name` >> .ver; fi
 @echo ' '`date`'"' >> .ver
 @echo \#define VIVI_COMPILE_TIME \"`date +%T`\" >> .ver
 @echo \#define VIVI_COMPILE_BY \"`whoami`\" >> .ver
 @echo \#define VIVI_COMPILE_HOST \"`hostname`\" >> .ver
 @if [ -x /bin/dnsdomainname ]; then \
    echo \#define VIVI_COMPILE_DOMAIN \"`dnsdomainname`\"; \
  elif [ -x /bin/domainname ]; then \
    echo \#define VIVI_COMPILE_DOMAIN \"`domainname`\"; \
  else \
    echo \#define VIVI_COMPILE_DOMAIN ; \
  fi >> .ver
 @echo \#define VIVI_COMPILER \"`$(CC) $(CFLAGS) -v 2>&1 | tail -1`\" >> .ver
 @mv -f .ver $@
include/version.h:
 @echo \#define VIVI_RELEASE \"$(VIVIRELEASE)\" > .ver   #echo输出到.ver中,echo前面的@表示不回显
 @echo \#define VIVI_VERSION_CODE `expr $(VERSION) \\* 65536 + $(PATCHLEVEL) \\* 256 + $(SUBLEVEL)` >> .ver
 @echo '#define VIVI_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))' >>.ver
 @mv -f .ver $@ #$@表示主文件这里就是include/version.h
init/version.o: init/version.c include/compile.h
 $(CC) $(CFLAGS) -DUTS_MACHINE='"$(ARCH)"' -c -o init/version.o init/version.c
init/main.o: init/main.c
 $(CC) $(CFLAGS) $(CFLAGS_KERNEL) $(PROFILING) -c -o $*.o $<
TAGS: dummy
 etags `find include -name '*.h'`
 find $(SUBDIRS) init -name '*.[ch]' | xargs etags -a
# Exuberant ctags works better with -I
tags: dummy
 CTAGSF=`ctags --version | grep -i exuberant >/dev/null && echo "-I __initdata,__exitdata,EXPORT_SYMBOL,EXPORT_SYMBOL_NOVERS"`; \
 ctags $$CTAGSF `find include -name '*.h'` && \
 find $(SUBDIRS) init -name '*.[ch]' | xargs ctags $$CTAGSF -a
%: ./arch/def-configs/%
 $(MAKE) distclean
 cp arch/def-configs/$* ./.config -f
 $(MAKE) oldconfig
 $(MAKE)
 
ifdef CONFIGURATION
..$(CONFIGURATION):
 @echo
 @echo "You have a bad or nonexistent" .$(CONFIGURATION) ": running 'make" $(CONFIGURATION)"'"
 @echo
 $(MAKE) $(CONFIGURATION)
 @echo
 @echo "Successful. Try re-making (ignore the error that follows)"
 @echo
 exit 1
dummy:
else
dummy:
endif
include Rules.make 
阅读(1067) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~