feat(cli): --version using ldflags

The go-modules approach is a bit broken: https://github.com/golang/go/issues/29228
To resolve that, we now compute that version using `git describe` and
set it using `ldflags`.

While this is not as nice/builtin as the other approach, it at least
works all the time and across go versions.

Furthermore, I did refactor the Makefile in preparation for an AUR
package that builds from source and for building release artifacts in CI.
This commit is contained in:
sh0rez 2020-02-28 19:40:37 +01:00
parent f8be6a936f
commit 80c06a483a
No known key found for this signature in database
GPG key ID: 87C71DF9F8181FF1
4 changed files with 37 additions and 83 deletions

View file

@ -1,31 +1,35 @@
all: check-license build generate test .PHONY: all check-license crossbuild build install test generate embedmd
GITHUB_URL=github.com/jsonnet-bundler/jsonnet-bundler GITHUB_URL=github.com/jsonnet-bundler/jsonnet-bundler
GOOS?=$(shell uname -s | tr A-Z a-z) VERSION := $(shell git describe --tags --dirty --always)
GOARCH?=$(subst x86_64,amd64,$(patsubst i%86,386,$(shell uname -m)))
OUT_DIR=_output OUT_DIR=_output
BIN?=jb BIN?=jb
VERSION?=$(shell cat VERSION)
PKGS=$(shell go list ./... | grep -v /vendor/) PKGS=$(shell go list ./... | grep -v /vendor/)
check-license: all: check-license build generate test
@echo ">> checking license headers"
@./scripts/check_license.sh
crossbuild:
@GOOS=linux ARCH=amd64 $(MAKE) -s build # Binaries
LDFLAGS := '-s -w -extldflags "-static" -X main.Version=${VERSION}'
cross: clean
CGO_ENABLED=0 gox \
-output="$(OUT_DIR)/jb-{{.OS}}-{{.Arch}}" \
-ldflags=$(LDFLAGS) \
-arch="amd64 arm64 arm" -os="linux" \
-osarch="darwin/amd64" \
./cmd/$(BIN)
static:
CGO_ENABLED=0 go build -ldflags=${LDFLAGS} -o $(OUT_DIR)/$(BIN) ./cmd/$(BIN)
build: build:
@$(eval OUTPUT=$(OUT_DIR)/$(GOOS)/$(GOARCH)/$(BIN)) CGO_ENABLED=0 go build ./cmd/$(BIN)
@echo ">> building for $(GOOS)/$(GOARCH) to $(OUTPUT)"
@mkdir -p $(OUT_DIR)/$(GOOS)/$(GOARCH)
@CGO_ENABLED=0 go build --installsuffix cgo -o $(OUTPUT) $(GITHUB_URL)/cmd/$(BIN)
install: build install: static
@$(eval OUTPUT=$(OUT_DIR)/$(GOOS)/$(GOARCH)/$(BIN))
@echo ">> copying $(BIN) into $(GOPATH)/bin/$(BIN)" @echo ">> copying $(BIN) into $(GOPATH)/bin/$(BIN)"
@cp $(OUTPUT) $(GOPATH)/bin/$(BIN) cp $(OUT_DIR)/$(BIN) $(GOPATH)/bin/$(BIN)
# Tests
test: test:
@echo ">> running all unit tests" @echo ">> running all unit tests"
go test -v $(PKGS) go test -v $(PKGS)
@ -34,12 +38,22 @@ test-integration:
@echo ">> running all integration tests" @echo ">> running all integration tests"
go test -v -tags=integration $(PKGS) go test -v -tags=integration $(PKGS)
# Documentation
generate: embedmd generate: embedmd
@echo ">> generating docs" @echo ">> generating docs"
@./scripts/generate-help-txt.sh @./scripts/generate-help-txt.sh
@$(GOPATH)/bin/embedmd -w `find ./ -path ./vendor -prune -o -name "*.md" -print` @$(GOPATH)/bin/embedmd -w `find ./ -path ./vendor -prune -o -name "*.md" -print`
embedmd: check-license:
@go get github.com/campoy/embedmd @echo ">> checking license headers"
@./scripts/check_license.sh
.PHONY: all check-license crossbuild build install test generate embedmd embedmd:
pushd /tmp && GO111MODULES=on go get github.com/campoy/embedmd && popd
# Other
clean:
rm -rf $(OUT_DIR) $(BIN)
drone:
drone jsonnet --format

View file

@ -21,6 +21,7 @@ import (
"github.com/fatih/color" "github.com/fatih/color"
"github.com/pkg/errors" "github.com/pkg/errors"
"gopkg.in/alecthomas/kingpin.v2"
) )
const ( const (
@ -30,6 +31,8 @@ const (
rewriteActionName = "rewrite" rewriteActionName = "rewrite"
) )
var Version = "dev"
func main() { func main() {
os.Exit(Main()) os.Exit(Main())
} }
@ -41,7 +44,7 @@ func Main() int {
color.Output = color.Error color.Output = color.Error
a := newApp() a := kingpin.New(filepath.Base(os.Args[0]), "A jsonnet package manager").Version(Version)
a.HelpFlag.Short('h') a.HelpFlag.Short('h')
a.Flag("jsonnetpkg-home", "The directory used to cache packages in."). a.Flag("jsonnetpkg-home", "The directory used to cache packages in.").

View file

@ -1,34 +0,0 @@
// Copyright 2018 jsonnet-bundler authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build go1.12
package main
import (
"os"
"path/filepath"
"runtime/debug"
kingpin "gopkg.in/alecthomas/kingpin.v2"
)
func newApp() *kingpin.Application {
a := kingpin.New(filepath.Base(os.Args[0]), "A jsonnet package manager")
d, ok := debug.ReadBuildInfo()
if ok {
return a.Version(d.Main.Version)
}
return a
}

View file

@ -1,29 +0,0 @@
// Copyright 2018 jsonnet-bundler authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// +build !go1.12
package main
import (
"os"
"path/filepath"
kingpin "gopkg.in/alecthomas/kingpin.v2"
)
func newApp() *kingpin.Application {
a := kingpin.New(filepath.Base(os.Args[0]), "A jsonnet package manager")
return a
}