Files
OpenCellular/util/getversion.sh
Bill Richardson 30f978d9c1 Cr50: Flag unofficial images in the version string
We often find it handy to build test images that are unlocked or
have special powers. To avoid confusing these with production
images, this adds a "DEV/" to the version string:

"make BOARD=cr50" looks like this:

  > version
  Chip:    g cr50 B2
  Board:   0
  RO_A:  * 0.0.9/0088a3eb
  RO_B:    0.0.8/710d4375
  RW_A:  * 0.0.6/cr50_v1.1.5261-4848d7e
  RW_B:    0.0.6/cr50_v1.1.5261-4848d7e
  [...]

"CR50_DEV=1 make BOARD=cr50" looks like this:

  > version
  Chip:    g cr50 B2
  Board:   0
  RO_A:  * 0.0.9/0088a3eb
  RO_B:    0.0.8/710d4375
  RW_A:    0.0.6/cr50_v1.1.5261-4848d7e
  RW_B:  * 0.0.6/DEV/cr50_v1.1.5261-4848d7e
  [...]

BUG=chrome-os-partner:55557
BRANCH=none
TEST=make buildall; also..

Build both with and without the CR50_DEV=1 environment variable.
Observe that the version string differs even if nothing else
does.

Change-Id: Ifee9fbf922c2bbb40a1a9d0a716d2d11aa0d3ec2
Signed-off-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/382851
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
2016-09-08 11:22:30 -07:00

127 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
#
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Generate version information for the EC binary
# Use this symbol as a separator to be able to reliably concatenate strings of
# text.
dc=$'\001'
# Default marker to indicate 'dirty' repositories
dirty_marker='-dirty'
# This function examines the state of the current directory and attempts to
# extract its version information: the latest tag, if any, how many patches
# are there since the latest tag, the top sha1, and if there are local
# modifications.
#
# Local modifications are reported by concatenating the revision string and
# the string '-dirty' using the $dc symbol as the separator.
#
# If there is no tags defined in this git repository, the base version is
# considered to be 0.0.
#
# If current directory is not a git depository, this function prints out
# "no_version"
get_tree_version() {
local dirty
local ghash
local numcommits
local tag
local vbase
local ver_branch
local ver_major
if ghash=`git rev-parse --short --verify HEAD 2>/dev/null`; then
if gdesc=`git describe --dirty --match='v*' 2>/dev/null`; then
IFS="-" fields=($gdesc)
tag="${fields[0]}"
IFS="." vernum=($tag)
numcommits=$((${vernum[2]}+${fields[1]:-0}))
ver_major="${vernum[0]}"
ver_branch="${vernum[1]}"
else
numcommits=`git rev-list HEAD | wc -l`
ver_major="v0"
ver_branch="0"
fi
# avoid putting the -dirty attribute if only the timestamp
# changed
git status > /dev/null 2>&1
if [ -n "$(git diff-index --name-only HEAD 2>/dev/null)" ]; then
dirty="${dirty_marker}"
fi
vbase="${ver_major}.${ver_branch}.${numcommits}-${ghash}${dirty}"
else
# Fall back to the VCSID provided by the packaging system if available.
if ghash=${VCSID##*-}; then
vbase="1.1.9999-${ghash:0:7}"
else
# then ultimately fails to "no_version"
vbase="no_version"
fi
fi
echo "${vbase}${dc}${dirty}"
}
IFS="${dc}"
ver="${CR50_DEV:+DEV/}${BOARD}_"
global_dirty= # set if any of the component repos is 'dirty'.
dir_list=( . ) # list of component directories, always includes the EC tree
case "${BOARD}" in
(cr50)
# cr50 includes sources from 4 different git trees. Shortened 'dirty' tree
# marker allows to keep the summary version string shorter.
dirty_marker='+'
dir_list+=( private-cr51 ../../third_party/tpm2 ../../third_party/cryptoc )
;;
esac
# Create a combined version string for all component directories.
for git_dir in ${dir_list[@]}; do
pushd "${git_dir}" > /dev/null
component="$(basename "${git_dir}")"
values=( $(get_tree_version) )
vbase="${values[0]}" # Retrieved version information.
global_dirty+="${values[1]}" # Non-zero, if the repository is 'dirty'
if [ "${component}" != "." ]; then
ver+=" ${component}:"
fi
ver+="${vbase}"
popd > /dev/null
done
# On some boards where the version number consists of multiple components we
# want to separate the first word of the version string as the version of the
# EC tree.
IFS=' ' first_word=(${ver})
echo "/* This file is generated by util/getversion.sh */"
echo "/* Version string for use by common/version.c */"
echo "#define CROS_EC_VERSION \"${ver}\""
echo "/* Version string, truncated to 31 chars (+ terminating null = 32) */"
echo "#define CROS_EC_VERSION32 \"${first_word:0:31}\""
echo "/* Sub-fields for use in Makefile.rules and to form build info string"
echo " * in common/version.c. */"
echo "#define VERSION \"${ver}\""
echo "#define BUILDER \"${USER}@`hostname`\""
if [ -n "$global_dirty" ]; then
echo "/* Repo is dirty, using time of last compilation */"
echo "#define DATE \"$(date '+%F %T')\""
else
echo "/* Repo is clean, use the commit date of the last commit */"
gitdate=$(git log -1 --format='%ci' HEAD | cut -d ' ' -f '1 2')
echo "#define DATE \"${gitdate}\""
fi