添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
define filechk_kernel.release
    echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
endef
# Store (new) KERNELRELEASE string in include/config/kernel.release
include/config/kernel.release: include/config/auto.conf FORCE
    $(call filechk,kernel.release)

Makefile 使用 scripts/setlocalversion 工具来生成 include/config/kernel.release . “+” 号就是在调用这个脚本时添加的.

那么可以 通过执行如下命令生成版本文件

make include/config/kernel.release
make include/generated/utsrelease.h

查看这两个文件的信息就可以看到版本号信息

另外 Makefile 还有如下定义 :

kernelrelease:
         @echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"

也可以直接 使用如下命令来显示版本号信息

make kernelrelease
# 确认 auto.conf 文件是否存在 if test -e include/config/ auto .conf; then . include/config/ auto .conf echo "Error: kernelrelease not valid - run 'make prepare' to update it" >& 2 exit 1 # 调用 localversion 从源码根目录下的localversion文件中读取信息 # localversion* files in the build and source directory res= "$(collect_files localversion*)" if test ! "$srctree" -ef .; then res= "$res$(collect_files " $srctree "/localversion*)" # 设置 LOCALVERSION 信息 # CONFIG_LOCALVERSION and LOCALVERSION (if set) res= "${res}${CONFIG_LOCALVERSION}${LOCALVERSION}" # 调用 scm_version 函数读取后缀信息 # scm version string if not at a tagged commit if test "$CONFIG_LOCALVERSION_AUTO" = "y" ; then # full scm version string res= "$res$(scm_version)" # append a plus sign if the repository is not in a clean # annotated or signed tagged state (as git describe only # looks at signed or annotated tags - git tag -a/-s) and # LOCALVERSION= is not specified if test "${LOCALVERSION+set}" != "set" ; then scm=$(scm_version -- short ) res= "$res${scm:++}"

2.3.1 LOCALVERSION 的设置

scripts/setlocalversion 文件中还有有这么一段 :

# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"

可以发现如果配置了 CONFIG_LOCALVERSION LOCALVERSION 则会在版本号后面意思添加此后缀.

res 就是获取到的本地版本号信息, 比如 4.14-rc8

2.3.2 SCM_VERSION 后缀信息的添加

最后根据是否配置了 CONFIG_LOCALVERSION_AUTO CONFIG_LOCALVERSION 宏, 添加版本后缀信息

如果定义了

CONFIG_LOCALVERSION_AUTO=y

此时会执行执行

res="$res$(scm_version)"

其中 res 就是我们的版本号信息, 而 scm_version 函数获取了版本号后缀.

否则如果没有设置 CONFIG_LOCALVERSION_AUTO , 则执行如下片段.

# 调用 scm_version 函数读取后缀信息
# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
    # full scm version string
    res="$res$(scm_version)"
    # append a plus sign if the repository is not in a clean
    # annotated or signed tagged state (as git describe only
    # looks at signed or annotated tags - git tag -a/-s) and
    # LOCALVERSION= is not specified
    if test "${LOCALVERSION+set}" != "set"; then
        scm=$(scm_version --short)
        res="$res${scm:++}"

对于 setlocalversion 中的一个语法解释一下 :

