kernel编译时对svn版本的检查

背景:
1.使用svn管理下的kernel源码,在编译完安装的时候会生成一个带有“+”的字符串,用来表示版本号;
2.使用不在svn管理下的kernel源码,在编译完安装的时候会生成一个不带有”+”的字符串。

问题:
我使用在svn管理下的kernel源码编译kernel和ko文件,然后把ko加载到不在svn管理下的kernel的系统中,就遇到了提示:说ko应该是加载到带有“+”的kernel版本中,但是现在的kernel不带有“+”。
看起来有点绕,不过意思应该已经表明了。

解决:
1.首先发现这个是否带有“+”的现象是由于使用了在svn管理下和不在svn管理下的两个版本引起的。
2.偷懒了,没有直接紧跟看代码,而是去网上搜了。于是搜到了:
https://blog.csdn.net/adaptiver/article/details/7225980 和类似的帖子。
文章很有用,为我指明了方向。然后跟着文章看了一遍确认是版本号引起的,然后回去看一下scripts/setlocalversion的实现,最终找到了问题。其实两份kernel是一模一行的,唯一的区别就是一个svn管理的,另一个是用cp从前者复制出来的。
具体问题出现在:

159 # scm version string if not at a tagged commit
160 if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
161   # full scm version string
162   res="$res$(scm_version)"
163 else
164   # append a plus sign if the repository is not in a clean
165   # annotated or signed tagged state (as git describe only
166   # looks at signed or annotated tags - git tag -a/-s) and
167   # LOCALVERSION= is not specified
168   if test "${LOCALVERSION+set}" != "set"; then
169     scm=$(scm_version --short)
170     res="$res${scm:++}"
171   fi
172 fi
173 

虽然没在svn管理下的版本也进入了170行,但是scm这个变量的值是空的,因为它调用scm_version的时候不能获取svn到的版本号,所以res的值就没有“+”。

解决的方法就是先在svn管理下的kernel中用:

$(srctree)/scripts/setlocalversion --save-scmversion

生成一个.scmversion的隐藏文件,里面会记录svn的版本号。
然后把这个文件也一起复制到不在svn管理下的源码中,再编译它就会生成带有“+”的版本号了。

猜你喜欢

转载自blog.csdn.net/k7arm/article/details/81941745