--------------------------------------------- Make

file相关-------------------------------------------------

https://www.cnblogs.com/wang_yb/p/3990952.html

https://www.cnblogs.com/cecwxf/archive/2012/04/26/2470968.html

对于追加运算符“+

=”,如果变量先前被设置为简单变量(':='或':: ='),则右侧被视为立即数,否则被延迟。

一、Makefile 中:= 、?=、+=、:=的区别

= 是最基本的赋值

:= 是覆盖之前的值

?= 是如果没有被赋值过就赋予等号后面的值

+= 是添加等号后面的值

1、“=”

make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

x = foo

y = $(x) bar

x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

2、“:=”

“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

x := foo

y := $(x) bar

x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

xxx-objs:

xxx-objs指定了编译对象需要的文件,一般只有在源文件是多个时才需要它。

obj-?:

obj-?指定编译什么,怎么编译?其中的“?”可能是“y”或“m”。“y”指定把对象编译进内核中,“m”指定把对象编译为模块。

二、Makefile 命令前缀

Makefile 中书写shell命令时可以加2种前缀 @ 和 -, 或者不用前缀.

3种格式的shell命令区别如下:

不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行

前缀 @  :: 只输出命令执行的结果, 出错的话停止执行

前缀 -  :: 命令执行有错的话, 忽略错误, 继续执行

三、目标定义

$(obj-m)指明object文件作为可装载的内核模块被构建。一个模块可能从一个或者多个源文件被构建。

kbuild maefile只是简单的将源文件加到%(obj-m)。

目标定义就是用来定义哪些内容要做为模块编译,哪些要编译链接进内核。 obj-y += foo.o

表示要由foo.c或者foo.s文件编译得到foo.o并链接进内核,而obj-m则表示该文件要作为模块编译。

除了y,m以外的obj-x形式的目标都不会被编译。 而更常见的做法是根据.config文件的CONFIG_

变量来决定文件的编译方式。

例如: obj-$(CONFIG_ISDN) += isdn.o

obj-$(CONFIG_ISDN_PPP_BSDCOMP) +=

isdn_bsdcomp.o

除了obj-形式的目标以外,还有lib-y library库,hostprogs-y

主机程序等目标,但是基本都应用在特定的目录和场合下。

四、多文件模块的定义

如果一个内核模块从多个源文件构建,KBuild就必须要知道你想从哪些部分构建模块。

因此,你不得不设置$(-objs)变量来告诉KBuild。

最简单的kbuild

Makefile如上一节一句话的形式就够了,如果一个模块由多个文件组成,那么稍微复杂一些,

采用模块名加–objs后缀或者–y后缀的形式来定义模块的组成文件。

Kbuild使用后缀-objs,-y来识别混合的object文件。-objs代表多个源文件。

这允许Makefiles使用变量CONFIG_符号来决定一个object是否是混合object的的一部分。若CONFIG_符号=y,则一个object是混合object的的一部分。

例如: obj-$(CONFIG_EXT2_FS) += ext2.o

ext2-y := balloc.o bitmap.o

ext2-$(CONFIG_EXT2_FS_XATTR) += xattr.o

Kbuild 是使用後綴 -objs 及 -y 來識別哪些目的檔將作為合成目的檔。

這使 Makefile 能夠藉由 CONFIG_ 符號值,來判定某目的檔是否是合成目的檔的一部分。

在這項範例裡,若 $(CONFIG_EXT2_FS_XATTR) 為 'y',

xattr.o 才會成為合成目的檔 ext2.o 的一部分。

模块的名字为ext2,由balloc.o和bitmap.o两个目标文件最终链接生成ext2.o

直至ext2.ko文件,是否包括xattr.o取决于内核配置文件的配置情况(内核选项设置“make

menuconfig”时CONFIG_EXT2_FS_XATTR是否设置为y)。

注意,当你构造一个objects到内核中时,上面的语法当然也能够工作。

因此,如果你让CONFIG_EXT2=Y,KBuild将会为你构建一个独立的ext2.o文件,并且连接到built-in.o。

如果CONFIG_EXT2_FS的值是y也没有关系,在此过程中生成的ext2.o将被链接进built-in.o最终链接进内核。

这里需要注意的一点是,该kbuild

Makefile所在的目录中不应该再包含和模块名相同的源文件如ext2.c/ext2.s。

五、目录层次的迭代:

obj-$(CONFIG_EXT2_FS) += ext2/

如果CONFIG_EXT2_FS

的值为y或m,kbuild将会将ext2目录列入向下迭代的目标中,但是其作用也仅限于此,

具体ext2目录下的文件是要作为模块编译还是链入内核,还是有ext2目录下的Makefile文件的内容来决定的。

嵌套编译:

有时一个对象可能嵌入到另一个对象的目录下,那个如何编译子目录下的对象呢?其实很简单,只要指定obj_?的对象

为子目录的名字就可以了:

obj-? = $(sub_target)/

