Linux-笔记 全志平台镜像中添加git提交号

2024-06-12 02:04

本文主要是介绍Linux-笔记 全志平台镜像中添加git提交号,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引言

        通过在镜像中某个位置添加git提交号,可以方便排查与追溯是哪个提交编译出来的。 这里使用的全志T113平台,SDK为Tina5.0。

实现的办法有:

1、内核/proc/cpuinfo的打印信息及设备树中查看提交号

2、从设备树查看提交号

3、从uboot启动版本号查看提交号

实现:
内核/proc/cpuinfo查看提交号

        1、添加打印函数

        前面说到可以通过cpuinfo去查看git提交号,cpuinfo的实现函数位于 <SDK>/kernel/linux-5.4/arch/arm/kernel/setup.c 中的c_show函数,我们想要打印的信息可以放到函数里面去,如下图所示,添加了一行打印提交号。

static int c_show(struct seq_file *m, void *v)
{  char mac_eth[20] = {0};char name[20] = {0};int i, j;u32 cpuid;seq_printf(m, "Version: %s\n", GIT_COMMIT_INFO);	// 打印提交号for_each_online_cpu(i) {//省略}get_custom_mac_address(1, name, mac_eth);seq_printf(m, "Hardware\t: %s\n", machine_name);seq_printf(m, "Revision\t: %04x\n", system_rev);seq_printf(m, "Serial\t\t: %s\n", tqserialnum);seq_printf(m, "Mac\t\t: %s\n", macnum);return 0;
}

        GIT_COMMIT_INFO是一个宏,使用宏的原因是因为如果一直有新的提交,那这个提交号就需要修改,源码修改了必定会产生新的提交和提交号,就会一直无法对应提交号,将宏定义在一个被git忽略的头文件内,编译就自动获取提交号并生成头文件以解决问题。

        2、获取提交号

        git提交号是在<sdk>/kernel/linux-5.4/scriptsscripts/setlocalversion中获取的,由顶层makefile调用,生成内核版本号,我们可以利用源码脚本来实现我们的目的,该函数会判断是否使用git进行版本控制,如果是会输出提交号,反之为空,我们主要关注脚本内的scm_version()函数即可。

scm_version()
{local shortshort=falsecd "$srctree"if test -e .scmversion; thencat .scmversionreturnfiif test "$1" = "--short"; thenshort=truefi# Check for git and a git repo.if test -z "$(git rev-parse --show-cdup 2>/dev/null)" &&head=`git rev-parse --verify --short HEAD 2>/dev/null`; thenif [ -n "$android_release" ] && [ -n "$kmi_generation" ]; thenprintf '%s' "-$android_release-$kmi_generation"fi# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore# it, because this version is defined in the top level Makefile.if [ -z "`git describe --exact-match 2>/dev/null`" ]; then# If only the short version is requested, don't bother# running further git commandsif $short; thenecho "+"returnfi# If we are past a tagged commit (like# "v2.6.30-rc5-302-g72357d5"), we pretty print it.if atag="`git describe 2>/dev/null`"; thenecho "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'# If we don't have a tag at all we print -g{commitish}.elseprintf '%s%s' -g $headfifi# Is this git on svn?if git config --get svn-remote.svn.url >/dev/null; thenprintf -- '-svn%s' "`git svn find-rev $head`"fi# Check for uncommitted changes.# First, with git-status, but --no-optional-locks is only# supported in git >= 2.14, so fall back to git-diff-index if# it fails. Note that git-diff-index does not refresh the# index, so it may give misleading results. See# git-update-index(1), git-diff-index(1), and git-status(1).if {git --no-optional-locks status -uno --porcelain 2>/dev/null ||git diff-index --name-only HEAD} | grep -qvE '^(.. )?scripts/package'; thenprintf '%s' -dirtyfi# All done with gitreturnfi# Check for mercurial and a mercurial repo.if test -d .hg && hgid=`hg id 2>/dev/null`; then# Do we have an tagged version?  If so, latesttagdistance == 1if [ "`hg log -r . --template '{latesttagdistance}'`" = "1" ]; thenid=`hg log -r . --template '{latesttag}'`printf '%s%s' -hg "$id"elsetag=`printf '%s' "$hgid" | cut -d' ' -f2`if [ -z "$tag" -o "$tag" = tip ]; thenid=`printf '%s' "$hgid" | sed 's/[+ ].*//'`printf '%s%s' -hg "$id"fifi# Are there uncommitted changes?# These are represented by + after the changeset id.case "$hgid" in*+|*+\ *) printf '%s' -dirty ;;esac# All done with mercurialreturnfi# Check for svn and a svn repo.if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; thenrev=`echo $rev | awk '{print $NF}'`printf -- '-svn%s' "$rev"# All done with svnreturnfi
}

        可以看到函数内其实最关键是”git rev-parse --verify --short HEAD“这条命令,它可以直接获取提交号。

        但是为了能够做其他处理,我们不修改源码,新建一个scripts/scm_version.sh脚本文件,把整个函数复制进去,并添加一些脚本用于获取提交号并做相应的处理,给出完整脚本:

