How to properly use build tags?

Doug picture Doug · Mar 5, 2013 · Viewed 22.9k times · Source

I need to be able to build different versions of a go application; a 'debug' version and a normal version.

This is easy to do; I simply have a const DEBUG, that controls the behaviour of the application, but it's annoying to have to edit the config file every time I need to swap between build types.

I was reading about go build (http://golang.org/pkg/go/build/) and tags, I thought perhaps I could do this:

config.go:

// +build !debug
package build
const DEBUG = false

config.debug.go:

// +build debug
package build
const DEBUG = true

Then I should be able to build using go build or go build -tags debug, and the tags should exclude config.go and include config.debug.go.

...but this doesn't work. I get:

src/build/config.go:3: DEBUG redeclared in this block (<0>) previous declaration at src/build/config.debug.go:3

What am I doing wrong?

Is there another and more appropriate #ifdef style way of doing this I should be using?

Answer

axw picture axw · Mar 5, 2013

See my answer to another question. You need a blank line after the // +build line.

Also, you probably want the ! in config.go, not in config.debug.go; and presumably you want one to be "DEBUG = false".