因为一些问题,研究下kernel.release的产生机制,实际上就是shell下的uname –r.
1. uname -r
2.6.36.4brcmarm+
2.6.36.4 这个好说,主Makefile定义的版本号和补丁号
brcmarm哪来的?
2. grep -rn "brcmarm"
--exclude=*.o
在内核编译后,找到include/config/kernel.release,这个目录在未编译的内核中是不存在的,所以肯定是编译过程中生成的
3. 再查发现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))"
> $@
setlocalversion这个脚本肯定是起关键作用的
4. 版本release
-
# CONFIG_LOCALVERSION and LOCALVERSION (if set)
-
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
-
-
# 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
-
echo "scm_version=${scm_version}" >&2
-
echo "scm=$(scm_version --short)" >&2
-
scm=$(scm_version --short)
-
res="$res${scm:++}"
-
fi
-
fi
CONFIG_LOCALVERSION
和
CONFIG_LOCALVERSION_AUTO,看名字就知道是kernel的kconfig,打开menu从fig,果然CONFIG_LOCALVERSION被设置为了"brcmarm"
CONFIG_LOCALVERSION是直接添加到
release code(2.6.36.4)后缀的,而
LOCALVERSION实际上是内核根目录下的
localversion文件,若存在也会被添加到后缀。
还有个加号咋来的呢?
CONFIG_LOCALVERSION_AUTO = y
会从内核目录下的
.git和
.svn中自动提取出版本
ID,即为$(scm_version),添加到
kernel.release
CONFIG_LOCALVERSION_AUTO!=y
添加一个
'+'表示版本信息不完整并且
LOCALVERSION为空
阅读(3192) | 评论(1) | 转发(0) |