#!/bin/bashINFO_DIR=../../../../kernel/linux-5.4/include/dt-bindings/cpuinfo.lstscm_version()
{local shortshort=falsecd "$srctree"if test -e .scmversion; thencat .scmversion       returnfiif test "$1" = "--short"; thenshort=truefi# Check for git and a git repo.if   head=`git rev-parse --verify --short HEAD 2>/dev/null`; thenif [ -n "$android_release" ] && [ -n "$kmi_generation" ]; thenprintf '%s' "-$android_release-$kmi_generation"fi# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore# it, because this version is defined in the top level Makefile.if [ -z "`git describe --exact-match 2>/dev/null`" ]; then# If only the short version is requested, don't bother# running further git commandsif $short; then# echo "+"returnfi# If we are past a tagged commit (like# "v2.6.30-rc5-302-g72357d5"), we pretty print it.if atag="`git describe 2>/dev/null`"; thenecho "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'# If we don't have a tag at all we print -g{commitish}.elseprintf '%s%s' -g $headfifi# Is this git on svn?if git config --get svn-remote.svn.url >/dev/null; thenprintf -- '-svn%s' "`git svn find-rev $head`"fi# Check for uncommitted changes.# First, with git-status, but --no-optional-locks is only# supported in git >= 2.14, so fall back to git-diff-index if# it fails. Note that git-diff-index does not refresh the# index, so it may give misleading results. See# git-update-index(1), git-diff-index(1), and git-status(1).if {git --no-optional-locks status -uno --porcelain 2>/dev/null ||git diff-index --name-only HEAD} | read dummy; thenprintf '%s' -dirtyfi# All done with gitreturnfi# Check for mercurial and a mercurial repo.if test -d .hg && hgid=`hg id 2>/dev/null`; then# Do we have an tagged version?  If so, latesttagdistance == 1if [ "`hg log -r . --template '{latesttagdistance}'`" = "1" ]; thenid=`hg log -r . --template '{latesttag}'`printf '%s%s' -hg "$id"elsetag=`printf '%s' "$hgid" | cut -d' ' -f2`if [ -z "$tag" -o "$tag" = tip ]; thenid=`printf '%s' "$hgid" | sed 's/[+ ].*//'`printf '%s%s' -hg "$id"fifi# Are there uncommitted changes?# These are represented by + after the changeset id.case "$hgid" in*+|*+\ *) printf '%s' -dirty ;;esac# All done with mercurialreturnfi# Check for svn and a svn repo.if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; thenrev=`echo $rev | awk '{print $NF}'`printf -- '-svn%s' "$rev"# All done with svnreturnfi
}commit_info="$(scm_version)"
if test -z "${commit_info}" ; then
cat <<EOM >${INFO_DIR}
#define GIT_COMMIT_INFO "null"
EOMelse
cat <<EOM >${INFO_DIR}
#define GIT_COMMIT_INFO "${commit_info}"
EOM
fi

