转自:http://blog.csdn.net/adaptiver/article/details/7225980

之前每次由于git仓库编译出来每次都带有'+', 导致都需要使用git archive单独拉出一个干净的源码出来编译,这样一方面要重新编译,耗费时间,另一方面,改动会更麻烦,可能要本地来回打patch. 于是分享下面来解决这个问题。

有个简单的办法:无论kernel还是uboot,都可以在本地仓库的根目录下touch .scmversion空文件,然后编译即可, .config中CONFIG_LOCALVERSION_AUTO为No, CONFIG_LOCALVERSION="", 如果不配置Auto可能导致镜像用不了

1.   引子

编译2.6.35.7 kernel版本的时候发现,“2.6.35.7“的内核版本编译成功后生成的版本号变成了“2.6.35.7+”,为什么后面会多一个加号呢?问题出现在linux的版本控制这一块:
打开Makefile我们可以在文件的最上面可以发现

VERSION =
PATCHLEVEL =
SUBLEVEL =
EXTRAVERSION = .
NAME = Yokohama

这些就是告诉我们内核版本的版本号,生成出来的版本号理论上不应带+号,但为什么带+号呢

include/config/kernel.release文件是生成的带有版本号的文件,该文件由内核顶层Makefile的如下脚本处理:

# Store (new) KERNELRELASE string in include/config/kernel.release
include/config/kernel.release: include/config/auto.conf FORCE
$(Q)rm -f $@
$(Q)echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))" > $@

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

阅读scripts/setlocalversion文件,并查阅资料,做如下笔记:

2.   为何会添加“+”号

在scripts/setlocalversion文件中有这么一段

# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
# full scm version string
res="$res$(scm_version)"
else
# apped a plus sign if the repository is not in a clean tagged
# state and LOCALVERSION= is not specified
if test "${LOCALVERSION+set}" != "set"; then
scm=$(scm_version --short)
res="$res${scm:++}"
fi
fi

2.1. 如果定义了CONFIG_LOCALVERSION_AUTO(CONFIG_LOCALVERSION_AUTO=y)

此时会执行第一个if下的脚本。执行res="$res$(scm_version)"
如果代码属于git管理:
打了tag,则会添加tag相关字符;
没有打tag,则会添加log相加字符,例如最新的commit是
commit cdebe039ded3e7fcd00c6e5603a878b14d7e564e
则编译之后文件include/config/kernel.release的内容为2.6.35.7-gcdebe03

2.2. 如果没有定义了CONFIG_LOCALVERSION_AUTO。

此时会执行else下的脚本。

  • 如果没有定义LOCALVERSION,版本号后面会添加“+”号:执行else里的if下的脚本scm=$(scm_version --short),在函数scm_version --short里,如果传入参数short会添加“+”号,
   if $short; then
echo "+"
return
fi
  • 定义了LOCALVERSION则不会执行else里if所在的脚本,从而不会在后面添加“+”号。
  • LOCALVERSION变量可在命令行定义:
make LOCALVERSION=. include/config/kernel.release

或者添加为环境变量。
如果既不想添加字符,又不想有“+”号:不定义CONFIG_LOCALVERSION_AUTO,将LOCALVERSION变量定义为空:LOCALVERSION=

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

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

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

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

  • 使用LOCALVERSION变量(或者在命令行,或者添加为环境变量)
  • 在linux-2.6.35目录下添加文件localversion,文件内容会自动添加到版本号里去。
  • 定义CONFIG_LOCALVERSION变量
  • 如果linux-2.6.35目录下有文件localversion(其内容为.33),也使用了LOCALVERSION变量,也定义了CONFIG_LOCALVERSION=".XYZ"。

make LOCALVERSION=.44 include/config/kernel.release
此时对2.6.35.7的内核,include/config/kernel.release的内容为2.6.35.7.33.XYZ.55。
可看到添加的三种字符的顺序:文件localversion内容在前,然后是CONFIG_LOCALVERSION的值,最后是LOCALVERSION的值。

4.   另外,关于scripts/setlocalversion文件:

  • 在scripts/setlocalversion文件中,可用echo "aaa" >&2来输出显示相关信息,例如:
echo "LOCALVERSION=${LOCALVERSION}" >&
  • 这个文件里很多地方是跟根据一些git命令来进行判断的,例如
         if head=`git rev-parse --verify --short HEAD >/dev/null`; then

                   if [ -z "`git describe --exact-match 2>/dev/null`" ]; then

                   if git config --get svn-remote.svn.url >/dev/null; then

                   [ -w . ] && git update-index --refresh --unmerged > /dev/null

                   if git diff-index --name-only HEAD | grep -v "^scripts/package" \

需要仔细注意:

使用modinfo可查看编译出来的ko文件对应的内核版本号

使用uname或者 cat /proc/version 可在目标系统上查看内核版本号。

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

