Skip to content

Compile-time variables

The goal is to embed the commit number, date, and tag version into the binary.

-ldflags -X

go build will accept a flag -ldflags to pass specific arguments to the linker. The link tool will accept a -X flag to set the value of an exported variable. It will only set variables, not constants. The full import path to the variable must be specified.

1
2
3
4
5
6
7
package main

var (
    BuildVersion = ""
    BuildCommit  = ""
    BuildDate    = ""
)

Using make to auto-embed

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
VERSION := $(shell git tag | grep ^v | sort -V | tail -n 1)
LDFLAGS = -ldflags "-X main.Version=${VERSION}"
TIMESTAMP := $(shell date +%Y%m%d-%H%M)
DEVLDFLAGS = -ldflags "-X main.Version=dev-${TIMESTAMP}"

SERVBIN=/tmp/versserv

dev-serv: server/*
        go build ${DEVLDFLAGS} -o ${SERVBIN} server/*.go

serv: server/*
        go build ${LDFLAGS} -o ${SERVBIN} server/*.go