天天看点

vivi的Makefile注释 

vivi的Makefile注释

# 这几个都表示版本号,表示为0.1.4

VERSION = 0

PATCHLEVEL = 1

SUBLEVEL = 4 VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL) #定义目标系统的结构体系为arm

#其中 := 表示给变量赋值并立即展开生效;= 表示延迟生效。

ARCH := arm #shell函数的引用$$ -x表示可执行

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 = /opt/host/armv4l/include/ #vivi头文件目录

VIVIPATH           = $(TOPDIR)/include #本地编译器

HOSTCC          = gcc

#制定本地编译器参数

HOSTCFLAGS      = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer #制定交叉编译器的路径(不是完整的编译器,只是前缀)

CROSS_COMPILE   = /opt/host/armv4l/bin/armv4l-unknown-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 #转换2进制文件

OBJDUMP         = $(CROSS_COMPILE)objdump

#定义为配置文件

MAKEFILES       = $(TOPDIR)/.config

#一种用来计算和校验文件报文摘要的工具程序

MD5SUM   = md5sum

#是一个脚本

PERL            = perl

#一种脚本语言

AWK   = awk #导出前面定义的变量给子Makefile,如果在子Makefile中定义了同名变量,

#则是子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 #ifeq条件语句用于比较两个参数是否相等

#make内建函数wildcard,格式为$(wildcard PATTERN),函数作用是列出当前目录下

#所有复合模式“PATTERN”格式的文件名,“PATTERN”可以使用shell可识别的通配符,包括

#“?”(单字符)和“*”(多字符)。

ifeq (.config,$(wildcard .config))

#“include”指示符告诉make暂停读取当前的Makefile,而转去读取“include”指定的一个或多个文件

#完成以后继续当前的Makefile的读取。

#“include”的语法是include FILENAMES,"FILENAMES"是shell所支持的文件名,可以使用通配符

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

#指定子目录

SUBDIRS         = drivers lib #DRIVERS是保存驱动程序的变量

#CONFIG_SERISL 在./config里面定义了在include的包含下

DRIVERS-y :=

DRIVERS-$(CONFIG_SERIAL) += drivers/serial/serial.o

DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtd.o

DRIVERS := $(DRIVERS-y)

CLEAN_FILES = /

vivi-elf /

vivi /

vivi.nm /

vivi.map #

# Location of the gcc arm libs.

#

ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-unknown-linux/2.95.2

#ARM_GCC_LIBS = /opt/host/armv4l/lib/gcc-lib/armv4l-redhat-linux/2.95.3 OBJCOPYFLAGS = -R .comment -R .stab -R .stabstr CLIBS = -L$(ARM_GCC_LIBS) -lgcc -lc

LINKFLAGS = -Tarch/vivi.lds -Bstatic #DISTCLEAN_FILES定义要删除的文件

DISTCLEAN_FILES = /

include/autoconf.h include/version.h /

scripts/lxdialog/*.o scripts/lxdialog/lxdialog /

.menuconfig.log /

.config .config.old TAGS tags

include arch/Makefile export CPPFLAGS CFLAGS AFLAGS export DRIVERS LDFLAGS #dummy是虚假目标文件

Version: dummy

@rm -f include/compile.h vivi: include/version.h $(CONFIGURATION) init/main.o init/version.o linuxsubdirs

#ld链接器

$(LD) -v $(LINKFLAGS) /

   $(HEAD) /

   $(CORE_FILES) /

   $(DRIVERS) /

   $(LIBS) /

   -o vivi-elf $(CLIBS)

#NM工具

$(NM) -v -l vivi-elf > vivi.map

#objcopy工具

$(OBJCOPY) -O binary -S vivi-elf vivi $(OBJCOPYFLAGS) #oldconfig是用来比较新的和以前的配置有什么不同,不同的他会提示,然后选择要不要做更改,

#在config比较大的时候很便捷

oldconfig:

$(CONFIG_SHELL) scripts/Configure -d arch/config.in config:

$(CONFIG_SHELL) scripts/Configure arch/config.in #-C表示改变目录 表示首先进入scripts/lxdialog目录,在该目录执行make all

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 %, _dir_%, $(SUBDIRS)) : include/version.h

$(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" -C $(patsubst _dir_%, %, [email protected]) $(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

#[email protected]表示自动获取变量

@mv -f .ver [email protected] include/version.h:

@echo /#define VIVI_RELEASE /"$(VIVIRELEASE)/" > .ver

@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 [email protected] 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)

#如果没有配置直接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

继续阅读