配置参数

最近在分析yocto中名为poky的嵌入式自动构建系统。在对内核进行定制的时候,看到了一个在进行内核编译时挺有用的特性,之前(作为野生程序员的我)一直没有发现。

该特性就是将源码与编译工作目录分离。其实在很多软件源码编译时都用到了该特性。这个特性好处是,一方面将源码和中间文件、最终文件分离,能够保持源码目录的简洁,理清编译过程;另一方面,可以针对同一份源码使用不同的build目录,每个目录使用不同的配置方法,相互之间不会混淆。L在内核源码树根目录下的Makefile中,其实已经给出了使用方法。Makefile中相关的注释如下所示:

# kbuild supports saving output files in a separate directory.

# To locate output files in a separate directory two syntaxes are supported.

# In both cases the working directory must be the root of the kernel src.

# 1) O=

# Use "make O=dir/to/store/output/files/"

#

# 2) Set KBUILD_OUTPUT

# Set the environment variable KBUILD_OUTPUT to point to the directory

# where the output files shall be placed.

# export KBUILD_OUTPUT=dir/to/store/output/files/

# make

#

# The O= assignment takes precedence over the KBUILD_OUTPUT environment

# variable.

设置build目录的方法有两种

make时使用O=参数

使用环境变量KBUILD_OUTPUT指定

其中,前者会覆盖后者的值。

例子

以3.12编译为例,编译步骤如下:

# cd $KERNEL_ROOT && mkdir build

# make O=./build menuconfig

# cd build && mkdir mod

# make

# make modules_install INSTALL_MOD_PATH="./mod"

创建编译目录build之后,进行内核配置。make命令之后,就可以在build目录下看到vmlinux,即为内核镜像。make modules_install命令将驱动模块安装到INSTALL_MOD_PATH参数指定的目录中。

除了以上的步骤之外,还有一个更为灵活的编译方式:

# cd $KERNEL_ROOT && mkdir build

# sh scripts/mkmakefile `pwd` `pwd`/build 3 12

# cd build

# make menuconfig

# make

和上面方法的差别是,本方法没有采用make O=xxx命令,而直接提取该命令中真正和创建output目录有关的脚本scripts/mkmakefile,使用该脚本在build目录内创建了一个新的Makefile。

mkmakefile脚本使用四个参数,第一个为内核源码目录,第二个为编译输出目录,第三个为版本,第四个为patchlevel。后两者查看根Makefile的头两行就知道了,也就是内核版本的主、次版本号。mkmakefile脚本中有简要的注释说明。

在根目录的Makefile中,搜索outputmakefile,可以看到这些内容:

PHONY += outputmakefile

# outputmakefile generates a Makefile in the output directory, if using a

# separate output directory. This allows convenient use of make in the

# output directory.

outputmakefile:

ifneq ($(KBUILD_SRC),)

$(Q)ln -fsn $(srctree) source

$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile \

$(srctree) $(objtree) $(VERSION) $(PATCHLEVEL)

endif

可以确认mkmakefile的作用以及用法。

在build目录创建了Makefile之后,在该目录中就像在内核树根目录中那样,可以进行编译相关工作。

最后

虽然做了这么多年内核开发,也号(自)称比较了解,不过却也认识到其实对内核这块不知道的确实也挺多,至少没有完整的看过根Makefile。原因的话,可能和没有系统地读过内核开发相关的官方文档有关系吧,毕竟对英文还是觉得有些难度,需要加油!

更新:

在意识到对内核了解不够之后,我去读了一下内核树根目录下的README,发现以上所总结的东西都是在制造轮子而已。。。在README中对应的文字如下:

BUILD directory for the kernel:

When compiling the kernel, all output files will per default be

stored together with the kernel source code.

Using the option "make O=output/dir" allow you to specify an alternate

place for the output files (including .config).

Example:

kernel source code: /usr/src/linux-3.X

build directory: /home/name/build/kernel

To configure and build the kernel, use:

cd /usr/src/linux-3.X

make O=/home/name/build/kernel menuconfig

make O=/home/name/build/kernel

sudo make O=/home/name/build/kernel modules_install install

Please note: If the 'O=output/dir' option is used, then it must be

used for all invocations of make.

更新2:

最近写了一个管理Linux内核编译的工具,适合需要编译多个版本内核、甚至每个内核有需要编译多个配置的应用场景,其中最重要的就是利用了build direcotry特性,将不同内核、不同配置放在不同的目录中,从而避免相互的干扰,保持源文件目录的干净。有兴趣的朋友可以试下:

