Jay Taylor's notes
back to listing indexshipbuilder/Makefile at master · jaytaylor/shipbuilder
[web search]
Original source (github.com)
Clipped on: 2020-03-30
Skip to content
1 | ################################################################################ |
2 | # START of configuration # |
3 | |
4 | GITHUB_REPO ?= shipbuilder |
5 | GITHUB_ORG ?= jaytaylor |
6 | GITHUB_DOMAIN ?= github.com |
7 | GITHUB_API ?= https://$(GITHUB_DOMAIN)/api/v3 |
8 | GITHUB_TOKEN ?= |
9 | # DOCKER_REGISTRY ?= hub.docker.com |
10 | |
11 | # END of configuration # |
12 | ################################################################################ |
13 | |
14 | SHELL := /bin/bash |
15 | |
16 | RM := rm -rf |
17 | |
18 | EXIT_ON_ERROR := set -o errexit && set -o pipefail && set -o nounset && |
19 | |
20 | # Supported operating systems. |
21 | OSES := linux darwin |
22 | |
23 | # OS class (e.g. "Linux", "Darwin"). |
24 | UNAME_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') |
25 | # # Machine architecture (e.g. "x86_64"). |
26 | # UNAME_M := $(shell sh -c 'uname -m 2>/dev/null || echo not') |
27 | # NB: Sourced from: https://git.kernel.org/pub/scm/git/git.git/tree/config.mak.uname |
28 | |
29 | TARGETS := $(shell \ |
30 | grep --files-with-matches --recursive '^package main$$' */*.go \ |
31 | | xargs -n1 dirname \ |
32 | | sort \ |
33 | | uniq \ |
34 | ) |
35 | |
36 | VERSION_RAW := $(shell \ |
37 | git describe --abbrev=4 --dirty --always --tags \ |
38 | | tr -d '\n' \ |
39 | ) |
40 | |
41 | # NB: For ubuntu packaging version name compatibility, add a leading '0-' when |
42 | # the version doesn't start with a number. |
43 | VERSION := $(shell \ |
44 | if ! [[ $(VERSION_RAW) =~ ^[0-9] ]] ; then echo -n '0-' ; fi \ |
45 | && echo -n $(VERSION_RAW) \ |
46 | ) |
47 | |
48 | VERSION_CLEAN = $(VERSION:v%=%) |
49 | |
50 | RPM_VERSION = $(shell echo $(VERSION) | tr '-' '_') |
51 | RPM_FILENAME = $(GITHUB_REPO)-$(RPM_VERSION)-1.x86_64.rpm |
52 | DEB_FILENAME = $(GITHUB_REPO)_$(VERSION)_amd64.deb |
53 | |
54 | DESCRIPTION = $(shell \ |
55 | git tag --list -n999 $$(echo $(VERSION) | sed -e 's/-dirty$$//' -e 's/^0-//') \ |
56 | | sed "s/'/''/g" \ |
57 | | sed '1 s/^[^ ]* *//' \ |
58 | | awk 1 ORS='\\n' \ |
59 | ) |
60 | |
61 | all: get test build |
62 | |
63 | get: |
64 | $(EXIT_ON_ERROR) go get ./... |
65 | |
66 | generate: |
67 | $(EXIT_ON_ERROR) echo -e 'package data\nfunc Asset(name string) ([]byte, error) { return nil, nil }' > pkg/bindata_buildpacks/data/buildpacks_data.go |
68 | $(EXIT_ON_ERROR) find . -type f -name '*.go' | grep -v '^\(\.\/\)\?\(vendor\)' | xargs -n1 dirname | sort | uniq | xargs -n1 go generate |
69 | |
70 | test: generate |
71 | $(EXIT_ON_ERROR) go test -race -v $$(go list ./... | grep -v /vendor/) || ( rc=$$? && echo "rc=$${rc}" && exit $${rc} ) |
72 | |
73 | # Generate build targets for long form, |
74 | # e.g. `make shipbuilder/shipbuilder-linux`. |
75 | $(foreach target,$(TARGETS),$(foreach os,$(OSES),$(target)/$(target)-$(os))): generate |
76 | $(eval tool := $(subst /,,$(dir $@))) |
77 | $(eval binary := $(subst $(dir $@),,$@)) |
78 | $(eval os := $(subst $(dir $@)$(tool)-,,$@)) |
79 | @echo "info: Building tool=$(tool) binary=$(binary) os=$(os) verion=$(VERSION_CLEAN)" |
80 | $(EXIT_ON_ERROR) cd $(tool) && GOOS=$(os) GOARCH=amd64 go build \ |
81 | -ldflags "-X $(GITHUB_DOMAIN)/$(GITHUB_ORG)/$(GITHUB_REPO)/pkg/version.Version=$(VERSION_CLEAN) \ |
82 | $(shell bash -c 'test -x ldflags.sh && ./ldflags.sh || :')" \ |
83 | -o $(binary) |
84 | |
85 | # Generate build targets for single-OS short form, |
86 | # e.g. `make shipbuilder-linux`. |
87 | $(foreach target,$(TARGETS),$(foreach os,$(OSES),$(target)-$(os))): |
88 | $(eval tool := $@) |
89 | @# Strip all `-DOLLAR(os)' strings from $(tool). |
90 | $(foreach os,$(OSES), \ |
91 | $(eval tool := $(subst -$(os),,$(tool))) \ |
92 | ) |
93 | $(eval os := $(subst $(tool)-,,$@)) |
94 | $(EXIT_ON_ERROR) make $(tool)/$(tool)-$(os) |
95 | |
96 | .SECONDEXPANSION: |
97 | # NB: See https://www.gnu.org/software/make/manual/html_node/Secondary-Expansion.html |
98 | # for information on how `.SECONDARYEXPANSION` works. The general idea is |
99 | # enabling a double-var expansion capability; as in `$$..`. |
100 | |
101 | # Generate build targets for multi-OS short form, |
102 | # e.g. `make shipbuilder`. |
103 | $(foreach target,$(TARGETS),$(target)): $(foreach os,$(OSES), $$@-$(os) ) |
104 | |
105 | build: $(foreach target,$(TARGETS),$(foreach os,$(OSES),$(target)/$(target)-$(os))) |
106 | |
107 | # Generate generalized build targets for each OS, |
108 | # e.g. `make build-linux`. |
109 | $(foreach os,$(OSES),build-$(os)): $(foreach target,$(TARGETS), $(target)/$(target)-$$(subst build-,,$$@) ) |
110 | |
111 | # Generate packaging targets for each OS, |
112 | # e.g. `make package-linux`. |
113 | $(foreach os,$(OSES),package-$(os)): build-$$(subst package-,,$$@) |
114 | $(eval os := $(subst package-,,$@)) |
115 | $(EXIT_ON_ERROR) mkdir -p build/$(os) dist |
116 | $(EXIT_ON_ERROR) $(foreach target,$(TARGETS), \ |
117 | cp $(target)/$(target)-$(os) build/$(os)/$(target) ; \ |
118 | ) |
119 | $(EXIT_ON_ERROR) cd build/$(os) && tar -cjvf ../../dist/$(GITHUB_REPO)-$(VERSION)-$(os).tar.bz * |
120 | |
121 | # Installs Ubuntu dependencies for RPM construction. |
122 | # TODO: Detect OS and support both Ubuntu and Centos. |
123 | deps: |
124 | ifeq ($(UNAME_S),Linux) |
125 | @#$(EXIT_ON_ERROR) command gcc || sudo --non-interactive apt-get install --yes gcc |
126 | @#$(EXIT_ON_ERROR) command gem || sudo --non-interactive apt-get install --yes gem |
127 | @#$(EXIT_ON_ERROR) command git || sudo --non-interactive apt-get install --yes git |
128 | @#$(EXIT_ON_ERROR) command unzip || sudo --non-interactive apt-get install --yes unzip |
129 | $(EXIT_ON_ERROR) sudo --non-interactive apt-get install --yes bzr gcc gem git rpm ruby-dev rubygems unzip |
130 | $(EXIT_ON_ERROR) command -v fpm 1>/dev/null 2>/dev/null || sudo --non-interactive gem install fpm |
131 | else |
132 | ifeq ($(UNAME_S),Darwin) |
133 | $(EXIT_ON_ERROR) command -v fpm 1>/dev/null 2>/dev/null || sudo --non-interactive gem install fpm |
134 | @# NB: gtar is required by for fpm to work properly on macOS. |
135 | @# |
136 | @# Avoids errors like: |
137 | @# |
138 | @# tar: Option --owner=0 is not supported |
139 | @# tar: Option --group=0 is not supported |
140 | @# |
141 | $(EXIT_ON_ERROR) command -v gtar 1>/dev/null 2>/dev/null || brew install gtar |
142 | else |
143 | $(EXIT_ON_ERROR) @echo "Unrecognized operation system: $(UNAME_S)" 1>&2 && exit 1 |
144 | endif |
145 | endif |
146 | |
147 | _create_environment: |
148 | @$(EXIT_ON_ERROR) test -d env || ( echo 'error: missing required "env" configuration directory' 1>&2 && exit 1 ) |
149 | $(EXIT_ON_ERROR) echo -n '' > build/environment |
150 | $(EXIT_ON_ERROR) cd env && for f in $$(ls -1) ; do echo "$${f}='$$(cat "$${f}")'" >> ../build/environment ; done ; cd - 1>/dev/null |
151 | |
152 | _prep_fpm: _create_environment build-linux package-linux deps |
153 | $(EXIT_ON_ERROR) test -r build/environment || ( echo 'error: missing build/environment; hint: start out by copying build/environment.example' 1>&2 && exit 1 ) |
154 | $(EXIT_ON_ERROR) \ |
155 | mkdir -p dist \ |
156 | && cd build \ |
157 | && mkdir -p $(GITHUB_REPO)/etc/default $(GITHUB_REPO)/etc/$(GITHUB_REPO) $(GITHUB_REPO)/etc/systemd/system $(GITHUB_REPO)/usr/bin \ |
158 | && cp linux/$(GITHUB_REPO) $(GITHUB_REPO)/usr/bin/$(GITHUB_REPO) \ |
159 | && chmod 755 $(GITHUB_REPO)/usr/bin/$(GITHUB_REPO) \ |
160 | && cp ../build/environment $(GITHUB_REPO)/etc/default/$(GITHUB_REPO) \ |
161 | && chmod 644 $(GITHUB_REPO)/etc/default/$(GITHUB_REPO) \ |
162 | && cp ../build/$(GITHUB_REPO).service $(GITHUB_REPO)/etc/systemd/system/ |
163 | |
164 | dist/$(DEB_FILENAME): _prep_fpm |
165 | $(EXIT_ON_ERROR) \ |
166 | cd dist \ |
167 | && fpm --input-type dir --output-type deb --chdir ../build/$(GITHUB_REPO) --name $(GITHUB_REPO) --version $(VERSION) |
168 | |
169 | deb: dist/$(DEB_FILENAME) |
170 | |
171 | dist/$(RPM_FILENAME): _prep_fpm |
172 | $(EXIT_ON_ERROR) \ |
173 | cd dist \ |
174 | && fpm --input-type dir --output-type rpm --chdir ../build/$(GITHUB_REPO) --name $(GITHUB_REPO) --version $(RPM_VERSION) |
175 | |
176 | rpm: dist/$(RPM_FILENAME) |
177 | |
178 | # docker: |
179 | # $(EXIT_ON_ERROR) sudo --non-interactive docker rmi -f $(GITHUB_ORG)/autocap:$(VERSION) || true |
180 | # $(EXIT_ON_ERROR) cd build && sudo --non-interactive docker build -t $(GITHUB_ORG)/autocap:$(VERSION) . |
181 | |
182 | package: $(foreach os,$(OSES), package-$(os)) deb rpm docker |
183 | |
184 | publish-github: |
185 | @echo "Publishing release to Github for version=$(VERSION)" |
186 | |
187 | $(EXIT_ON_ERROR) test -n "$$(command -v github-release)" || go get github.com/aktau/github-release |
188 | |
189 | $(EXIT_ON_ERROR) github-release release --user "$(GITHUB_ORG)" --repo "$(GITHUB_REPO)" --tag "$(VERSION)" --name "$(VERSION)" --description "$$(echo "$(DESCRIPTION)" | perl -pe 's/\\n/\n/g')" |
190 | |
191 | $(foreach os,$(OSES), \ |
192 | $(EXIT_ON_ERROR) \ |
193 | github-release upload --user "$(GITHUB_ORG)" --repo "$(GITHUB_REPO)" --tag "$(VERSION)" --name "$(GITHUB_REPO)-$(VERSION)-$(os).tar.bz" --label "$(GITHUB_REPO)-$(VERSION)-$(os).tar.bz" --file "dist/$(GITHUB_REPO)-$(VERSION)-$(os).tar.bz" ; \ |
194 | ) |
195 | |
196 | $(EXIT_ON_ERROR) github-release upload --user "$(GITHUB_ORG)" --repo "$(GITHUB_REPO)" --tag "$(VERSION)" --name "$(DEB_FILENAME)" --label "$(DEB_FILENAME)" --file "dist/$(DEB_FILENAME)" |
197 | $(EXIT_ON_ERROR) github-release upload --user "$(GITHUB_ORG)" --repo "$(GITHUB_REPO)" --tag "$(VERSION)" --name "$(RPM_FILENAME)" --label "$(RPM_FILENAME)" --file "dist/$(RPM_FILENAME)" |
198 | |
199 | publish-packagecloud: |
200 | @echo "Publishing release to Packagecloud for version=$(VERSION)" |
201 | |
202 | $(EXIT_ON_ERROR) test -n "$$(command -v pkgcloud-push)" || go get github.com/mlafeldt/pkgcloud/... |
203 | $(EXIT_ON_ERROR) pkgcloud-push $(GITHUB_ORG)/ops/el/7 dist/$(RPM_FILENAME) |
204 | $(EXIT_ON_ERROR) pkgcloud-push $(GITHUB_ORG)/ops/ubuntu/xenial dist/$(DEB_FILENAME) |
205 | |
206 | publish-docker: |
207 | @echo "Publishing docker image to registry=$(DOCKER_REGISTRY) for version=$(VERSION)" |
208 | |
209 | $(EXIT_ON_ERROR) sudo --non-interactive docker tag $(GITHUB_ORG)/autocap:$(VERSION) $(DOCKER_REGISTRY)/$(GITHUB_ORG)/autocap:$(VERSION) |
210 | $(EXIT_ON_ERROR) sudo --non-interactive docker push $(DOCKER_REGISTRY)/$(GITHUB_ORG)/autocap:$(VERSION) |
211 | |
212 | publish-release: package publish-github publish-packagecloud publish-docker |
213 | |
214 | list-targets: |
215 | @$(EXIT_ON_ERROR) echo "$$(echo $(TARGETS) | tr ' ' '\n')" |
216 | |
217 | show-version: |
218 | @$(EXIT_ON_ERROR) echo $(VERSION) |
219 | |
220 | clean: |
221 | $(EXIT_ON_ERROR) rm -rf $(foreach os,$(OSES), \ |
222 | $(foreach target,$(TARGETS), \ |
223 | $(target)/$(target)-$(os) \ |
224 | ) \ |
225 | ) \ |
226 | $(foreach os,$(OSES), \ |
227 | build/$(os) \ |
228 | ) \ |
229 | build/$(GITHUB_REPO) \ |
230 | dist |
231 | |
232 | .DEFAULT: all |
233 | .PHONY: all generate build $(foreach os,$(OSES), build-$(os) ) deps _prep_fpm deb rpm docker package publish-github publish-packagecloud publish-docker publish-release list-targets clean $(TARGETS) |
Powered by Evernote Publisher