1260684Skaiw#!/bin/sh
2260684Skaiw#
3260684Skaiw# This script generates a project-wide version identifier for use by
4260684Skaiw# the `elftc_version()' API.
5260684Skaiw#
6300311Semaste# $Id: make-toolchain-version 3414 2016-02-16 22:55:28Z jkoshy $
7260684Skaiw
8260684Skaiw#
9260684Skaiw# Defaults.
10260684Skaiw#
11260684Skaiwbuildhost=`uname -s`
12260684Skaiwelftcname="elftoolchain"
13260684Skaiwoptions="e:h:o:r:t:"
14260684Skaiwtop=""
15260684Skaiwversion="HEAD"
16260684Skaiwversionfile="elftc_version.c"
17260684Skaiwprogname=`basename ${0}`
18260684Skaiw
19260684Skaiwusage()
20260684Skaiw{
21260684Skaiw    exec >&2
22260684Skaiw
23260684Skaiw    # Print a message, if supplied.
24260684Skaiw    if [ -n "${*}" ]; then echo "##${@}"; fi
25260684Skaiw
26260684Skaiw    echo "Usage: ${progname} [options]"
27260684Skaiw    echo "	Generate a toolchain-wide version number"
28260684Skaiw    echo "	-e PROJECTNAME Set the project name [default: ${elftcname}]."
29260684Skaiw    echo "	-h HOSTOS      Set the build OS [default: ${buildhost}]."
30260684Skaiw    echo "	-o OUTPUT      Set the output file [default: ${versionfile}]."
31260684Skaiw    echo "	-r VERSION     Set the version string [default: ${version}]."
32260684Skaiw    echo "	-t TOPDIR      Set the top-of-tree directory [required]."
33260684Skaiw    exit 1
34260684Skaiw}
35260684Skaiw
36260684Skaiw#
37260684Skaiw# Parse options.
38260684Skaiw#
39260684Skaiw
40260684Skaiwwhile getopts ${options} option
41260684Skaiwdo
42260684Skaiw    case ${option} in
43260684Skaiw	'e') elftcname="${OPTARG}"   ;;
44260684Skaiw	'h') buildhost="${OPTARG}"   ;;
45260684Skaiw	'o') versionfile="${OPTARG}" ;;
46260684Skaiw	'r') version="${OPTARG}"      ;;
47260684Skaiw	't') top="${OPTARG}"         ;;
48260684Skaiw	'?') usage                   ;;
49260684Skaiw    esac
50260684Skaiwdone
51260684Skaiw
52260684Skaiw[ -n "${top}" ] || usage
53260684Skaiw
54260684Skaiw# Try to determine the in-tree revision number.
55260684Skaiw#
56260684Skaiw# This script attempts to handle the case where our sources have been
57260684Skaiw# incorporated into an operating system's base sources.
58260684Skaiw#
59260684Skaiw# - If SVN is detected, we use the `svninfo' tool to determine the
60260684Skaiw#   in-tree revision number.
61260684Skaiw# - If CVS is detected, we use the string `unknown'.
62260684Skaiw# - Otherwise, we use `git --describe'.
63260684Skaiw
64260684Skaiwcurdir=`pwd`
65260684Skaiwcd ${top} || usage "ERROR: Cannot change directory to \"${top}\"."
66260684Skaiw
67300311Semasteif [ -d CVS ]; then		# Look for CVS (NetBSD).
68260684Skaiw    versionstring=" cvs:unknown"
69300311Semasteelse				# Try git (DragonFlyBSD).
70300311Semaste    gitversion="$(git describe --all --dirty --long 2> /dev/null)"
71300311Semaste    if [ -n "${gitversion}" ]; then
72300311Semaste        versionstring=" git:${gitversion}"
73300311Semaste    else   # Assume an SVN checkout (SourceForge or FreeBSD).
74300311Semaste        svnversion="$(svnversion)"
75300311Semaste        if [ -n "${svnversion}" ]; then
76300311Semaste	    versionstring=" svn:$(svnversion)"
77300311Semaste        fi
78260684Skaiw    fi
79260684Skaiwfi
80260684Skaiw
81300311Semasteif [ -z "${versionstring}" ]; then
82300311Semaste    echo "ERROR: cannot determine a revision number." 1>&2
83300311Semaste    exit 1
84300311Semastefi
85300311Semaste
86260684Skaiwcd ${curdir} || usage "Cannot change back to ${curdir}."
87260684Skaiw
88260684Skaiw#
89260684Skaiw# Only replace the source file if its content has changed.
90260684Skaiw#
91260684Skaiwtmpfile=`mktemp ${TMPDIR:-/tmp}/MV.XXXXXXX`
92260684Skaiwtrap "rm -f ${tmpfile};" 0 1 2 3 15
93260684Skaiw
94260684Skaiwcat > ${tmpfile} <<EOF
95260684Skaiw/* WARNING: Generated by "${progname}". */
96260684Skaiw
97260684Skaiw#include <sys/types.h>
98260684Skaiw#include <libelftc.h>
99260684Skaiw
100260684Skaiwconst char *
101260684Skaiwelftc_version(void)
102260684Skaiw{
103260684Skaiw	return "${elftcname} ${version} ${buildhost}${versionstring}";
104260684Skaiw}
105260684SkaiwEOF
106260684Skaiw
107260684Skaiwif ! cmp -s ${tmpfile} ${versionfile}; then
108260684Skaiw    echo "@ ${progname}: building \"${versionfile}\"."
109260684Skaiw    cp ${tmpfile} ${versionfile} || exit ${?}
110260684Skaiwfi
111