自己寫的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_%, %, $@)
$(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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章