Linux下编译build的命令,Linux内核编译中build目录设置相关推荐

  1. linux下mq通道的命令,Linux下MQ的安装

    Linux下MQ的安装 如果MQ的安装包是ISO,所以需要将ISO文件mount到Linux的一个目录下面,具体操作如下: 假如你选定的mount目录为根目录下mnt/下面,或者下面你新建一个目录可以 ...

  2. linux下的删除文件命令,Linux下删除文件命令

    在linux中删除文件与文件夹我们可以直接使用rm就可以删除了,彻底删除文件或文件夹我们可以使用shred命令来完成,接下来是小编为大家收集的Linux下删除文件命令,希望能帮到大家. Linux下删 ...

  3. linux 下删除批量文件命令,linux 批量删除文件与空文件删除命令linux操作系统 -电脑资料...

    在linux中删除文件与删除目录及删除空文章都是使用rm 命令了,执行rm指令可删除文件或目录,如欲删除目录必须加上参数\"-r\",否则预设仅会删除文件,下面我来介绍在linux ...

  4. linux 下删除批量文件命令,linux系统中批量删除文件与空文件删除的命令

    linux命令在系统中有两种类型:内置Shell命令和Linux命令.接下来是小编为大家收集的linux系统中批量删除文件与空文件删除的命令,希望能帮到大家. linux系统中批量删除文件与空文件删除 ...

  5. linux下unzip解压命令,linux的unzip解压命令的详细解释

    Linux中的unzip命令主要是用来解压zip格式的压缩文件.下面由学习啦小编为大家整理了Linux的unzip解压命令的详细解释,希望对大家有帮助! linux的unzip解压命令的详细解释 命令 ...

  6. linux 下安装gnu aspell命令,Linux spell命令

    Linux spell命令 Linux spell命令可建立拼写检查程序. spell可从标准输入设备读取字符串,结束后显示拼错的词汇. 语法spell 实例 检查文件testfile是否有拼写错误, ...

  7. linux下的wc -l命令,Linux下wc工具的简单实现

    wc工具是Linux下一款强大的统计字符数,单词数,行数的工具.其实实现挺简单的.我做了一简单的实现: #include #include #define LEN 4096 int text_c(FI ...

  8. linux下有关phy的命令,linux – 如何为Debian安装b43-lpphy-installer?

    b43-lpphy-installer是Ubuntu的包的名称,而不是Debian的包. 你可以在jessie(Debian 8)中使用命令安装它: sudo apt-get install firm ...

  9. linux下的绑核命令,Linux下的绑核命令——taskset

    什么是绑核 所谓绑核,其实就是设定某个进程/线程与某个CPU核的亲和力(affinity).设定以后,Linux调度器就会让这个进程/线程只在所绑定的核上面去运行.但并不是说该进程/线程就独占这个CP ...

  10. linux下类似chkconfig的命令,Linux系统下chkconfig命令使用详解

    chkconfig命令可以用来检查.设置系统的各种服务 使用语法: chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level ][系统服务 ...

最新文章

  1. 我仅使用到的dd if
  2. HTML DOM appendChild() 方法
  3. ORM框架SQLAlchemy学习笔记
  4. 多边形填充算法-有序边表法(扫描线算法) 计算机图形学
  5. linux进程cpu资源分配命令nice,renice,taskset
  6. 分布式系统原理 之3 Lease机制
  7. 为什么高手离不了Linux系统?我想这就是理由!
  8. JS_console对象中的一些常用方法
  9. oracle中md5加密解密_Oracle定义DES加密解密及MD5加密函数示例
  10. Nginx平滑添加模块
  11. java jhap_Java-Live与JVAP工具的Max
  12. MATLAB bwlabel
  13. 概率论在实际生活的例子_「收藏」不确定度是什么?两个例子让你清清楚楚
  14. treeTable树结构表格的使用
  15. 51开发板的功能及简单使用
  16. ios java模拟器 2017_Visual Studio 2017(Xamarin)未显示iPhone模拟器列表
  17. ubuntu 22.04 修复 key is stored in legacy trusted.gpg keyring
  18. cocos2d-x的初步学习二十之坦克大战七
  19. 裴波那契数列python
  20. 【笔记】复旦微FM33L026实现远程升级

热门文章

  1. 秋招经验总结(私企,外企,国企)
  2. Shell 脚本正则表达式(一)
  3. Google Colab中把pyth3.7版本更换成python2.7
  4. STM32 Cubemax(十一) ——JY901陀螺仪数据的读取与简单数据处理
  5. 《机器学习》西瓜书课后题7.3
  6. leetcode 183. Customers Who Never Order
  7. acm-(辗转相除法、丢番图方程)2020 China Collegiate Programming Contest Qinhuangdao Site I. Interstellar Hunter
  8. 分享一个CCLE细胞系数据(CCLE数据库不能用了吗?)
  9. C语言求数列最小公倍数,C语言复习---获取最小公倍数(公式法:两个数相乘等于最小公倍数乘以最大公约数)...
  10. 论文投稿指南——中国(中文EI)期刊推荐(第4期)