解析:

这里做了两处修改,一是原本判断用户必须保证执行编译时环境路径处于仓库的根目录下。这句if判断其实只需要帮我确认内核源码存在于git仓库下即可,所以去掉第一个条件。

二是+号是我们不要的

//这里主要定义生成的提交号文件路径,使用头文件用*.lst做后缀是默认git会忽略这个后缀的文件,如果没有忽略就自行加入忽略文件即可
INFO_DIR=../../../../kernel/linux-5.4/include/dt-bindings/cpuinfo.lst//获取提交号
commit_info="$(scm_version)"//这行代码使用了cat命令结合<<和一个标记(这里是EOM,可自定义)来创建一个临时的文件输出,然后重定向到${INFO_DIR}指定的文件中。这种方式可以让你在脚本中直接写入多行文本。
//简单说就是将#define GIT_COMMIT_INFO "$(scm_version)"写入到指定的文件${INFO_DIR}中
if test -z "${commit_info}" ; then
cat <<EOM >${INFO_DIR}
#define GIT_COMMIT_INFO "null"
EOMelse
cat <<EOM >${INFO_DIR}
#define GIT_COMMIT_INFO "${commit_info}"
EOM
fi

然后我们在源码的setlocalversion脚本最后添加执行我们的新创建脚本即可,内核编译会执行到我们自己创建的脚本。

最后还要在setup.c中添加提交号重定向的文件。

3、验证:

从设备树查看提交号

1、修改设备树,添加提交号, 并引入提交号重定向文件。

                

2、验证                

uboot版本号获取提交号

1、uboot设置:

CONFIG_LOCALVERSION_AUTO=y

可以用命令:make ubootrelease验证一下,如果没有就要完善一下脚本,见下。

2、完善<sdk>/brandy/brandy-2.0/u-boot-2018/scripts/setlocalversion脚本,完整版如下:

scm_version()
{local shortshort=falsecd "$srctree"if test -e .scmversion; thencat .scmversionreturnfiif test "$1" = "--short"; thenshort=truefi# Check for git and a git repo.if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore# it, because this version is defined in the top level Makefile.if [ -z "`git describe --exact-match 2>/dev/null`" ]; then# If only the short version is requested, don't bother# running further git commandsif $short; then# echo "+"returnfi# If we are past a tagged commit (like# "v2.6.30-rc5-302-g72357d5"), we pretty print it.if atag="`git describe 2>/dev/null`"; thenecho "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'# If we don't have a tag at all we print -g{commitish}.elseprintf '%s%s' -g $headfielseprintf '%s%s' -g $headfi# Is this git on svn?if git config --get svn-remote.svn.url >/dev/null; thenprintf -- '-svn%s' "`git svn find-rev $head`"fi# Check for uncommitted changesif {git --no-optional-locks status -uno --porcelain 2>/dev/null ||git diff-index --name-only HEAD} | grep -qvE '^(.. )?scripts/package'; thenprintf '%s' -dirtyfi# All done with gitreturnfi# Check for mercurial and a mercurial repo.if test -d .hg && hgid=`hg id 2>/dev/null`; then# Do we have an tagged version?  If so, latesttagdistance == 1if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; thenid=`hg log -r . --template '{latesttag}'`printf '%s%s' -hg "$id"elsetag=`printf '%s' "$hgid" | cut -d' ' -f2`if [ -z "$tag" -o "$tag" = tip ]; thenid=`printf '%s' "$hgid" | sed 's/[+ ].*//'`printf '%s%s' -hg "$id"fifi# Are there uncommitted changes?# These are represented by + after the changeset id.case "$hgid" in*+|*+\ *) printf '%s' -dirty ;;esac# All done with mercurialreturnfi# Check for svn and a svn repo.if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; thenrev=`echo $rev | awk '{print $NF}'`printf -- '-svn%s' "$rev"# All done with svnreturnfi
}

验证:

这篇关于Linux-笔记 全志平台镜像中添加git提交号的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1052892

相关文章

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影