其中“?”可以是“y”或“m”,$(sub_target)是子目录名字。

linux内核make 时间久,Linux内核makefile问题相关推荐

  1. linux普通用户时间乱码,Linux root用户与普通用户时间不一致

    造成这种原因有多种,可能是安装软件时选的时区不是本国时间等等. 今天检查了root用户和oracle及grid用户的时间不一样,幸好数据库还没有正式应用,不然可能会造成时间差影响. 现在将同步的方法步 ...

  2. linux锁定系统时间设置,Linux时间设置系统时间、硬件时间和时间服务

    Linux有两个时间,一个是系统时间,一个是RTC时间(也叫硬件时间). Linux系统启动时,会自动获取硬件时间,设置为系统时间. 一.查询系统时间: 查询系统时间:date 查询/设置硬件时间: ...

  3. linux和window时间不一致,linux时间与Windows时间不一致的解决

    转载至http://goodluck1982.blog.sohu.com/138950694.html 一.首先要弄清几个概念: 1. "系统时间"与"硬件时间" ...

  4. 查看linux重启机时间,【linux】查看Linux开机时间/重启时间/运行时间

    [linux]查看Linux开机时间/重启时间/运行时间 6年前 (2015-07-14)    作者:Jiaozn    分类:Linux    阅读次数:4164 评论(0) 有时候需要查看Lin ...

  5. Linux内核tcp时间测量,linux内核 – 测试linux内核中函数的执行时间

    我使用Linux安全模块挂钩来添加一些自定义功能到recv()系统调用.与原始的recv()相比,我想测量这个功能的开销.我写了一个简单的tcp服务器,我运行与没有我的模块.这个tcp服务器调用rec ...

  6. Linux服务器上线时间,查看linux服务器时间

    你可以使用下面的工具来查看 Linux 或类 Unix 系统运行了多长时间: ◆uptime:告诉你服务器运行了多长的时间. ◆lastt:显示重启和关机时间. ◆tuptime:报告系统的运行时间历 ...

  7. linux 用户创建时间,在linux中如何能得知一个用户的创建时间?

    在linux中如何能得知一个用户的创建时间? (2011-08-24 03:36:01) 标签: 杂谈 在linux中如何能得知一个用户的创建时间?如题.之前我试过id.passwd以及通过stat查 ...

  8. linux显示前一天时间,在linux显示昨天(前一天)的日期

    day=`date -d '-7 day' +%Y-%m-%d`           //声明一个day变量,得到的是日期七天前的日期. man date,可以看到date可以显示当前的时间,修改系统 ...

  9. linux日志按照时间切割,Linux下把tomcat日志按日期自动分割

    Linux中tomcat日志分割需要用到cronolog 附上cronolog-1.6.2.tar.gz 1. 安装cronolog tar –zxvf cronolog-1.6.2.tar.gz . ...

  10. linux上点时间延时,Linux上时间和定时器

    Linux下时间和定时器 http://blog.chinaunix.net/u1/35065/showart_1870601.html重点读了第三种方法.文章写得很好,加了一点点注释可参考http: ...

最新文章

  1. 看BAT技术面试官如何挑选Java程序员
  2. 数值分析 pdf_统计分析前,要做哪些数据准备工作?
  3. WordPress Terillion Reviews插件HTML注入漏洞
  4. kendo treeview 修改节点显示值_VBA学习笔记60-1: Treeview控件
  5. 【ES6(2015)】Class (类)
  6. Educational Codeforces Round 18
  7. node.js第十课(HTTPserver)
  8. LeetCode 300最长递增子序列
  9. 宿主程序Crash与Lua是动态库还是静态库有关?
  10. IBM Lotus Domino Designer 下载安装记录
  11. 华硕笔记本BIOS详细设置
  12. mycncart如何开启短信验证接口功能
  13. 使用redis list类型解决卡券类奖品发放问题
  14. php 画布插入图像,PHP图片处理之图片背景、画布操作
  15. linux中apache与tomcat如何使用
  16. [AGC001E]BBQ Hard
  17. linux u盘内容乱码,解决Linux下U盘乱码的方法
  18. 隐藏win32控制台程序的窗口
  19. CVE-2017-5689(智能Intel产品AMT本地及远程提权漏洞)
  20. java直板手机_新一代街机之选!诺基亚S40金属直板6300评测

热门文章

  1. MongoDB进阶系列(12)——MongoDB 固定集合
  2. HTML5线性图表 图表数据区域可着色
  3. 【拯救赵明】网页防篡改攻略
  4. AWK学习笔记四:awk的环境变量
  5. git把项目上传到github的常用命令
  6. 一个时代的落幕!继苹果、火狐、Linux Lite之后,微软也放弃Flash
  7. 牛客网面试题总结(试券)
  8. 费波纳奇数c语言,费波纳切数列用C语言怎么编程
  9. uni-app 基于 Promise 的 request 请求封装
  10. Linux下安装PHP扩展