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

1.   引子

编译2.6.35.7 kernel版本的时候发现,“2.6.35.7“的内核版本编译成功后生成的版本号变成了“2.6.35.7+”,为什么后面会多一个加号呢?问题出现在linux的版本控制这一块:
打开Makefile我们可以在文件的最上面可以发现
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 35
EXTRAVERSION = .7
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 stringres="$res$(scm_version)"
else# apped a plus sign if the repository is not in a clean tagged# state and  LOCALVERSION= is not specifiedif test "${LOCALVERSION+set}" != "set"; thenscm=$(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下的脚本。
A. 如果没有定义LOCALVERSION,版本号后面会添加“+”号:执行else里的if下的脚本scm=$(scm_version --short),在函数scm_version --short里,如果传入参数short会添加“+”号,

 if $short; thenecho "+"returnfi

B. 定义了LOCALVERSION则不会执行else里if所在的脚本,从而不会在后面添加“+”号。
C. LOCALVERSION变量可在命令行定义:
make LOCALVERSION=.88 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 .; thenres="$res$(collect_files "$srctree"/localversion*)"
fi# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"

由此可看出,如果想往版本号里添加字符,有几种方式:
1. 使用LOCALVERSION变量(或者在命令行,或者添加为环境变量)
2. 在linux-2.6.35目录下添加文件localversion,文件内容会自动添加到版本号里去。
3. 定义CONFIG_LOCALVERSION变量
4. 如果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文件:

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

2. 这个文件里很多地方是跟根据一些git命令来进行判断的,例如

   if head=`git rev-parse --verify --short HEAD 2>/dev/null`; thenif [ -z "`git describe --exact-match 2>/dev/null`" ]; thenif git config --get svn-remote.svn.url >/dev/null; then[ -w . ] && git update-index --refresh --unmerged > /dev/nullif git diff-index --name-only HEAD | grep -v "^scripts/package" \

需要仔细注意:

我的解决方案:

make LOCALVERSION="" ARCH=arm CROSS_COMPILE=arm-hisiv200-linux- uImage

转载于:https://www.cnblogs.com/pengdonglin137/p/3685820.html

向linux内核版本号添加字符/为何有时会自动添加“+”号相关推荐

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

    转载说明:你可能想不到,是git管理的"问题",看下面的解析,对于u-boot也是有同样的效果. 问题解决方案: 1.删除.git目录 2.去掉CONFIG_LOCALVERSIO ...

  2. 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

    文章目录 一.下载 Linux 内核 1.下载最新版本 Linux 内核 2.下载指定版本 Linux 内核 二.Linux 内核版本号含义 一.下载 Linux 内核 1.下载最新版本 Linux ...

  3. 【Linux 内核】编译 Linux 内核 ② ( 解压内核源码 | 查询当前 Linux 内核版本号 | 进入并查看 linux 内核源码目录 )

    文章目录 一.解压内核源码 二.查询当前 Linux 内核版本号 三.进入并查看 linux 内核源码目录 一.解压内核源码 将 下载的 Linux 内核源码 linux-5.6.14.tar.gz ...

  4. Linux内核学习-字符设备驱动学习(二)

    在Linux内核学习-字符设备驱动学习(一)中编写字符设备驱动的一种方法,但是需要手动创建设备节点. 有没有能够自动的创建设备节点的呢? 有!使用class_create()和device_creat ...

  5. linux内核的版本号是如何标识的,Linux内核版本号命名的规则

    Linux内核版本有两种:稳定版和开发版 ,Linux内核版本号由3个数字组成:r.x.y r:目前发布的内核主版本. x:偶数表示稳定版本:奇数表示开发中版本. y:错误修补的次数. 内核版本号每位 ...

  6. iso linux 内核版本号_Linux内核全面介绍

    Linux内核(kernel)和linux操作系统区别 Linux内核指的是一个提供硬件抽象层.磁盘及文件系统控制.多任务等功能的系统软件.一个内核不是一套完整的操作系统.通常我们所说的linux操作 ...

  7. iso linux 内核版本号_Linux发行版和Linux内核的区别

    Linux内核版本与linux发行版本的区别 LINUX内核版本 是指系统内核的版本号.LINUX的内核具有两种不同的版本号,实验版本和产品化版本.要确定 LINUX版本 的类型,只要查看一下版本号: ...

  8. Linux内核版本号的含义

    转自http://www.cnblogs.com/darker/archive/2012/04/02/2430591.html 原作者保留所有权利 Linux内核有三个不同的命名方案. 早期版本: 第 ...

  9. 修改linux编译配置文件,Porting:linux内核编译、配置、修改配置文件、添加.c文件到内核...

    一.linux内核 $:'uname -a $:'uanme -r // 查看linux内核版本,开发板上进入linux后是一样的命令. 早起常常使用的版本:linux 2.6.x 开发板上使用的版本 ...

最新文章

  1. Anaconda安装,jupyter notebook 使用说明
  2. php导入excel表格数据,php页面导入excel表格数据-php导入excel 怎么获取excel表格数据...
  3. wps怎么投递简历发到boss直聘_2020年疫情时期,在厦门的你怎么开启新工作
  4. 一些windows下调试网络的命令行
  5. Extjs4.2——Panel
  6. 饿了么翻车,美团被质疑,马云也赔了40亿,这项技术为什么让人害怕?
  7. delphi报列表索引越界怎么处理_图解Elasticsearch索引机制,此篇带你领悟新世界...
  8. coredump产生与分析
  9. SQL服务器引擎---协议
  10. 文件上传_文件下载_后端获取登录用户---SpringCloud Alibaba_若依微服务框架改造---工作笔记003
  11. LeetCode(13)——罗马数字转整数(JavaScript)
  12. 阿里线上bug排查命令
  13. 一文理解 pytorch 拟合网络的过程
  14. Go 用JSON加载表格数据
  15. Python安装Tensorflow
  16. Grub 启动时的 Error 13: Invalid or unsupported executable 问题的解决
  17. 多媒体技术是指运用计算机,多媒体技术的概念与应用
  18. 【python】实现canny算子与LoG算子
  19. 软件工程(二)——过程模型
  20. 伺服阀放大器|通用型电液伺服阀放大器|伺服阀放大器厂家

热门文章

  1. postman mysql_postman连接mysql执行操作
  2. 网络基础:收集必备的网络基础知识
  3. 计算机网络基础:Internet常用服务介绍​
  4. 硬件:实用的电脑维护小常识
  5. 盘点八个程序员必备的代码编辑器
  6. EF 实现自定义数据库字符串
  7. 顺德机器人应用与维修专业收入_保定万维科技技校专业课程巡礼——计算机应用与维修...
  8. ux体验网站 英国_定义网站图像时的UX注意事项
  9. jvm系列(八):jvm知识点总览
  10. Python变量的复制