d003e0d7fe
This contains many small bugfixes and documentation improvements. Sponsored by: The FreeBSD Foundation
114 lines
2.8 KiB
Bash
Executable File
114 lines
2.8 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# This script generates a project-wide version identifier for use by
|
|
# the `elftc_version()' API.
|
|
#
|
|
# $Id: make-toolchain-version 3731 2019-04-06 14:28:34Z 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
|
|
}
|
|
|
|
# Determine the revision number for the source tree.
|
|
#
|
|
# - If CVS is detected, we use the string `unknown'.
|
|
# - If SVN is detected, we use the `svninfo' tool to determine the
|
|
# in-tree revision number.
|
|
# - Otherwise, we use `git --describe'.
|
|
get_revision_string()
|
|
{
|
|
v="unknown:unknown"
|
|
if [ -d CVS ]; then # Look for CVS (NetBSD).
|
|
v="cvs:unknown"
|
|
elif [ -d .svn ]; then # An SVN checkout (SourceForge or FreeBSD).
|
|
svnversion="$(svnversion 2>/dev/null)"
|
|
if [ -n "${svnversion}" ]; then
|
|
v="svn:${svnversion}"
|
|
fi
|
|
else # Try git (DragonflyBSD).
|
|
gitversion="$(git describe --all --dirty --long 2> /dev/null)"
|
|
if [ -n "${gitversion}" ]; then
|
|
v="git:${gitversion}"
|
|
fi
|
|
fi
|
|
|
|
echo "${v}"
|
|
}
|
|
|
|
#
|
|
# 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
|
|
|
|
curdir=`pwd`
|
|
cd ${top} || usage "ERROR: Cannot change directory to \"${top}\"."
|
|
|
|
# Determine the in-tree revision number.
|
|
versionstring="$(get_revision_string)" || {
|
|
echo "ERROR: cannot determine a revision number." 1>&2;
|
|
exit 1
|
|
}
|
|
|
|
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
|