summaryrefslogtreecommitdiff
path: root/libelftc/make-toolchain-version
diff options
context:
space:
mode:
Diffstat (limited to 'libelftc/make-toolchain-version')
-rwxr-xr-xlibelftc/make-toolchain-version104
1 files changed, 104 insertions, 0 deletions
diff --git a/libelftc/make-toolchain-version b/libelftc/make-toolchain-version
new file mode 100755
index 0000000000000..ac6155a49a006
--- /dev/null
+++ b/libelftc/make-toolchain-version
@@ -0,0 +1,104 @@
+#!/bin/sh
+#
+# This script generates a project-wide version identifier for use by
+# the `elftc_version()' API.
+#
+# $Id: make-toolchain-version 2583 2012-09-14 09:49:25Z jkoshy $
+
+#
+# Defaults.
+#
+buildhost=`uname -s`
+elftcname="elftoolchain"
+options="e:h:o:r:t:"
+top=""
+version="HEAD"
+versionfile="elftc_version.c"
+progname=`basename ${0}`
+
+usage()
+{
+ exec >&2
+
+ # Print a message, if supplied.
+ if [ -n "${*}" ]; then echo "##${@}"; fi
+
+ echo "Usage: ${progname} [options]"
+ echo " Generate a toolchain-wide version number"
+ echo " -e PROJECTNAME Set the project name [default: ${elftcname}]."
+ echo " -h HOSTOS Set the build OS [default: ${buildhost}]."
+ echo " -o OUTPUT Set the output file [default: ${versionfile}]."
+ echo " -r VERSION Set the version string [default: ${version}]."
+ echo " -t TOPDIR Set the top-of-tree directory [required]."
+ exit 1
+}
+
+#
+# Parse options.
+#
+
+while getopts ${options} option
+do
+ case ${option} in
+ 'e') elftcname="${OPTARG}" ;;
+ 'h') buildhost="${OPTARG}" ;;
+ 'o') versionfile="${OPTARG}" ;;
+ 'r') version="${OPTARG}" ;;
+ 't') top="${OPTARG}" ;;
+ '?') usage ;;
+ esac
+done
+
+[ -n "${top}" ] || usage
+
+# Try to determine the in-tree revision number.
+#
+# This script attempts to handle the case where our sources have been
+# incorporated into an operating system's base sources.
+#
+# - If SVN is detected, we use the `svninfo' tool to determine the
+# in-tree revision number.
+# - If CVS is detected, we use the string `unknown'.
+# - Otherwise, we use `git --describe'.
+
+curdir=`pwd`
+cd ${top} || usage "ERROR: Cannot change directory to \"${top}\"."
+
+if [ -d .svn ]; then # FreeBSD and SF.Net sources.
+ versionstring=" svn:"$(svnversion)
+elif [ -d CVS ]; then # NetBSD.
+ versionstring=" cvs:unknown"
+else # DragonFlyBSD.
+ versionstring=" git:"$(git describe --all --dirty --long 2> /dev/null)
+
+ # Cannot determine an in-tree version number.
+ if [ $? -ne 0 ]; then
+ versionstring=""
+ fi
+fi
+
+cd ${curdir} || usage "Cannot change back to ${curdir}."
+
+#
+# Only replace the source file if its content has changed.
+#
+tmpfile=`mktemp ${TMPDIR:-/tmp}/MV.XXXXXXX`
+trap "rm -f ${tmpfile};" 0 1 2 3 15
+
+cat > ${tmpfile} <<EOF
+/* WARNING: Generated by "${progname}". */
+
+#include <sys/types.h>
+#include <libelftc.h>
+
+const char *
+elftc_version(void)
+{
+ return "${elftcname} ${version} ${buildhost}${versionstring}";
+}
+EOF
+
+if ! cmp -s ${tmpfile} ${versionfile}; then
+ echo "@ ${progname}: building \"${versionfile}\"."
+ cp ${tmpfile} ${versionfile} || exit ${?}
+fi