Linux内核(2)-Makefile详解,必须要掌握的编译参数

1.版本号

VERSION = 4
PATCHLEVEL = 1
SUBLEVEL = 15

2.MAKEFLAGS变量

MAKEFLAGS += -rR --include-dir=$(CURDIR)
包含当前目录及所有递归子目录

3.make V=1编译输出

make V=1 输出编译完整命令

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

origin V:查看变量V的来源,如果来源于command line,且KBUILD_VERBOSE 赋值为V的值,如果V=1 则quiet=quiet_和Q=@。
在Makefile中,如果命令前用@,则代表不将命令内容输出,例如@rm -rf $(output)

4.make -s 静默输出

make -s 实现静默编译

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

%:通配符,匹配任何字符
filter:从MAKE_VERSION变量中匹配指定的格式,例如 ( f i l t e r s (filter s% -s%, (filters(MAKEFLAGS)),就是匹配MAKEFLAGS中的s或者-s开头的字符串,如果匹配到的结果不为空,则quiet=silent_启用静默输出

5.make O=output 设置编译输出目录

make O=output 指定编译产生文件输出到指定目录

ifeq ("$(origin O)", "command line")
  KBUILD_OUTPUT := $(O)
endif

O的来源于 command line,则KBUILD_OUTPUT赋值为变量O的值

6.make C=1使能代码检查

ifeq ("$(origin C)", "command line")
    KBUILD_CHECKSRC = $(C)
endif
ifndef KBUILD_CHECKSRC
    KBUILD_CHECKSRC = 0
endif

7.make M=dir 模块编译

ifeq ("$(origin M)", "command line")
  KBUILD_EXTMOD := $(M)
endif

8.设置架构和编译器

 ARCH ?= $(SUBARCH)
 CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

9.交叉编译工具变量设置

AS = $(CROSS_COMPILE)as
CC = $(CROSS_COMPILE)gcc
#类似如上

10.头文件路径变量

顶层 Makefile 定义了两个变量保存头文件路径:USERINCLUDE 和 LINUXINCLUDE

11.导出变量

顶层Makefile导出子变量给其他Makefile使用

12.生成zImage过程

vmlinux:未压缩的原始内核文件,大约16MB
Image:objcopy拷贝vmlinux,并去除符号表等信息,大约12MB
zImage:Image使用gzip压缩,大约6MB
uImage:老版本uboot专用的镜像文件,包含一些头信息
最常用的为zImag

你可能感兴趣的:(Linux驱动/内核编程,linux,驱动开发,ubuntu,网络,物联网,嵌入式硬件)