${var:-value1} 在变量 var 不为空时, 保持 var 原有的值不变; 如果 var 变量未设置或者为空, 这表达式结果为 value1, 但是变量 var 的值并不改变(未设置或为空) ${var:+value1} 在变量 var 不为空时, 表达式结果为 value1; 如果 var 变量未设置或者为空, 这表达式结果为空. ${var+value1} 的效果一样 ${var:=value1} 在变量 var 不为空时, 保持 var 原有的值不变; 如果 var 变量未设置或者为空, 这表达式结果为value1, 变量 var 也被赋值为 value1 ${var:?value1} 在变量 var 未设置或为空时, 脚本会退出并抛出一个错误信息(包含value1)
  • 如果 CONFIG_LOCALVERSION_AUTO = y 这段程序会通过 scm_version 函数(不加参数)配置本地版本号.

  • 如果 CONFIG_LOCALVERSION_AUTO 未被设置, 而 LOVALVERSION 为空, 则 "${LOCALVERSION+set}" != "set", 那么调用 scm_version --short 会在最后添加一个 + 号.

  • 原来如此, 加号是这样加上去的. 那么加号具体怎么添加上去的, 然后, scm_version 具体做了什么工作, 这些配置宏是如何影响版本号和后缀信息的, 那只有研究 scm_version 函数了.

    2.3.3 版本后缀信息获取

    # 如果 --short 被设置则直接打印 + 号 # 否则git读取版本号信息, # 如果git tag号存在git describe | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' # 否则直接打印commit号信息 if test -z "$(git rev-parse --show-cdup 2>/dev/null)" && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore # it, because this version is defined in the top level Makefile. if [ -z "`git describe --exact-match 2>/dev/null`" ]; then # If only the short version is requested, don't bother # running further git commands if $short; then echo "+" return # If we are past a tagged commit (like # "v2.6.30-rc5-302-g72357d5"), we pretty print it. if atag="`git describe 2>/dev/null`"; then echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' # If we don't have a tag at all we print -g{commitish}. printf '%s%s' -g $head # Is this git on svn? if git config --get svn-remote.svn.url >/dev/null; then printf -- '-svn%s' "`git svn find-rev $head`" # Check for uncommitted changes # 如果有未提交的文件则会添加-dirty后缀 if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then printf '%s' -dirty # All done with git return # Check for mercurial and a mercurial repo. if test -d .hg && hgid=`hg id 2>/dev/null`; then # Do we have an tagged version? If so, latesttagdistance == 1 if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then id=`hg log -r . --template '{latesttag}'` printf '%s%s' -hg "$id" tag=`printf '%s' "$hgid" | cut -d' ' -f2` if [ -z "$tag" -o "$tag" = tip ]; then id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` printf '%s%s' -hg "$id" # Are there uncommitted changes? # These are represented by + after the changeset id. case "$hgid" in *+|*+\ *) printf '%s' -dirty ;; # All done with mercurial return # Check for svn and a svn repo. # 获取 svn 仓库的版本号后缀信息 if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then rev=`echo $rev | awk '{print $NF}'` printf -- '-svn%s' "$rev" # All done with svn return

    bash 判断语句来判断

    git rev-parse --verify --short

    来判断当前是否是 git 版本库管理, 接着输出一个短的版本库HEAD revision 的短编码.

    git rev-parse --verify --short HEAD 2>/dev/null

    关键在下面这条语句的执行结果

    git describe --exact-match

    这一句是描述出当前的 tag 标识. 如果没有 tag 就为空, 那么整个 if 语句就为真, 就会执行下去, 下面的 echo "+", 这就会在版本号中输出一个 + 号.

    如果我们在版本库中

    git tag -a -m "v0.1" v0.1

    后, 我们在执行 git describe --exact-match 这一句, 发现输出的是我们的 tag 标识. 那 if 语句就不成里了, 就不会 echo "+" 了.

    继续看上面的代码, 如果有未提交的代码, printf -dirty 的地方进行了 git diff 的检查, 也就是说我有修改过的, 没有上传的文件. 到此基本上原因全部查明, 我把文件进行上传后, 重新 make prepare 后, 生成的 kernel.release 果然正确.

    结论, linux 对版本的管理相当严格,这也就让我们在进行代码管理中必须严格要求自己,比如发版本前,先检查是否还有修改为上传的文件,然后要在git版本库中打一个tag。

    如果代码属于 git 管理

  • 打了 tag, 则会添加tag相关字符

    • 如果 tag 只是简单的标记, 比如 4.14-rc8 则跳过, 因为这些信息已经从前面 makefile 中获取到了

    • 如果 tag 还有其他后缀标记, 比如 v2.6.30-rc5-302-g72357d5, 则将这些打印出来

  • 没有打 tag, 则会添加 log 字符
    例如最新的 commit

    commit cdebe039ded3e7fcd00c6e5603a878b14d7e564e

    则编译之后文件 include/config/kernel.release 的内容为 4.14.0-rc8-gcdebe03

  • 按照从之前传递的参数过来

  • 如果没有定义了 CONFIG_LOCALVERSION_AUTOLOCALVERSION, scm_version 函数会传递过去 --short 参数版本号后面会添加 "+" 号.

    if $short; then
    echo "+"
    return
    
    # localversion* files in the build and source directory
    res="$(collect_files localversion*)"
    if test ! "$srctree" -ef .; then
        res="$res$(collect_files "$srctree"/localversion*)"
    # CONFIG_LOCALVERSION and LOCALVERSION (if set)
    res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"

    由此可看出, 如果想往版本号里添加字符, 有几种方式 :

  • 使用 LOCALVERSION 变量(或者在命令行, 或者添加为环境变量)

  • 在内核源代码根目录下添加文件 localversion 文件内容会自动添加到版本号里去. 在本地创建 文件中添加

  • 定义 CONFIG_LOCALVERSION 变量

  • 往版本号里添加字符的方式

  • LOCALVERSION 变量可在命令行定义 :

    make LOCALVERSION=.44 include/config/kernel.release

    或者添加为环境变量

    export LOCALVERSION=.44
    make include/config/kernel.release

    当前内核版本为 4.14.0-rc8, 如果源码根目录下有文件 localversion(其内容为 .33), 也使用了 LOCALVERSION变量(make 时指定), 也定义了CONFIG_LOCALVERSION=".XYZ".

    make LOCALVERSION=.44 include/config/kernel.release

    此时对 4.14-rc8 的内核, include/config/kernel.release 的内容为 4.14-rc8.33.XYZ.55.

    可看到添加的三种字符的顺序

    文件 localversion 内容在前, 然后是 CONFIG_LOCALVERSION 的值, 最后是 LOCALVERSION 的值

  • 如果 CONFIG_LOCALVERSION_AUTO = y 这段程序会通过 scm_version 函数(不加参数)配置本地版本号后缀信息. 后缀信息一般都是托管仓库的版本号, 比如 git tag/commit

  • 如果 CONFIG_LOCALVERSION_AUTO 未被设置, 而 LOVALVERSION 为空, 则 "${LOCALVERSION+set}" != "set", 那么调用 scm_version --short 会在最后添加一个 + 号.

  • 另外, 关于 scripts/setlocalversion 文件.

    在 `scripts/setlocalversion文件中,可用echo “aaa” >&2来输出显示相关信息,例如:
    echo “LOCALVERSION=${LOCALVERSION}” >&2

    需要仔细注意

    使用 modinfo 可查看编译出来的 ko 文件对应的内核版本号
    使用 uname 或者 cat /proc/version 可在目标系统上查看内核版本号.

    可查看 kernel 编译过程生成的文件 include/config/kernel.release 或者 include/generated/utsrelease.h, 确定编译出来的内核的版本号.

  • LOCALVERSION 可以在版本号之后追加后缀信息, 如果再定义 CONFIG_LOCALVERSION_AUTO, 将在最后进一步追加 git 版本号为后缀信息.

  • 不定义CONFIG_LOCALVERSION_AUTO 将不显示 git 仓库信息, 如果此时 LOCALVERSION 变量定义也未定义, 将追加 “+”.

  • 如果既不想添加后缀, 又不想有 "+" 号 : 不定义CONFIG_LOCALVERSION_AUTO, 将 LOCALVERSION 变量定义为空 : LOCALVERSION=.

  • 只要定义了 LOCALVERSION, 则就不会追加 “+” 号了

  • 采用知识共享许可协议知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可. 欢迎转载、使用、重新发布, 但务必保留文章署名成坚gatieme ( 包含链接: http://blog.csdn.net/gatieme ), 不得用于商业目的.

  • 基于本文修改后的作品务必以相同的许可发布. 如有任何疑问,请与我联系.

  • 真正在工作接触内核,其实仅仅是一年前的事情。在使用git管理代码时,发现编译出来的版本会自动带个加号“+”,或者带有“dirty”字样,当时查了些资料解决了。现在隔了那么久,觉得还是有必要写点笔记出来... 来自: 李迟的专栏 1.   引子编译2.6.35.7 kernel版本的时候发现,“2.6.35.7“的内核版本编译成功后生成的版本号变成了“2.6.35.7+”,为什么后面会多一个加号呢?问题出现在linux的版本控... 来自: adaptiver的专栏 南南南南啊!简述:1.下载spring源码:2.安装gradle:3.构建源码:导入idea:简述:不能忍受慢(看到这里你就准备笑吧!!)其他大神的博客实在让我难受自己动手,下载spring,编译sp... 来自: qq_40670946的博客 一、实验前提    下载2.6.19或更新的Linux内核,配置该内核使其支持NTFS,并在新的内核中修改其版本为Linux NameTestKernelx.x.x,其中,Name是你的名字(汉语拼音... 来自: c_zyer的博客 m -j32 iso_img("4.4.12Error: kernelrelease not valid - run make prepare to update it" exceeds 64) 07-31 m -j32 iso_img("4.4.12Error: kernelrelease not valid - run make prepare to update it" exceeds 64) 来自: 张同光 (Tongguang Zhang):Hello everyone ! 摘要:在进行内核编译的时候,内核配置无疑是其中最为重要的环节,直接决定了编译的内核是否能够满足要求。而且,对于新加入的内核特性,我们往往无法在make menuconfig中找到相应的选项。本文主要为... 来自: 河西无名式 11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。  区块链技术被认为是继蒸汽机、电力... 来自: CSDN资讯 大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频... 来自: 帅地 今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。于是乎用h5 audio的加上js简单的播放器完工了。演示地点演示html代码如下` music 这个年纪 七月的风... 来自: qq_44210563的博客 来源:公众号【编程珠玑】作者:守望先生ID:shouwangxiansheng前言经常有读者让我推荐书籍,这次我就把我私藏的计算机书单分享给你们!不过由于时间匆忙,不会进行更加详细的介绍。以下大部分书... 来自: 守望的博客-编程珠玑 引子Hacker(黑客),往往被人们理解为只会用非法手段来破坏网络安全的计算机高手。但是,黑客其实不是这样的,真正的“网络破坏者”是和黑客名称和读音相似的骇客。骇客,是用黑客手段进行非法操作并为己取得... 来自: tiantian520ttjs——Python程序猿~ 来源:苦逼的码农(ID:di201805)前言天各一方的两台计算机是如何通信的呢?在成千上万的计算机中,为什么一台计算机能够准确着寻找到另外一台计算机,并且把数据发送给它...... 来自: Java团长的博客 引言最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧。Java学习路线当然,这里... 来自: java_sha的博客 在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次... 来自: 程序员宜春的博客 可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了!可能也有一大部分人知道递归,也能看的懂递归,但在实际... 来自: weixin_30216561的博客 作者 |胡书敏责编 | 刘静出品 | CSDN(ID:CSDNnews)本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。... 来自: CSDN资讯 开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢?整理 | 屠敏出品 | CSDN(ID:CSDNnews)毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为... 来自: CSDN资讯 知乎高赞:中国有什么拿得出手的开源软件产品?在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?”事实上,还不少呢~本人于2019.7.6进行了较为全面的... 来自: 大白技术控 - 大白技术Bravo Yeung 关注“技术领导力”博客,独家大厂干货推送文/Daniel.WDavid坐在我对面,窗外是梦境般的外滩夜景,繁星点点的璀璨灯火,散落在黄浦江两岸。我转过头对David说,你丫挺会享受啊,约我到这么浪漫的... 来自: 技术领导力 昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔... 来自: web前端交流群600610151 欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所... 来自: Python作业辅导员 - 天元浪子【许向武】 首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。那么,... 来自: DavidGoGo_的博客 最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成)one 樱花树 动态生成樱花效... 来自: 碎片 开头:今天2B哥要和大家分享一篇硬货,为什么呀?因为有两个好事情:一、哥升级了LV2了 哈哈心情倍爽。二、拿到了公司给的2千股在公司呆了2年了,终于成为了东哥的好兄弟。CMS收集器实战:实战开始,准备... 来自: Java2B 英雄不问出处?自古以来就有这样一句话,真的英雄不问出处吗?这句话太挫了。普通三本院校的我,大四的时候居然都不知道什么是校招,所以出处太重要了。这也是没有机会参加阿里校招的原因,毕竟校招门槛比社招还是要... 来自: 码匠笔记 全文共2975字,预计学习时长9分钟图源:百度10月24日,一段“996程序员猝死在1024程序员节”的视频在各大IT群疯传。不久 “程序员猝死”的消息被搬上了热搜。图源...... 来自: 读芯术的博客 由于Linux版本的在不断更新,当设备驱动去兼容不同版本的内核时,需要知道当前使用的内核源码版本,以此来调用对应版本的内核API,这两个宏定义在文件/usr/include/linux/version... 来自: whatday的专栏 在源代码的根目录,执行make menuconfig。在第一项general setting里面的LOCALVERSION里,添加-linux字段。这样编译出来的内核版本就是2.6.30.10-lin... 来自: 醉清风 前言在 Java 12 里面有个非常好用但在官方 JEP 没有公布的功能,因为它只是 Collector 中的一个小改动,它的作用是 merge 两个 collector 的结果,这句话显得很抽象,老... 来自: 日拱一兵 作者 | 胡巍巍出品 | CSDN(ID:CSDNnews)世界500强中,30%的掌舵人,都是印度人。是的,你没看错。这是近日《哈佛商业评论》的研究结果。其中又以微软CEO萨提亚·纳德拉(Satya... 来自: CSDN资讯 前奏:今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。以下就是他的简历和面试情况。基本情况:专业技能:1、 熟悉Sping了解SpringMVC、SpringBoo... 来自: HarderXin的专栏 今天咱们第一课,来讲讲大家一直很关注的数据中台。其实,数据中台也是企业数据管理的一部分,甚至可以说是很重要的一部分。一、什么是中台?这其实是一个老生常谈的概念了,中台,顾名思义,就是在起中间作用的东西... 来自: Leo的博客 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。已经有好几个朋友问我mba怎么样了,所以今天... 来自: Diana5253的博客 依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的????不过,导员说的是实话,很多人都叫我大神... 来自: 编码之外的技术博客 参考了linuxsir和水母的linux版的精华区,本人不保留任何版权。经过归纳整理,看看上面的就可以了,包括补丁如何打。具体的一些选项可以往下看,一些一看就懂的白痴选项,并没有选进来,因此适合对电脑... 来自: sanying012345的专栏 文章目录1.前言2.知识储备3.爬取静态网站4.爬取动态网站1.前言近日疫情严重,手机已经玩吐了,闲着无聊逛衣服品牌官网发现,结果一时兴起,想学一学python,写一个爬虫下载官网所有最新上架的衣服图... 来自: namespace_Pt的博客 栈在邂逅了完线性结构的数组和队列后, 我们便偶遇了栈这个东东, 他到底是个啥?就让我们慢慢揭开它的神秘面纱吧~~~需求介绍栈的介绍栈的英文为(stack)栈是一个先入后出(FILO-First In ... 来自: 时间静止
  •