github.com/teknogeek/dnscontrol/v2@v2.10.1-0.20200227202244-ae299b55ba42/build/build.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"fmt"
     6  	"log"
     7  	"os"
     8  	"os/exec"
     9  	"strings"
    10  	"time"
    11  )
    12  
    13  var sha = flag.String("sha", "", "SHA of current commit")
    14  
    15  var goos = flag.String("os", "", "OS to build (linux, windows, or darwin) Defaults to all.")
    16  
    17  func main() {
    18  	flag.Parse()
    19  	flags := fmt.Sprintf(`-s -w -X main.SHA="%s" -X main.BuildTime=%d`, getVersion(), time.Now().Unix())
    20  	pkg := "github.com/StackExchange/dnscontrol/v2"
    21  
    22  	build := func(out, goos string) {
    23  		log.Printf("Building %s", out)
    24  		cmd := exec.Command("go", "build", "-o", out, "-ldflags", flags, pkg)
    25  		os.Setenv("GOOS", goos)
    26  		os.Setenv("GO111MODULE", "on")
    27  		cmd.Stderr = os.Stderr
    28  		cmd.Stdout = os.Stdout
    29  		err := cmd.Run()
    30  		if err != nil {
    31  			log.Fatal(err)
    32  		}
    33  	}
    34  
    35  	for _, env := range []struct {
    36  		binary, goos string
    37  	}{
    38  		{"dnscontrol-Linux", "linux"},
    39  		{"dnscontrol.exe", "windows"},
    40  		{"dnscontrol-Darwin", "darwin"},
    41  	} {
    42  		if *goos == "" || *goos == env.goos {
    43  			build(env.binary, env.goos)
    44  		}
    45  	}
    46  }
    47  
    48  func getVersion() string {
    49  	if *sha != "" {
    50  		return *sha
    51  	}
    52  	// check teamcity build version
    53  	if v := os.Getenv("BUILD_VCS_NUMBER"); v != "" {
    54  		return v
    55  	}
    56  	// check git
    57  	cmd := exec.Command("git", "rev-parse", "HEAD")
    58  	v, err := cmd.CombinedOutput()
    59  	if err != nil {
    60  		return ""
    61  	}
    62  	ver := strings.TrimSpace(string(v))
    63  	// see if dirty
    64  	cmd = exec.Command("git", "diff-index", "--quiet", "HEAD", "--")
    65  	err = cmd.Run()
    66  	// exit status 1 indicates dirty tree
    67  	if err != nil {
    68  		if err.Error() == "exit status 1" {
    69  			ver += "[dirty]"
    70  		} else {
    71  			log.Printf("!%s!", err.Error())
    72  		}
    73  	}
    74  	return ver
    75  }