• Linux内核顶层Makefile前期工作分析二


    一.  Linux内核顶层Makefile前期工作

    本文继续分析 Linux内核源码的 顶层 Makefile所做的准备工作。

    本文续上一篇文章,地址如下:

    Linux内核顶层Makefile前期工作分析一_凌肖战的博客-CSDN博客

    二.  内核顶层Makefile前期工作

    7.  模块编译

    Linux 允许单独编译某个模块,使用命令“ make M=dir ”即可,旧语法“ make SUBDIRS=dir
    也是支持的。顶层 Makefile 中的代码如下:
    1. 182 ifdef SUBDIRS
    2. 183 KBUILD_EXTMOD ?= $(SUBDIRS)
    3. 184 endif
    4. 185
    5. 186 ifeq ("$(origin M)", "command line")
    6. 187 KBUILD_EXTMOD := $(M)
    7. 188 endif
    8. 189
    9. 190 # If building an external module we do not care about the all: rule
    10. 191 # but instead _all depend on modules
    11. 192 PHONY += all
    12. 193 ifeq ($(KBUILD_EXTMOD),)
    13. 194 _all: all
    14. 195 else
    15. 196 _all: modules
    16. 197 endif
    17. 198
    18. 199 ifeq ($(KBUILD_SRC),)
    19. 200 # building in the source tree
    20. 201 srctree := .
    21. 202 else
    22. 203 ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
    23. 204 # building in a subdirectory of the source tree
    24. 205 srctree := ..
    25. 206 else
    26. 207 srctree := $(KBUILD_SRC)
    27. 208 endif
    28. 209 endif
    29. 210 objtree := .
    30. 211 src := $(srctree)
    31. 212 obj := $(objtree)
    32. 213
    33. 214 VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
    34. 215
    35. 216 export srctree objtree VPATH

    外部模块编译过程和 uboot 也一样,最终导出 srctree objtree VPATH 这三个变量的值,
    其中 srctree=. ,也就是当前目录, objtree 同样为“ . ”。

    8.  设置目标架构和交叉编译器

    uboot 一样, Linux 编译的时候需要设置目标板架构 ARCH 和交叉编译器 CROSS_COMPILE
    在顶层 Makefile 中代码如下:
    1. 252 ARCH ?= $(SUBARCH)
    2. 253 CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
    为了方便,一般直接修改顶层 Makefile 中的 ARCH CROSS_COMPILE ,直接将其设置
    为对应的架构和编译器。例如,这里改为如下:
    1. 252 ARCH ?= arm
    2. 253 CROSS_COMPILE ?= arm-linux-gnueabihf-

    9、调用 scripts/Kbuild.include 文件

    uboot 一样, Linux 顶层 Makefile 也会调用文件 scripts/Kbuild.include ,顶层 Makefile
    应代码如下:
    1. 349 scripts/Kbuild.include: ;
    2. 350 include scripts/Kbuild.include

    10、设置交叉编译工具变量

    顶层 Makefile 中其他和交叉编译器有关的变量设置如下:
    1. 353 AS = $(CROSS_COMPILE)as
    2. 354 LD = $(CROSS_COMPILE)ld
    3. 355 CC = $(CROSS_COMPILE)gcc
    4. 356 CPP = $(CC) -E
    5. 357 AR = $(CROSS_COMPILE)ar
    6. 358 NM = $(CROSS_COMPILE)nm
    7. 359 STRIP = $(CROSS_COMPILE)strip
    8. 360 OBJCOPY = $(CROSS_COMPILE)objcopy
    9. 361 OBJDUMP = $(CROSS_COMPILE)objdump
    LA LD CC 等这些都是交叉编译器所使用的工具。

    11、头文件路径变量

    顶层 Makefile 定义了两个变量保存头文件路径: USERINCLUDE LINUXINCLUDE ,相
    关代码如下:
    1. 381 USERINCLUDE := \
    2. 382 -I$(srctree)/arch/$(hdr-arch)/include/uapi \
    3. 383 -Iarch/$(hdr-arch)/include/generated/uapi \
    4. 384 -I$(srctree)/include/uapi \
    5. 385 -Iinclude/generated/uapi \
    6. 386 -include $(srctree)/include/linux/kconfig.h
    7. 387
    8. 388 # Use LINUXINCLUDE when you must reference the include/ directory.
    9. 389 # Needed to be compatible with the O= option
    10. 390 LINUXINCLUDE := \
    11. 391 -I$(srctree)/arch/$(hdr-arch)/include \
    12. 392 -Iarch/$(hdr-arch)/include/generated/uapi \
    13. 393 -Iarch/$(hdr-arch)/include/generated \
    14. 394 $(if $(KBUILD_SRC), -I$(srctree)/include) \
    15. 395 -Iinclude \
    16. 396 $(USERINCLUDE)

    381~386 行是 USERINCLUDE UAPI 相关的头文件路径,第 390~396 行是 LINUXINCLUDE Linux 内核源码的头文件路径。

    12、导出变量

    顶层 Makefile 会导出很多变量给子 Makefile 使用,导出的这些变量如下:
    1. 417 export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
    2. 418 export ARCH SRCARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS
    3. LD CC
    4. 419 export CPP AR NM STRIP OBJCOPY OBJDUMP
    5. 420 export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
    6. 421 export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
    7. 422
    8. 423 export KBUILD_CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS
    9. LDFLAGS
    10. 424 export KBUILD_CFLAGS CFLAGS_KERNEL CFLAGS_MODULE CFLAGS_GCOV
    11. CFLAGS_KASAN
    12. 425 export KBUILD_AFLAGS AFLAGS_KERNEL AFLAGS_MODULE
    13. 426 export KBUILD_AFLAGS_MODULE KBUILD_CFLAGS_MODULE
    14. KBUILD_LDFLAGS_MODULE
    15. 427 export KBUILD_AFLAGS_KERNEL KBUILD_CFLAGS_KERNEL
    16. 428 export KBUILD_ARFLAGS

    下一篇继续了解 Linux内核源码的顶层Makefile的准备工作。

  • 相关阅读:
    Qt扩展-QCustomPlot绘图基础概述
    软考高级系统架构设计师系列之:微服务知识点
    element中el-input 输入框 在自动填充(auto-complete=“on“)时,背景颜色会自动改变问题
    手机离线地图地图数据包教程
    Worthington丨Worthington 中性蛋白酶说明书
    vue实现词云图(echarts/Highcharts)
    TCP/IP 常见问题
    Mysql 分组排序取组内前几条
    双重循环及break,continue,return的运用
    本地部署企业邮箱,让企业办公更安全高效
  • 原文地址:https://blog.csdn.net/wojiaxiaohuang2014/article/details/133105841