linux/scripts/setlocalversion
<<
>>
Prefs
   1#!/bin/sh
   2# SPDX-License-Identifier: GPL-2.0
   3#
   4# This scripts adds local version information from the version
   5# control systems git, mercurial (hg) and subversion (svn).
   6#
   7# If something goes wrong, send a mail the kernel build mailinglist
   8# (see MAINTAINERS) and CC Nico Schottelius
   9# <nico-linuxsetlocalversion -at- schottelius.org>.
  10#
  11#
  12
  13usage() {
  14        echo "Usage: $0 [--save-scmversion] [srctree]" >&2
  15        exit 1
  16}
  17
  18scm_only=false
  19srctree=.
  20if test "$1" = "--save-scmversion"; then
  21        scm_only=true
  22        shift
  23fi
  24if test $# -gt 0; then
  25        srctree=$1
  26        shift
  27fi
  28if test $# -gt 0 -o ! -d "$srctree"; then
  29        usage
  30fi
  31
  32scm_version()
  33{
  34        local short
  35        short=false
  36
  37        cd "$srctree"
  38        if test -e .scmversion; then
  39                cat .scmversion
  40                return
  41        fi
  42        if test "$1" = "--short"; then
  43                short=true
  44        fi
  45
  46        # Check for git and a git repo.
  47        if test -z "$(git rev-parse --show-cdup 2>/dev/null)" &&
  48           head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
  49
  50                # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
  51                # it, because this version is defined in the top level Makefile.
  52                if [ -z "`git describe --exact-match 2>/dev/null`" ]; then
  53
  54                        # If only the short version is requested, don't bother
  55                        # running further git commands
  56                        if $short; then
  57                                echo "+"
  58                                return
  59                        fi
  60                        # If we are past a tagged commit (like
  61                        # "v2.6.30-rc5-302-g72357d5"), we pretty print it.
  62                        if atag="`git describe 2>/dev/null`"; then
  63                                echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
  64
  65                        # If we don't have a tag at all we print -g{commitish}.
  66                        else
  67                                printf '%s%s' -g $head
  68                        fi
  69                fi
  70
  71                # Is this git on svn?
  72                if git config --get svn-remote.svn.url >/dev/null; then
  73                        printf -- '-svn%s' "`git svn find-rev $head`"
  74                fi
  75
  76                # Check for uncommitted changes
  77                if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then
  78                        printf '%s' -dirty
  79                fi
  80
  81                # All done with git
  82                return
  83        fi
  84
  85        # Check for mercurial and a mercurial repo.
  86        if test -d .hg && hgid=`hg id 2>/dev/null`; then
  87                # Do we have an tagged version?  If so, latesttagdistance == 1
  88                if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then
  89                        id=`hg log -r . --template '{latesttag}'`
  90                        printf '%s%s' -hg "$id"
  91                else
  92                        tag=`printf '%s' "$hgid" | cut -d' ' -f2`
  93                        if [ -z "$tag" -o "$tag" = tip ]; then
  94                                id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
  95                                printf '%s%s' -hg "$id"
  96                        fi
  97                fi
  98
  99                # Are there uncommitted changes?
 100                # These are represented by + after the changeset id.
 101                case "$hgid" in
 102                        *+|*+\ *) printf '%s' -dirty ;;
 103                esac
 104
 105                # All done with mercurial
 106                return
 107        fi
 108
 109        # Check for svn and a svn repo.
 110        if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then
 111                rev=`echo $rev | awk '{print $NF}'`
 112                printf -- '-svn%s' "$rev"
 113
 114                # All done with svn
 115                return
 116        fi
 117}
 118
 119collect_files()
 120{
 121        local file res
 122
 123        for file; do
 124                case "$file" in
 125                *\~*)
 126                        continue
 127                        ;;
 128                esac
 129                if test -e "$file"; then
 130                        res="$res$(cat "$file")"
 131                fi
 132        done
 133        echo "$res"
 134}
 135
 136if $scm_only; then
 137        if test ! -e .scmversion; then
 138                res=$(scm_version)
 139                echo "$res" >.scmversion
 140        fi
 141        exit
 142fi
 143
 144if test -e include/config/auto.conf; then
 145        . include/config/auto.conf
 146else
 147        echo "Error: kernelrelease not valid - run 'make prepare' to update it" >&2
 148        exit 1
 149fi
 150
 151# localversion* files in the build and source directory
 152res="$(collect_files localversion*)"
 153if test ! "$srctree" -ef .; then
 154        res="$res$(collect_files "$srctree"/localversion*)"
 155fi
 156
 157# CONFIG_LOCALVERSION and LOCALVERSION (if set)
 158res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
 159
 160# scm version string if not at a tagged commit
 161if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
 162        # full scm version string
 163        res="$res$(scm_version)"
 164else
 165        # append a plus sign if the repository is not in a clean
 166        # annotated or signed tagged state (as git describe only
 167        # looks at signed or annotated tags - git tag -a/-s) and
 168        # LOCALVERSION= is not specified
 169        if test "${LOCALVERSION+set}" != "set"; then
 170                scm=$(scm_version --short)
 171                res="$res${scm:++}"
 172        fi
 173fi
 174
 175echo "$res"
 176