#! /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=".:sigtool" # Relative path to protobuf sources # e.g. src/foo/a.proto Protobufs="internal/pb/hdr.proto" # -- DO NOT CHANGE ANYTHING AFTER THIS -- Z=`basename $0` PWD=`pwd` Static=0 Dryrun=0 Prodver="" Verbose=0 Go=`which go` 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 usage() { 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 Bindir=$PWD/bin/$cross Hostbindir=$PWD/bin/$hostos-$hostcpu [ -d $Bindir ] || mkdir -p $Bindir [ -d $Hostbindir ] || mkdir -p $Hostbindir # Get git/hg version info for the build if [ -d "./.hg" ]; then xrev=$(hg id --id) || exit 1 brev=${xrev%+} if [ "$brev" != "$xrev" ]; then rev="hg:${brev}-dirty" else rev="hg:${brev}" fi if [ -z "$Prodver" ]; then Prodver=$(hg log -r "branch(stable) and tag()" -T "{tags}\n" | tail -1) fi elif [ -d "./.git" ]; then xrev=$(git describe --always --dirty --long --abbrev=12) || exit 1 rev="git:$xrev" if [ -z "$Prodver" ]; then Prodver=$(git tag --list | tail -1) fi else rev="UNKNOWN-VER" echo "$0: Can't find version info" 1>&2 fi # Do Protobufs if needed if [ -n "$Protobufs" ]; then set +e slick=$Hostbindir/protoc-gen-gogoslick slicksrc=github.com/gogo/protobuf/protoc-gen-gogoslick for pc in protoc protoc-c; do pc=$(type -p $pc) [ -n "$pc" ] && break done [ -z "$pc" ] && die "Need 'protoc' for building .." slick=$(hosttool protoc-gen-gogoslick $Hostbindir $slicksrc) || exit 1 #if [ ! -f $slick ]; then # echo "Building $slick .." # $e go build -o $slick github.com/gogo/protobuf/protoc-gen-gogoslick || exit 1 #i export PATH=$PATH:$Hostbindir for f in $Protobufs; do dn=$(dirname $f) bn=$(basename $f .proto) of=$dn/${bn}.pb.go if [ $f -nt $of ]; then echo "Running $pc .." $e $pc --gogoslick_out=. $f || exit 1 fi done set -e fi repover="main.RepoVersion=$rev" prodver="main.ProductVersion=$Prodver" date="main.Buildtime=`date -u '+%Y-%m-%dT%H:%M.%SZ'`" ldflags="-ldflags \"-X $repover -X $prodver -X $date $ldflags\"" 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 echo "Building $Prodver ($rev), $cross $msg .." for p in $all; do if echo $p | grep -q ':' ; then out=${p##*:} dir=${p%%:*} else out=$p dir=$p fi echo " $dir: $out .. " $e eval $Go build $vflag -o $Bindir/$out $isuffix "$ldflags" ./$dir || exit 1 done ;; esac # vim: ft=sh:expandtab:ts=4:sw=4:tw=84: