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_AUTO
和 LOCALVERSION
, 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 ...
来自: 时间静止