Linux内核编译
shell脚本
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
作用为清理所有产生的文件和config配置文件。make ARCH=arm选择Linux的版本为arm,CROSS_COMPILE选择编译器,-distclean执行清理。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
作用为选择预设的.config文件,这里选择的是imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
作用为启动图形化配置界面
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j12
选择编译使用的资源,-j后的数字越高编译速度越快。
Makefile
VERSION = 4
PATCHLEVEL = 1
SUBLEVEL = 15
EXTRAVERSION =
NAME = Series 4800
设定Linux版本为4.1.15
MAKEFLAGS += -rR --include-dir=$(CURDIR)
MAKEFLAGS变量设置,"+="表示给MAKEFLAGS追加一些值,“-rR”表示禁止使用内置的隐含规则和变量定义,“–include-dir”指明搜索路径,“$(CURDIR)”表示当前目录。
“SHELL”和“MAKEFLAGS”这两个变量除非使用“unexport”声明,否则在整个make过程中,它们的值始终自动传递给子make。
unexport LC_ALL
不传递变量给子make,该变量作用是选择整个C语言环境。
LC_COLLATE=C
LC_NUMERIC=C
对变量赋值,“LC_COLLATE”变量作用是选择C语言环境的排序规则类别,“LC_NUMERIC”的作用是选择C语言设置的数字格式类别。
export LC_COLLATE LC_NUMERIC
传递变量给子make。
unexport GREP_OPTIONS
不传递变量,变量作用是选定文本格式。
ifeq ("$(origin V)", "command line")
KBUILD_VERBOSE = $(V)
endif
ifndef KBUILD_VERBOSE
KBUILD_VERBOSE = 0
endif
ifeq ($(KBUILD_VERBOSE),1)
quiet=
Q =
else
quiet=quiet_
Q = @
endif
该段是Makefile控制命令输出的代码。具体的,使用“ifeq”判断“(origin V)”和“command line”是否相等,其中“(origin V)”的含义是变量V的来源,“command line”指命令行,则若在命令行中定义变量“V”,则该表达式成立。成立后,将变量“V”的值赋值给变量“KBUILD_VERBOSE”,不成立则“KBUILD_VERBOSE”为0。
接下来判断“KBUILD_VERBOSE”是否为1,若为1则变量“Q”和变量“quiet”均为空,否则变量“Q”为“@”,变量“quiet”为“quiet_”。
变量“Q”和“quiet”用来控制编译时是否在终端输出完整的命令,若“Q”为“@”则默认不输出命令,“Q”为空则输出命令。若“quiet”为空,则输出全部命令,若“quiet”为“quiet_”,则仅输出短版本命令,若“quiet”为“silent_”,则整个命令都不会输出。
ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
quiet=silent_
endif
else # make-3.8x
ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
quiet=silent_
endif
endif
export quiet Q KBUILD_VERBOSE
该段描述了make -s静默输出功能。
ifneq ($(filter 4.%,$(MAKE_VERSION)),) # make-4
判断“filter 4.% (MAKE_VERSION)”和空是否相等,即判断当前使用的编译器版本号是否为4.x。若不相等则成立,执行里面的语句,即当编译器的版本号为4.x时成立。
ifneq ($(filter %s ,$(firstword x$(MAKEFLAGS))),)
判断“(filter %s , (firstword x(MAKEFLAGS))”是否和空相等,若不为空则条件成立。firstword是获取makeflags变量的第一个单词,若有传入单词且其中含有“s”时,例如当输入“make -s”时,该句成立,运行内容“quiet=silent_”,执行静默输出。
ifeq ($(KBUILD_SRC),)
ifeq ("$(origin O)", "command line")
KBUILD_OUTPUT := $(O)
endif
PHONY := _all
_all:
$(CURDIR)/Makefile Makefile: ;
ifneq ($(KBUILD_OUTPUT),)
saved-output := $(KBUILD_OUTPUT)
KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) && /bin/pwd)
$(if $(KBUILD_OUTPUT),, \
$(error failed to create output directory "$(saved-output)"))
PHONY += $(MAKECMDGOALS) sub-make
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
@:
sub-make: FORCE
$(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) -f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))
skip-makefile := 1
endif # ifneq ($(KBUILD_OUTPUT),)
endif # ifeq ($(KBUILD_SRC),)
endif
该段设置编译结果输出目录。
ifeq ($(KBUILD_SRC),)
判断变量“KBUILD_SRC”是否为空
ifeq ("$(origin O)", "command line")
判断“O”是否来自于命令行,如果来自命令行的化条件成立,“KBUILD_OUTPUT”就为“O”,因此变量KBUILD_OUTPUT就是输出目录。
$(CURDIR)/Makefile Makefile: ;
取消顶部Makefile的隐式规则
ifneq ($(KBUILD_OUTPUT),)
saved-output := $(KBUILD_OUTPUT)
判断“KBUILE_OUTPUT”变量是否为空,然后将路径信息保存到saved-output变量中。
KBUILD_OUTPUT := $(shell mkdir -p $(KBUILD_OUTPUT) && cd $(KBUILD_OUTPUT) && /bin/pwd)
调用mkdir命令,创建KBUILD_OUTPUT目录,并且将创建成功之后的绝对路径赋值给KBUILD_OUTPUT。