2020-03-03 13:24:32 +08:00
|
|
|
|
# [内核版本添加字符](https://blog.csdn.net/adaptiver/article/details/7225980)
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
之前每次由于 git 仓库编译出来每次都带有'+', 导致都需要使用 git archive 单独拉出一个干净的源码出来编译,这样一方面要重新编译,耗费时间,另一方面,改动会更麻烦,可能要本地来回打 patch. 于是分享下面来解决这个问题。
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
有个简单的办法:无论 kernel 还是 uboot,都可以在本地仓库的根目录下 touch .scmversion 空文件,然后编译即可, .config 中 CONFIG_LOCALVERSION_AUTO 为 No, CONFIG_LOCALVERSION="", 如果不配置 Auto 可能导致镜像用不了。
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
|
|
|
|
## 引子
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
编译 2.6.35.7 kernel 版本的时候发现,“2.6.35.7“的内核版本编译成功后生成的版本号变成了“2.6.35.7+”,为什么后面会多一个加号呢?问题出现在 linux 的版本控制这一块:
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
打开 Makefile 我们可以在文件的最上面可以发现
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```Makefile
|
2020-03-03 13:24:32 +08:00
|
|
|
|
VERSION = 2
|
|
|
|
|
PATCHLEVEL = 6
|
|
|
|
|
SUBLEVEL = 35
|
|
|
|
|
EXTRAVERSION = .7
|
|
|
|
|
NAME = Yokohama
|
|
|
|
|
```
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
这些就是告诉我们内核版本的版本号,生成出来的版本号理论上不应带“+”号,但为什么带“+”号呢
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
include/config/kernel.release 文件是生成的带有版本号的文件,该文件由内核顶层 Makefile 的如下脚本处理:
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
# 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))" > $@
|
|
|
|
|
```
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
使用 scripts/setlocalversion 工具来生成 include/config/kernel.release。“+”号就是在调用这个脚本时添加的。
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
阅读 scripts/setlocalversion 文件,并查阅资料,做如下笔记:
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
|
|
|
|
## 为何会添加“+”号
|
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
在 scripts/setlocalversion 文件中有这么一段
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
# 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
|
|
|
|
|
```
|
|
|
|
|
|
2020-03-16 11:05:55 +08:00
|
|
|
|
### 如果定义了 CONFIG_LOCALVERSION_AUTO(CONFIG_LOCALVERSION_AUTO=y)
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
|
|
|
|
此时会执行第一个if下的脚本。执行res="$res$(scm_version)"
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
如果代码属于 git 管理:打了 tag,则会添加 tag 相关字符;没有打 tag,则会添加 log 相加字符,例如最新的 commit 是:commit cdebe039ded3e7fcd00c6e5603a878b14d7e564e,则编译之后文件 include/config/kernel.release 的内容为 2.6.35.7-gcdebe03。
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-03-16 11:05:55 +08:00
|
|
|
|
### 如果没有定义 CONFIG_LOCALVERSION_AUTO
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
|
|
|
|
此时会执行else下的脚本。
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
* 如果没有定义 LOCALVERSION,版本号后面会添加“+”号:执行 else 里的 if 下的脚本 scm=$(scm_version --short),在函数 scm_version --short 里,如果传入参数 short 会添加“+”号,
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
if $short; then
|
|
|
|
|
echo "+"
|
|
|
|
|
return
|
|
|
|
|
fi
|
|
|
|
|
```
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
* 定义了 LOCALVERSION 则不会执行 else 里 if 所在的脚本,从而不会在后面添加“+”号。
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
* LOCALVERSION 变量可在命令行定义:
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
make LOCALVERSION=.88 include/config/kernel.release
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
或者添加为环境变量。
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
如果既不想添加字符,又不想有“+”号:不定义 CONFIG_LOCALVERSION_AUTO,将 LOCALVERSION 变量定义为空:LOCALVERSION=
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
|
|
|
|
## 往版本号里添加字符的方式
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
在 scripts/setlocalversion 文件中还有有这么一段:
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
# 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}"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
由此可看出,如果想往版本号里添加字符,有几种方式:
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
* 使用 LOCALVERSION 变量(或者在命令行,或者添加为环境变量)
|
|
|
|
|
* 在 linux-2.6.35 目录下添加文件 localversion,文件内容会自动添加到版本号里去。
|
|
|
|
|
* 定义 CONFIG_LOCALVERSION 变量
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
如果 linux-2.6.35 目录下有文件 localversion(其内容为.33),也使用了 LOCALVERSION 变量,也定义了 CONFIG_LOCALVERSION=".XYZ"。
|
2020-03-16 11:05:55 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
make LOCALVERSION=.44 include/config/kernel.release
|
2020-03-16 11:05:55 +08:00
|
|
|
|
```
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
此时对 2.6.35.7 的内核,include/config/kernel.release 的内容为 2.6.35.7.33.XYZ.44。
|
2020-03-16 11:05:55 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
可看到添加的三种字符的顺序:文件 localversion 内容在前,然后是 CONFIG_LOCALVERSION 的值,最后是 LOCALVERSION 的值。
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
## 另外,关于 scripts/setlocalversion 文件
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
* 在 scripts/setlocalversion 文件中,可用 echo "aaa" >&2 来输出显示相关信息,例如:
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
echo "LOCALVERSION=${LOCALVERSION}" >&2
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
* 这个文件里很多地方是跟根据一些git命令来进行判断的,例如
|
|
|
|
|
|
2020-05-20 16:18:39 +08:00
|
|
|
|
```bash
|
2020-03-03 13:24:32 +08:00
|
|
|
|
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" \
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
需要仔细注意:
|
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
使用 modinfo 可查看编译出来的 ko 文件对应的内核版本号
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
使用 uname 或者 cat /proc/version 可在目标系统上查看内核版本号。
|
2020-03-03 13:24:32 +08:00
|
|
|
|
|
2020-05-09 18:08:07 +08:00
|
|
|
|
可查看 kernel 编译过程生成的文件: include/generated/utsrelease.h ,确定编译出来的内核的版本号。
|