#! /usr/bin/env bash # Tool to build go programs in this repo # # - it tacks on a version number for use by the individual tools # - it supports git and mercurial version# # # NB: # o the attempt at decoding dirty repo state for mercurial is # borked. It doesn't know about untracked files # # (c) 2016 Sudhi Herle # # License: GPLv2 # Progs="src:sigtool" # Relative path to protobuf sources # e.g. src/foo/a.proto Protobufs="internal/pb/hdr.proto" #set -x # -- DO NOT CHANGE ANYTHING AFTER THIS -- Z=`basename $0` PWD=`pwd` Static=0 Dryrun=0 Prodver="" Repover="" Verbose=0 Go=`which go` Bindir=$PWD/bin die() { echo "$Z: $@" 1>&2 exit 0 } warn() { echo "$Z: $@" 1>&2 } case $BASH_VERSION in 4.*|5.*) ;; *) die "I need bash 4.x to run!" ;; esac getvcs_version() { local rev= local prodv= local git=`which git` local hg=`which hg` if [ -n "$git" ]; then local xrev=$(git describe --always --dirty --long --abbrev=12) || exit 1 rev="git:$xrev" prodv=$(git tag --list | sort -V | tail -1) elif [ -n "$hg" ]; then local xrev=$(hg id --id) || exit 1 local brev=${xrev%+} if [ "$brev" != "$xrev" ]; then rev="hg:${brev}-dirty" else rev="hg:${brev}" fi prodv=$(hg log -r "branch(stable) and tag()" -T "{tags}\n" | sort -V | tail -1) else warn "no git or hg found; can't get VCS info" rev="UNKNOWN-VER" fi [ -n "$Prodver" ] && prodv=$Prodver echo "$rev $prodv" return 0 } read -r Repover Prodver <<< $(getvcs_version) usage() { declare -a progv=($Progs) declare n=${#progv[@]} declare pstr= for ((i=0; i < n; i++)); do local ent=${progv[$i]} local dir=${ent%%:*} local tool=${ent##*:} pstr=$(printf "$pstr\n\t%s $Prodver $Repover (from ./%s)" $tool $dir) done cat <&2 fi else if [ $Static -gt 0 ]; then export CGO_ENABLED=0 isuffix="--installsuffix cgo" ldflags="-s" msg="statically linked" fi fi if [ $Printarch -gt 0 ]; then echo "$hostos-$hostcpu" exit 0 fi # This is where build outputs go Outdir=$Bindir/$cross Hostbindir=$Bindir/$hostos-$hostcpu export PATH=$Hostbindir:$PATH [ -d $Outdir ] || mkdir -p $Outdir [ -d $Hostbindir ] || mkdir -p $Hostbindir # Do Protobufs if needed if [ -n "$Protobufs" ]; then set +e buildproto $Protobufs set -e fi # Get git/hg version info for the build repover="main.RepoVersion=$Repover" prodver="main.ProductVersion=$Prodver" date="main.Buildtime=`date -u '+%Y-%m-%dT%H:%M.%SZ'`" ldflags="-ldflags \"-X $repover -X $prodver -X $date $ldflags -buildid=\"" vflag="" [ $Verbose -gt 0 ] && vflag="-v" case $Tool in test) set -- $args $e $Go test $vflag "$@" ;; vet) set -- $args $e $Go vet $vflag "$@" ;; mod) set -- $args $e $Go mod $vflag "$@" ;; *) # Default is to build programs set -- $args if [ -z "$1" ]; then all=$Progs else all="$@" fi [ -z "$all" ] && die "No programs specified. Try '$Z --help'" echo "Building $Prodver ($Repover), $cross $msg .." for p in $all; do if echo $p | grep -q ':' ; then out=${p##*:} dir=${p%%:*} else out=$p dir=$p fi # Add .exe suffix to out if needed if [ "$GOOS" = "windows" ]; then base=${out%%.exe} out="${base}.exe" fi echo " $dir: $out .. " $e eval $Go build $vflag -trimpath -o $Outdir/$out $isuffix "$ldflags" ./$dir || exit 1 done ;; esac # vim: ft=sh:expandtab:ts=4:sw=4:tw=84: