#!/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} < #include 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