[Kernel]内核版本添加字符和内核版本'+'解决的更多相关文章

  1. linux内核自己添加模块(内核版本:3.0.101)

    做内核驱动第一步都是学习如何添加模块,这是基础,有了这个基础,剩下就是写代码了. 由于2.4到2.6内核版本的更新,无论是系统调用还是模块添加机制都有了巨大的变化,本人也因此饱经挫折,最后在3.0.1 ...

  2. 向linux内核版本号添加字符/为何有时会自动添加“+”号

    转载:http://blog.csdn.net/adaptiver/article/details/7225980 1.   引子 编译2.6.35.7 kernel版本的时候发现,“2.6.35.7 ...

  3. 向linux内核版本号添加字符/为何有时会自动添加"+"号或者"xxx-dirty"【转】

    本文转载自:https://blog.csdn.net/kangear/article/details/17020835 原文地址:http://blog.csdn.net/adaptiver/art ...

  4. three.js低版本添加文字(如71版本)

    研究了半天,最后终于加载成功了,记录一下three.js 71版本的文字加载,下面开始整个过程 首先,将ttf字体转换成js文件 源码版: https://github.com/gero3/facet ...

  5. 向linux内核中添加外部中断驱动模块

    本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...

  6. 十天学Linux内核之第九天---向内核添加代码

    原文:十天学Linux内核之第九天---向内核添加代码 睡了个好觉,很晚才起,好久没有这么舒服过了,今天的任务不重,所以压力不大,呵呵,现在的天气真的好冷,不过实验室有空调,我还是喜欢待在这里,有一种 ...

  7. QT5版本添加icon图标步骤

    QT5版本添加icon图标方法收藏 方法1: step1: 把要显示的图标文件,比如为1.ico文件放到工程v的根目录下 step2: 修改当前项目XXX.pro文件,在文件末尾添加如下内容(注意=的 ...

  8. 超强PHP集成环境,支持800多个不同PHP版本同时运行,无限自定义添加mysql与php版本

    转载自今日头条 小编最近发现PHPWAMP竟然又更新了,激动之余向大家介绍一下新版的强大功能. PHPWAMP是纯绿色集成环境,高版本php无需安装VC运行库,默认已经集成VC运行库!Nginx支持服 ...

  9. [App Store Connect帮助]六、测试 Beta 版本(4.1) 管理 Beta 版构建版本:为构建版本添加测试员

    在“TestFlight”部分中,您可以查看您所有 App 版本的构建版本,并深入查看构建版本的详细信息.您也可以为某个构建版本添加群组或独立测试员. 必要职能:“帐户持有人”职能.“管理”职能或“A ...

随机推荐

  1. PHP-中文在计算机中的存储

    经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符, WordPress程序是用的UTF-8,很多cms用的是GB2312. ● 为什么有这么多编码? ...

  2. nyoj-----前缀式计算

    前缀式计算 时间限制:1000 ms  |           内存限制:65535 KB 难度:3   描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀 ...

  3. Python程序数据溢出问题或出现 NAN 问题

    [数据溢出问题] overflow:溢出 overflow:上溢 underflow:下溢 数据溢出包括上溢和下溢. 上溢可以理解为:你想用一个int类型来保存一个非常非常大的数,而这个超出了int类 ...

  4. 【LeetCode】25. Reverse Nodes in k-Group (2 solutions)

    Reverse Nodes in k-Group Given a linked list, reverse the nodes of a linked list k at a time and ret ...

  5. SQL Server 数据库表的统计信息的更新

             最近在调整基础信息数据时,新增了几个客户类型,意想不到的事情发生了,在使用新增的客户类型作为 查询条件查询报表时,居然出现了超时的现象,但是用其他以前的客户类型查询就没有问题,用一个 ...

  6. 计算机硬盘大小转换(B,KB,MB,GB,TB,PB之间的大小转换)

    程序猿都非常懒.你懂的! java程序猿在实际的开发中会遇到非常多的单位换算问题.今天我给大家带来的是关于计算机硬盘大小的换算.多数情况下.一般要求b,kb,mb,gb,tb,pb之间的大小转换,我们 ...

  7. 开启Win7多用户登录远程桌面

    原文链接: http://blog.sina.com.cn/s/blog_7e5da5b101014fc4.html 多用户登陆破解:(支持win7 x86 & win7x64)在 Windo ...

  8. PixelLink

    简介 论文题目:PixelLink: Detecting Scene Text via Instance Segmentation 论文地址:https://arxiv.org/abs/1801.01 ...

  9. php 设置自动加载某个页面

    首先要找到Php.ini文件. 新建一个php文件,使用phpinfo(); 之后找到 Loaded Configuration File 指定的路径就是php.ini文件 打开文件,找到 auto_ ...

  10. java servlet中执行linux命令

    public HttpServletResponse execCmd(String cmd, HttpServletRequest request, HttpServletResponse respo ...