Linux顶层编译SHELL和MAKEFILE

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值