1- LAST_TAG := $(shell git describe --abbrev=0 --always --tags)
2- BUILD := $(shell git rev-parse $(LAST_TAG ) )
1+ APPNAME? =ip-range-to-cidr
32
4- BINARY := ip-range-to-cidr
5- UNIXBINARY := $(BINARY )
6- WINBINARY := $(UNIXBINARY ) .exe
7- BUILDDIR := build
3+ # version from last tag
4+ VERSION := $(shell git describe --abbrev=0 --always --tags)
5+ BUILD := $(shell git rev-parse $(VERSION ) )
6+ BUILDDATE := $(shell git log -1 --format=% aI $(VERSION ) )
7+ BUILDFILES? =$$(find . -mindepth 1 -maxdepth 1 -type f \( -iname "*${APPNAME}-v*" -a ! -iname "*.shasums" \ ) )
8+ LDFLAGS := -ldflags "-s -w -X=main.VERSION=$(VERSION ) -X=main.BUILD=$(BUILD ) -X=main.BUILDDATE=$(BUILDDATE ) "
9+ RELEASETMPDIR := $(shell mktemp -d -t ${APPNAME}-rel-XXXXXX)
10+ APPANDVER := ${APPNAME}-$(VERSION )
11+ RELEASETMPAPPDIR := $(RELEASETMPDIR ) /$(APPANDVER )
812
9- LINUXRELEASE := $( BINARY ) - $( LAST_TAG ) -linux-x64.tar.gz
10- WINRELEASE := $( BINARY ) - $( LAST_TAG ) -windows-x64.zip
13+ UPXFLAGS := -v -9
14+ XZCOMPRESSFLAGS := --verbose --keep --compress --threads 0 --extreme -9
1115
12- LDFLAGS := -ldflags "-s -w -X=main.VERSION=$(LAST_TAG ) -X=main.BUILD=$(BUILD ) "
16+ # https://golang.org/doc/install/source#environment
17+ LINUX_ARCHS := amd64 arm arm64 ppc64 ppc64le
18+ WINDOWS_ARCHS := amd64
19+ DARWIN_ARCHS := amd64
20+ FREEBSD_ARCHS := amd64 arm
21+ NETBSD_ARCHS := amd64 arm
22+ OPENBSD_ARCHS := amd64 arm arm64
1323
14- bin :
15- GOOS=linux GOARCH=amd64 go build $(LDFLAGS ) -v -o $(BUILDDIR ) /$(UNIXBINARY )
16- upx -v -9 $(BUILDDIR ) /$(UNIXBINARY )
24+ default : build
1725
18- bin-windows :
19- GOOS=windows GOARCH=amd64 go build $( LDFLAGS ) -v -o $( BUILDDIR ) / $( WINBINARY )
20- upx -v -9 $(BUILDDIR ) / $( WINBINARY )
26+ build :
27+ @echo " GO BUILD... "
28+ @CGO_ENABLED=0 go build $(LDFLAGS ) -v -o ./bin/ ${APPNAME} .
2129
22- release :
23- cd $(BUILDDIR ) ; tar cvzf $(LINUXRELEASE ) $(UNIXBINARY )
30+ linux-build :
31+ @for arch in $(LINUX_ARCHS ) ; do \
32+ echo " GNU/Linux build... $$ arch" ; \
33+ CGO_ENABLED=0 GOOS=linux GOARCH=$$ arch go build $(LDFLAGS ) -v -o ./bin/linux-$$ arch/${APPNAME} . 2> /dev/null; \
34+ done
2435
25- release-windows :
26- cd $(BUILDDIR ) ; zip -v -9 $(WINRELEASE ) $(WINBINARY )
36+ darwin-build :
37+ @for arch in $(DARWIN_ARCHS ) ; do \
38+ echo " Darwin build... $$ arch" ; \
39+ CGO_ENABLED=0 GOOS=darwin GOARCH=$$ arch go build $(LDFLAGS ) -v -o ./bin/darwin-$$ arch/${APPNAME} . ; \
40+ done
2741
28- .PHONY : all clean test
42+ freebsd-build :
43+ @for arch in $(FREEBSD_ARCHS ) ; do \
44+ echo " FreeBSD build... $$ arch" ; \
45+ CGO_ENABLED=0 GOOS=freebsd GOARCH=$$ arch go build $(LDFLAGS ) -v -o ./bin/freebsd-$$ arch/${APPNAME} . 2> /dev/null; \
46+ done
47+
48+ netbsd-build :
49+ @for arch in $(NETBSD_ARCHS ) ; do \
50+ echo " NetBSD build... $$ arch" ; \
51+ CGO_ENABLED=0 GOOS=netbsd GOARCH=$$ arch go build $(LDFLAGS ) -v -o ./bin/netbsd-$$ arch/${APPNAME} . 2> /dev/null; \
52+ done
53+
54+ openbsd-build :
55+ @for arch in $(OPENBSD_ARCHS ) ; do \
56+ echo " OpenBSD build... $$ arch" ; \
57+ CGO_ENABLED=0 GOOS=openbsd GOARCH=$$ arch go build $(LDFLAGS ) -v -o ./bin/openbsd-$$ arch/${APPNAME} . 2> /dev/null; \
58+ done
59+
60+ windows-build :
61+ @for arch in $(WINDOWS_ARCHS ) ; do \
62+ echo " MS Windows build... $$ arch" ; \
63+ CGO_ENABLED=0 GOOS=windows GOARCH=$$ arch go build $(LDFLAGS ) -v -o ./bin/windows-$$ arch/${APPNAME} .exe . 2> /dev/null; \
64+ done
65+
66+ # Compress executables
67+ upx-pack :
68+ @upx $(UPXFLAGS ) ./bin/linux-amd64/${APPNAME}
69+ @upx $(UPXFLAGS ) ./bin/linux-arm/${APPNAME}
70+ @upx $(UPXFLAGS ) ./bin/windows-amd64/${APPNAME} .exe
71+
72+ release : linux-build darwin-build freebsd-build openbsd-build netbsd-build windows-build upx-pack compress-everything shasums
73+ @echo " release done..."
74+
75+ shasums :
76+ @echo " Checksumming..."
77+ @pushd " release/${VERSION} " && shasum -a 256 $(BUILDFILES ) > $(APPANDVER ) .shasums
78+
79+ # Copy common files to release directory
80+ # Creates $(APPNAME)-$(VERSION) directory prefix where everything will be copied by compress-$OS targets
81+ copycommon :
82+ @echo " Copying common files to temporary release directory '$( RELEASETMPAPPDIR) '.."
83+ @mkdir -p " $( RELEASETMPAPPDIR) /bin"
84+ @cp -v " ./LICENSE" " $( RELEASETMPAPPDIR) "
85+ @cp -v " ./README.md" " $( RELEASETMPAPPDIR) "
86+ @mkdir --parents " $( PWD) /release/${VERSION} "
87+
88+ # Compress files: FreeBSD
89+ compress-freebsd :
90+ @for arch in $(FREEBSD_ARCHS ) ; do \
91+ echo " FreeBSD xz... $$ arch" ; \
92+ cp -v " $( PWD) /bin/freebsd-$$ arch/${APPNAME} " " $( RELEASETMPAPPDIR) /bin" ; \
93+ cd " $( RELEASETMPDIR) " ; \
94+ tar --numeric-owner --owner=0 --group=0 -cf - . | xz $(XZCOMPRESSFLAGS ) - > " $( PWD) /release/${VERSION} /$( APPANDVER) -freebsd-$$ arch.tar.xz" ; \
95+ rm " $( RELEASETMPAPPDIR) /bin/${APPNAME} " ; \
96+ done
97+
98+ # Compress files: OpenBSD
99+ compress-openbsd :
100+ @for arch in $(OPENBSD_ARCHS ) ; do \
101+ echo " OpenBSD xz... $$ arch" ; \
102+ cp -v " $( PWD) /bin/openbsd-$$ arch/${APPNAME} " " $( RELEASETMPAPPDIR) /bin" ; \
103+ cd " $( RELEASETMPDIR) " ; \
104+ tar --numeric-owner --owner=0 --group=0 -cf - . | xz $(XZCOMPRESSFLAGS ) - > " $( PWD) /release/${VERSION} /$( APPANDVER) -openbsd-$$ arch.tar.xz" ; \
105+ rm " $( RELEASETMPAPPDIR) /bin/${APPNAME} " ; \
106+ done
107+
108+ # Compress files: NetBSD
109+ compress-netbsd :
110+ @for arch in $(NETBSD_ARCHS ) ; do \
111+ echo " NetBSD xz... $$ arch" ; \
112+ cp -v " $( PWD) /bin/netbsd-$$ arch/${APPNAME} " " $( RELEASETMPAPPDIR) /bin" ; \
113+ cd " $( RELEASETMPDIR) " ; \
114+ tar --numeric-owner --owner=0 --group=0 -cf - . | xz $(XZCOMPRESSFLAGS ) - > " $( PWD) /release/${VERSION} /$( APPANDVER) -netbsd-$$ arch.tar.xz" ; \
115+ rm " $( RELEASETMPAPPDIR) /bin/${APPNAME} " ; \
116+ done
117+
118+ # Compress files: GNU/Linux
119+ compress-linux :
120+ @for arch in $(LINUX_ARCHS ) ; do \
121+ echo " GNU/Linux tar... $$ arch" ; \
122+ cp -v " $( PWD) /bin/linux-$$ arch/${APPNAME} " " $( RELEASETMPAPPDIR) /bin" ; \
123+ cd " $( RELEASETMPDIR) " ; \
124+ tar --numeric-owner --owner=0 --group=0 -zcvf " $( PWD) /release/${VERSION} /$( APPANDVER) -linux-$$ arch.tar.gz" . ; \
125+ rm " $( RELEASETMPAPPDIR) /bin/${APPNAME} " ; \
126+ done
127+
128+ # Compress files: Darwin
129+ compress-darwin :
130+ @for arch in $(DARWIN_ARCHS ) ; do \
131+ echo " Darwin tar... $$ arch" ; \
132+ cp -v " $( PWD) /bin/darwin-$$ arch/${APPNAME} " " $( RELEASETMPAPPDIR) /bin" ; \
133+ cd " $( RELEASETMPDIR) " ; \
134+ tar --owner=0 --group=0 -zcvf " $( PWD) /release/${VERSION} /$( APPANDVER) -darwin-$$ arch.tar.gz" . ; \
135+ rm " $( RELEASETMPAPPDIR) /bin/${APPNAME} " ; \
136+ done
137+
138+ # Compress files: Microsoft Windows
139+ compress-windows :
140+ @for arch in $(WINDOWS_ARCHS ) ; do \
141+ echo " MS Windows zip... $$ arch" ; \
142+ cp -v " $( PWD) /bin/windows-$$ arch/${APPNAME} .exe" " $( RELEASETMPAPPDIR) /bin" ; \
143+ cd " $( RELEASETMPAPPDIR) " ; \
144+ mv " LICENSE" " LICENSE.txt" && \
145+ pandoc --standalone --to rtf --output LICENSE.rtf LICENSE.txt && \
146+ rm " LICENSE.txt" ; \
147+ cd " $( RELEASETMPDIR) " ; \
148+ zip -v -9 -r -o -9 " $( PWD) /release/${VERSION} /$( APPANDVER) -windows-$$ arch.zip" . ; \
149+ rm " $( RELEASETMPAPPDIR) /LICENSE.rtf" ; \
150+ cp -v " $( PWD) /LICENSE" " $( RELEASETMPAPPDIR) " ; \
151+ rm " $( RELEASETMPAPPDIR) /bin/${APPNAME} .exe" ; \
152+ done
153+
154+ # Move all to temporary directory and compress with common files
155+ compress-everything : copycommon compress-linux compress-windows compress-freebsd compress-netbsd compress-openbsd
156+ @echo " $@ ..."
157+ rm -rf " $( RELEASETMPDIR) /*"
158+
159+ .PHONY : all clean test default
0 commit comments