1 #!/bin/sh 1 #!/bin/sh 2 # SPDX-License-Identifier: GPL-2.0 << 3 # 2 # 4 # This scripts adds local version information 3 # This scripts adds local version information from the version 5 # control system git. !! 4 # control systems git, mercurial (hg) and subversion (svn). 6 # 5 # 7 # If something goes wrong, send a mail the ker 6 # If something goes wrong, send a mail the kernel build mailinglist 8 # (see MAINTAINERS) and CC Nico Schottelius 7 # (see MAINTAINERS) and CC Nico Schottelius 9 # <nico-linuxsetlocalversion -at- schottelius. 8 # <nico-linuxsetlocalversion -at- schottelius.org>. 10 # 9 # 11 # 10 # 12 11 13 usage() { 12 usage() { 14 echo "Usage: $0 [--no-local] [srctree] !! 13 echo "Usage: $0 [srctree]" >&2 15 exit 1 14 exit 1 16 } 15 } 17 16 18 no_local=false !! 17 cd "${1:-.}" || usage 19 if test "$1" = "--no-local"; then << 20 no_local=true << 21 shift << 22 fi << 23 << 24 srctree=. << 25 if test $# -gt 0; then << 26 srctree=$1 << 27 shift << 28 fi << 29 if test $# -gt 0 -o ! -d "$srctree"; then << 30 usage << 31 fi << 32 << 33 scm_version() << 34 { << 35 local short=false << 36 local no_dirty=false << 37 local tag << 38 << 39 while [ $# -gt 0 ]; << 40 do << 41 case "$1" in << 42 --short) << 43 short=true;; << 44 --no-dirty) << 45 no_dirty=true;; << 46 esac << 47 shift << 48 done << 49 << 50 cd "$srctree" << 51 << 52 if test -n "$(git rev-parse --show-cdu << 53 return << 54 fi << 55 18 56 if ! head=$(git rev-parse --verify HEA !! 19 # Check for git and a git repo. 57 return !! 20 if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then 58 fi << 59 << 60 # mainline kernel: 6.2.0-rc5 -> v6. << 61 # stable kernel: 6.1.7 -> v6. << 62 version_tag=v$(echo "${KERNELVERSION}" << 63 << 64 # If a localversion* file exists, and << 65 # annotated tag exists and is an ances << 66 # it. This is the case in linux-next. << 67 tag=${file_localversion#-} << 68 desc= << 69 if [ -n "${tag}" ]; then << 70 desc=$(git describe --match=$t << 71 fi << 72 << 73 # Otherwise, if a localversion* file e << 74 # obtained by appending it to the tag << 75 # KERNELVERSION exists and is an ances << 76 # it. This is e.g. the case in linux-r << 77 if [ -z "${desc}" ] && [ -n "${file_lo << 78 tag="${version_tag}${file_loca << 79 desc=$(git describe --match=$t << 80 fi << 81 << 82 # Otherwise, default to the annotated << 83 if [ -z "${desc}" ]; then << 84 tag="${version_tag}" << 85 desc=$(git describe --match=$t << 86 fi << 87 21 88 # If we are at the tagged commit, we i !! 22 # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore it, 89 # well-defined. !! 23 # because this version is defined in the top level Makefile. 90 if [ "${tag}" != "${desc}" ]; then !! 24 if [ -z "`git describe --exact-match 2>/dev/null`" ]; then 91 !! 25 92 # If only the short version is !! 26 # If we are past a tagged commit (like "v2.6.30-rc5-302-g72357d5"), 93 # running further git commands !! 27 # we pretty print it. 94 if $short; then !! 28 if atag="`git describe 2>/dev/null`"; then 95 echo "+" !! 29 echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' 96 return !! 30 >> 31 # If we don't have a tag at all we print -g{commitish}. >> 32 else >> 33 printf '%s%s' -g $head 97 fi 34 fi 98 # If we are past the tagged co << 99 # (like 6.1.0-14595-g292a089d7 << 100 if [ -n "${desc}" ]; then << 101 echo "${desc}" | awk - << 102 fi << 103 << 104 # Add -g and exactly 12 hex ch << 105 printf '%s%s' -g "$(echo $head << 106 fi 35 fi 107 36 108 if ${no_dirty}; then !! 37 # Is this git on svn? 109 return !! 38 if git config --get svn-remote.svn.url >/dev/null; then >> 39 printf -- '-svn%s' "`git svn find-rev $head`" 110 fi 40 fi 111 41 112 # Check for uncommitted changes. !! 42 # Update index only on r/w media 113 # This script must avoid any write att !! 43 [ -w . ] && git update-index --refresh --unmerged > /dev/null 114 # might be read-only. !! 44 115 # You cannot use 'git describe --dirty !! 45 # Check for uncommitted changes 116 # .git/index.lock . !! 46 if git diff-index --name-only HEAD | grep -v "^scripts/package" \ 117 # First, with git-status, but --no-opt !! 47 | read dummy; then 118 # git >= 2.14, so fall back to git-dif << 119 # git-diff-index does not refresh the << 120 # results. << 121 # See git-update-index(1), git-diff-in << 122 if { << 123 git --no-optional-locks status << 124 git diff-index --name-only HEA << 125 } | read dummy; then << 126 printf '%s' -dirty 48 printf '%s' -dirty 127 fi 49 fi 128 } << 129 << 130 collect_files() << 131 { << 132 local file res= << 133 << 134 for file; do << 135 case "$file" in << 136 *\~*) << 137 continue << 138 ;; << 139 esac << 140 if test -e "$file"; then << 141 res="$res$(cat "$file" << 142 fi << 143 done << 144 echo "$res" << 145 } << 146 50 147 if [ -z "${KERNELVERSION}" ]; then !! 51 # All done with git 148 echo "KERNELVERSION is not set" >&2 !! 52 exit 149 exit 1 << 150 fi 53 fi 151 54 152 # localversion* files in the build and source !! 55 # Check for mercurial and a mercurial repo. 153 file_localversion="$(collect_files localversio !! 56 if hgid=`hg id 2>/dev/null`; then 154 if test ! "$srctree" -ef .; then !! 57 tag=`printf '%s' "$hgid" | cut -d' ' -f2` 155 file_localversion="${file_localversion << 156 fi << 157 58 158 if ${no_local}; then !! 59 # Do we have an untagged version? 159 echo "${KERNELVERSION}$(scm_version -- !! 60 if [ -z "$tag" -o "$tag" = tip ]; then 160 exit 0 !! 61 id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` 161 fi !! 62 printf '%s%s' -hg "$id" >> 63 fi 162 64 163 if ! test -e include/config/auto.conf; then !! 65 # Are there uncommitted changes? 164 echo "Error: kernelrelease not valid - !! 66 # These are represented by + after the changeset id. 165 exit 1 !! 67 case "$hgid" in >> 68 *+|*+\ *) printf '%s' -dirty ;; >> 69 esac >> 70 >> 71 # All done with mercurial >> 72 exit 166 fi 73 fi 167 74 168 # version string from CONFIG_LOCALVERSION !! 75 # Check for svn and a svn repo. 169 config_localversion=$(sed -n 's/^CONFIG_LOCALV !! 76 if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then >> 77 rev=`echo $rev | awk '{print $NF}'` >> 78 printf -- '-svn%s' "$rev" 170 79 171 # scm version string if not at the kernel vers !! 80 # All done with svn 172 if grep -q "^CONFIG_LOCALVERSION_AUTO=y$" incl !! 81 exit 173 # full scm version string << 174 scm_version="$(scm_version)" << 175 elif [ "${LOCALVERSION+set}" != "set" ]; then << 176 # If the variable LOCALVERSION is not << 177 # sign if the repository is not in a c << 178 # signed tagged state (as git describe << 179 # or annotated tags - git tag -a/-s). << 180 # << 181 # If the variable LOCALVERSION is set << 182 # to an empty string), we don't want t << 183 scm_version="$(scm_version --short)" << 184 fi 82 fi 185 << 186 echo "${KERNELVERSION}${file_localversion}${co <<
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.