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 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", $(NF-1))}'
  64                        fi
  65
  66                        # Add -g and exactly 12 hex chars.
  67                        printf '%s%s' -g "$(echo $head | cut -c1-12)"
  68                fi
  69
  70                # Check for uncommitted changes.
  71                # This script must avoid any write attempt to the source tree,
  72                # which might be read-only.
  73                # You cannot use 'git describe --dirty' because it tries to
  74                # create .git/index.lock .
  75                # First, with git-status, but --no-optional-locks is only
  76                # supported in git >= 2.14, so fall back to git-diff-index if
  77                # it fails. Note that git-diff-index does not refresh the
  78                # index, so it may give misleading results. See
  79                # git-update-index(1), git-diff-index(1), and git-status(1).
  80                if {
  81                        git --no-optional-locks status -uno --porcelain 2>/dev/null ||
  82                        git diff-index --name-only HEAD
  83                } | read dummy; then
  84                        printf '%s' -dirty
  85                fi
  86        fi
  87}
  88
  89collect_files()
  90{
  91        local file res=
  92
  93        for file; do
  94                case "$file" in
  95                *\~*)
  96                        continue
  97                        ;;
  98                esac
  99                if test -e "$file"; then
 100                        res="$res$(cat "$file")"
 101                fi
 102        done
 103        echo "$res"
 104}
 105
 106if $scm_only; then
 107        if test ! -e .scmversion; then
 108                res=$(scm_version)
 109                echo "$res" >.scmversion
 110        fi
 111        exit
 112fi
 113
 114if ! test -e include/config/auto.conf; then
 115        echo "Error: kernelrelease not valid - run 'make prepare' to update it" >&2
 116        exit 1
 117fi
 118
 119# localversion* files in the build and source directory
 120res="$(collect_files localversion*)"
 121if test ! "$srctree" -ef .; then
 122        res="$res$(collect_files "$srctree"/localversion*)"
 123fi
 124
 125# CONFIG_LOCALVERSION and LOCALVERSION (if set)
 126config_localversion=$(sed -n 's/^CONFIG_LOCALVERSION=\(.*\)$/\1/p' include/config/auto.conf)
 127res="${res}${config_localversion}${LOCALVERSION}"
 128
 129# scm version string if not at a tagged commit
 130if grep -q "^CONFIG_LOCALVERSION_AUTO=y$" include/config/auto.conf; then
 131        # full scm version string
 132        res="$res$(scm_version)"
 133elif [ "${LOCALVERSION+set}" != "set" ]; then
 134        # If the variable LOCALVERSION is not set, append a plus
 135        # sign if the repository is not in a clean annotated or
 136        # signed tagged state (as git describe only looks at signed
 137        # or annotated tags - git tag -a/-s).
 138        #
 139        # If the variable LOCALVERSION is set (including being set
 140        # to an empty string), we don't want to append a plus sign.
 141        scm=$(scm_version --short)
 142        res="$res${scm:++}"
 143fi
 144
 145echo "$res"
 146