vivi的Makefile注释

    技术2024-09-30  54

    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_%, %, $@) $(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 /#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 $@ 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

     

    最新回复(0)