首页 > 系统相关 >向linux内核版本号添加字符/为何有时会自动添加“+”号

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

时间:2022-08-15 16:15:40浏览次数:120  
标签:scm 版本号 -- 添加 linux LOCALVERSION CONFIG

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 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下的脚本。
A. 如果没有定义LOCALVERSION,版本号后面会添加“+”号:执行else里的if下的脚本scm=$(scm_version --short),在函数scm_version --short里,如果传入参数short会添加“+”号,
if $short; then
echo "+"
return
fi

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 .; then
res="$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`; 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 ,确定编译出来的内核的版本号。
————————————————
版权声明:本文为CSDN博主「adaptiver」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/adaptiver/article/details/7225980

标签:scm,版本号,--,添加,linux,LOCALVERSION,CONFIG
From: https://www.cnblogs.com/liwei-swjtu/p/16588613.html

相关文章

  • Linux client with AD authentication login windows SQL Server
    Pre-WorklinuxshouldjoinADsameasSQLServersetspnonwindowsSQLServerforlinuxWindowsSQLServerC:\Users\Administrator>setspn-LsqladminRegi......
  • C++ Linux下使用共享内存
    在Linux下可以使用SystemV共享内存段实现共享内存,一共有4个API:创建共享内存段或使用已经创建的共享内存段-shmget()将进程附加到已经创建的共享内存段-shmat()从已......
  • Linux用户管理
    Linux用户管理概念用户名:用户的名称用户组:当前用户所在的组用户的家目录:当前账号登录成功之后的目录常用操作sudouseradd名添加用户sudopasswd设置密码s......
  • linux通过xshell远程登录失败
    状态描述:确认ssh配置完好,重启后查看日志也正常。openssh版本8.5。通过xshell远程连接,提示服务器拒绝连接。处理过程:由于是虚拟机,之前通过vnc连接的一个终端还未关闭。修......
  • linux 使用docker 容器部署sqlserver2019
    前提安装完docker,安装完docker-composedocker-compose.ymlversion:"2"services:sqlserver-2019:restart:always#容器名称container_name:sqlser......
  • python 中向集合中添加、删除元素
     001、>>>set1={"a","b","c","d"}##测试集合>>>set1{'c','a','d','b'}>>>set1.remove("d")##删......
  • Linux锁定、解锁和查询账号锁定状态
    Linux锁定、解锁和查询账号锁定状态passwd-l锁定passwd-u解锁passwd-S查询锁定状态......
  • uboot\linux\gcc 云盘分享
    阿里云盘:https://www.aliyundrive.com/s/iEqEXPMix9o提取码:46jh2022-08-15:uboot:u-boot-2010.03.tar.bz2u-boot-2013.10.tar.bz2u-boot-2016.11.tar.bz2u-boot-20......
  • linux下运行一个java类
    java代码,使用了jdk的包,以及第三方jar包(user.jar)中的类,以下例子为所有文件均在同一目录下。也可以不在同一目录,执行命令时需指定绝对路径即可。importa.b.User;import......
  • linux系统下还原oracle数据库
    报错信息:Copyright(c)1982,2011,Oracleand/oritsaffiliates.Allrightsreserved.UDI-28009:operationgeneratedORACLEerror28009ORA-28009:connection......