You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

302 lines
15 KiB

  1. ##
  2. # Extra checks, because we do not use autoconf.
  3. ##
  4. requirements_check = true
  5. gpg_check = false
  6. go_min_version = 1.9.2
  7. gpg_key = 2122CBE9
  8. ifeq ($(requirements_check),true)
  9. ifndef GOPATH
  10. $(error GOPATH not set)
  11. else
  12. go_version := $(shell go version | sed "s/^.* go\([0-9\.]*\) .*$$/\1/" )
  13. $(info Found go version $(go_version))
  14. go_version_check := $(shell echo -e "$(go_min_version)\n$(go_version)" | sort -V | head -1)
  15. ifneq ($(go_min_version),$(go_version_check))
  16. $(error go version go_min_version or above is required)
  17. endif
  18. endif
  19. ifeq ($(gpg_check),true)
  20. gpg_check := $(shell gpg -K | grep '/$(gpg_key) ' | sed 's,^.*/\($(gpg_key)\) .*$$,\1,')
  21. ifneq ($(gpg_check),$(gpg_key))
  22. $(error GPG key $(gpg_key) not found.)
  23. else
  24. $(info GPG key $(gpg_key) found)
  25. endif
  26. ifndef GPG_PASSPHRASE
  27. $(error GPG_PASSPHRASE not set)
  28. endif
  29. endif
  30. endif
  31. ###
  32. # Here comes the real deal
  33. ###
  34. binaries = tendermint basecoin ethermint trackomatron gaia
  35. build-binaries = build-tendermint build-basecoin build-ethermint build-trackomatron build-gaia
  36. package-rpm = package-rpm-tendermint package-rpm-basecoin package-rpm-ethermint package-rpm-trackomatron package-rpm-gaia
  37. install-rpm = install-rpm-tendermint install-rpm-basecoin install-rpm-ethermint install-rpm-trackomatron install-rpm-gaia
  38. package-deb = package-deb-tendermint package-deb-basecoin package-deb-ethermint package-deb-trackomatron package-deb-gaia
  39. install-deb = install-deb-tendermint install-deb-basecoin install-deb-ethermint install-deb-trackomatron install-deb-gaia
  40. all: $(binaries)
  41. build: $(build-binaries)
  42. package: $(package-rpm) $(package-deb)
  43. install: $(install-rpm) $(install-deb)
  44. $(binaries): %: build-% package-rpm-% package-deb-%
  45. ###
  46. # Build the binaries
  47. ###
  48. git-branch:
  49. $(eval GIT_BRANCH=$(shell echo $${GIT_BRANCH:-master}))
  50. gopath-setup:
  51. test -d $(GOPATH) || mkdir -p $(GOPATH)
  52. test -d $(GOPATH)/bin || mkdir -p $(GOPATH)/bin
  53. test -d $(GOPATH)/src || mkdir -p $(GOPATH)/src
  54. build-tendermint: git-branch gopath-setup
  55. @echo "*** Building tendermint"
  56. go get -d -u github.com/tendermint/tendermint/cmd/tendermint
  57. cd $(GOPATH)/src/github.com/tendermint/tendermint && git checkout "$(GIT_BRANCH)" && git pull
  58. export PATH=$(GOPATH)/bin:$(PATH) && $(MAKE) -C $(GOPATH)/src/github.com/tendermint/tendermint get_tools get_vendor_deps build
  59. cp $(GOPATH)/src/github.com/tendermint/tendermint/build/tendermint $(GOPATH)/bin
  60. @echo "*** Built tendermint"
  61. build-ethermint: git-branch gopath-setup
  62. @echo "*** Building ethermint"
  63. go get -d -u github.com/tendermint/ethermint/cmd/ethermint
  64. cd $(GOPATH)/src/github.com/tendermint/ethermint && git checkout "$(GIT_BRANCH)" && git pull
  65. export PATH=$(GOPATH)/bin:$(PATH) && $(MAKE) -C $(GOPATH)/src/github.com/tendermint/ethermint get_vendor_deps build
  66. cp $(GOPATH)/src/github.com/tendermint/ethermint/build/ethermint $(GOPATH)/bin
  67. @echo "*** Built ethermint"
  68. build-trackomatron: git-branch gopath-setup
  69. @echo "*** Building trackomatron"
  70. go get -d -u github.com/tendermint/trackomatron/cmd/tracko
  71. cd $(GOPATH)/src/github.com/tendermint/trackomatron && git checkout "$(GIT_BRANCH)" && git pull
  72. export PATH=$(GOPATH)/bin:$(PATH) && $(MAKE) -C $(GOPATH)/src/github.com/tendermint/trackomatron get_vendor_deps install
  73. @echo "Workaround: trackomatron package has tracko as the binary - trackomatron needed for proper packaging" && rm -rf $(GOPATH)/bin/trackomatron && ln -s $(GOPATH)/bin/tracko $(GOPATH)/bin/trackomatron
  74. @echo "*** Built trackomatron"
  75. build-gaia: git-branch gopath-setup
  76. @echo "*** Building gaia"
  77. go get -d -u go github.com/cosmos/gaia || echo "Workaround for go downloads."
  78. cd $(GOPATH)/src/github.com/cosmos/gaia && git checkout "$(GIT_BRANCH)" && git pull
  79. export PATH=$(GOPATH)/bin:$(PATH) && $(MAKE) -C $(GOPATH)/src/github.com/cosmos/gaia get_vendor_deps install
  80. @echo "*** Built gaia"
  81. build-basecoin: git-branch gopath-setup
  82. @echo "*** Building basecoin from cosmos-sdk"
  83. go get -d -u github.com/cosmos/cosmos-sdk/examples/basecoin/cmd/basecoind
  84. cd $(GOPATH)/src/github.com/cosmos/cosmos-sdk && git checkout "$(GIT_BRANCH)" && git pull
  85. export PATH=$(GOPATH)/bin:$(PATH) && $(MAKE) -C $(GOPATH)/src/github.com/cosmos/cosmos-sdk get_tools get_vendor_deps install
  86. cp $(GOPATH)/src/github.com/cosmos/cosmos-sdk/build/basecoin $(GOPATH)/bin
  87. @echo "*** Built basecoin from cosmos-sdk"
  88. ###
  89. # Prepare package files
  90. ###
  91. # set app_version
  92. version-%:
  93. @echo "Checking if binary exists"
  94. test -f $(GOPATH)/bin/$*
  95. @echo "BUILD_NUMBER is $(BUILD_NUMBER)"
  96. test -n "$(BUILD_NUMBER)"
  97. $(eval $*_version=$(shell $(GOPATH)/bin/$* version | head -1 | cut -d- -f1 | sed 's/^\(ethermint:\s*\|\)\(v\|\)//' | tr -d '\t ' ))
  98. # set build_folder
  99. folder-%: version-%
  100. $(eval build_folder=BUILD/$*-$($*_version)-$(BUILD_NUMBER))
  101. # clean up folder structure for package files
  102. prepare-files = rm -rf $(build_folder) && mkdir -p $(build_folder) && cp -r ./$(1)/* $(build_folder) && mkdir -p $(build_folder)/usr/bin && cp $(GOPATH)/bin/$(1) $(build_folder)/usr/bin
  103. ##
  104. ## Package customizations for the different applications
  105. ##
  106. prepare-tendermint =
  107. prepare-ethermint = mkdir -p $(build_folder)/etc/ethermint && \
  108. cp $(GOPATH)/src/github.com/tendermint/ethermint/setup/genesis.json $(build_folder)/etc/ethermint/genesis.json && \
  109. cp -r $(GOPATH)/src/github.com/tendermint/ethermint/setup/keystore $(build_folder)/etc/ethermint
  110. prepare-trackomatron = rm -f $(build_folder)/usr/bin/trackomatron && cp $(GOPATH)/bin/tracko $(GOPATH)/bin/trackocli $(build_folder)/usr/bin
  111. prepare-gaia =
  112. prepare-basecoin = cp $(GOPATH)/bin/basecli $(GOPATH)/bin/basecoin $(GOPATH)/bin/baseserver $(GOPATH)/bin/counter $(GOPATH)/bin/countercli $(GOPATH)/bin/eyes $(GOPATH)/bin/eyescli $(build_folder)/usr/bin
  113. ###
  114. # Package the binary for CentOS/RedHat (RPM) and Debian/Ubuntu (DEB)
  115. ###
  116. # Depends on rpmbuild, sorry, this can only be built on CentOS/RedHat machines.
  117. package-rpm-%: folder-%
  118. @echo "*** Packaging RPM $* version $($*_version)"
  119. $(call prepare-files,$*)
  120. $(call prepare-$*)
  121. rm -rf $(build_folder)/DEBIAN
  122. mkdir -p $(build_folder)/usr/share/licenses/$*
  123. cp ./LICENSE $(build_folder)/usr/share/licenses/$*/LICENSE
  124. chmod -Rf a+rX,u+w,g-w,o-w $(build_folder)
  125. mkdir -p {SPECS,tmp}
  126. ./generate-spec $* spectemplates SPECS
  127. sed -i "s/@VERSION@/$($*_version)/" SPECS/$*.spec
  128. sed -i "s/@BUILD_NUMBER@/$(BUILD_NUMBER)/" SPECS/$*.spec
  129. sed -i "s/@PACKAGE_NAME@/$*/" SPECS/$*.spec
  130. rpmbuild -bb SPECS/$*.spec --define "_topdir `pwd`" --define "_tmppath `pwd`/tmp"
  131. ./sign RPMS/x86_64/$*-$($*_version)-$(BUILD_NUMBER).x86_64.rpm "$(gpg_key)" "`which gpg`"
  132. rpm -Kv RPMS/x86_64/$*-$($*_version)-$(BUILD_NUMBER).x86_64.rpm || echo "rpm returns non-zero exist for some reason. ($?)"
  133. @echo "*** Packaged RPM $* version $($*_version)"
  134. package-deb-%: folder-%
  135. @echo "*** Packaging DEB $* version $($*_version)-$(BUILD_NUMBER)"
  136. $(call prepare-files,$*)
  137. $(call prepare-$*)
  138. mkdir -p $(build_folder)/usr/share/doc/$*
  139. cp $(build_folder)/DEBIAN/copyright $(build_folder)/usr/share/doc/$*
  140. chmod -Rf a+rX,u+w,g-w,o-w $(build_folder)
  141. sed -i "s/@VERSION@/$($*_version)-$(BUILD_NUMBER)/" $(build_folder)/DEBIAN/changelog
  142. sed -i "s/@STABILITY@/stable/" $(build_folder)/DEBIAN/changelog
  143. sed -i "s/@DATETIMESTAMP@/`date +%a,\ %d\ %b\ %Y\ %T\ %z`/" $(build_folder)/DEBIAN/changelog
  144. sed -i "s/@VERSION@/$($*_version)-$(BUILD_NUMBER)/" $(build_folder)/DEBIAN/control
  145. gzip -c $(build_folder)/DEBIAN/changelog > $(build_folder)/usr/share/doc/$*/changelog.Debian.gz
  146. gzip -c $(build_folder)/DEBIAN/changelog > $(build_folder)/usr/share/doc/$*/changelog.Debian.amd64.gz
  147. sed -i "s/@INSTALLEDSIZE@/`du -ks $(build_folder) | cut -f 1`/" $(build_folder)/DEBIAN/control
  148. cd $(build_folder) && tar --owner=root --group=root -cvJf ../../tmp/data.tar.xz --exclude DEBIAN *
  149. cd $(build_folder)/DEBIAN && tar --owner=root --group=root -cvzf ../../../tmp/control.tar.gz *
  150. echo "2.0" > tmp/debian-binary
  151. cp ./_gpg tmp/
  152. cd tmp && sed -i "s/@DATETIMESTAMP@/`date +%a\ %b\ %d\ %T\ %Y`/" _gpg
  153. cd tmp && sed -i "s/@BINMD5@/`md5sum debian-binary | cut -d\ -f1`/" _gpg
  154. cd tmp && sed -i "s/@BINSHA1@/`sha1sum debian-binary | cut -d\ -f1`/" _gpg
  155. cd tmp && sed -i "s/@BINSIZE@/`stat -c %s debian-binary | cut -d\ -f1`/" _gpg
  156. cd tmp && sed -i "s/@CONMD5@/`md5sum control.tar.gz | cut -d\ -f1`/" _gpg
  157. cd tmp && sed -i "s/@CONSHA1@/`sha1sum control.tar.gz | cut -d\ -f1`/" _gpg
  158. cd tmp && sed -i "s/@CONSIZE@/`stat -c %s control.tar.gz | cut -d\ -f1`/" _gpg
  159. cd tmp && sed -i "s/@DATMD5@/`md5sum data.tar.xz | cut -d\ -f1`/" _gpg
  160. cd tmp && sed -i "s/@DATSHA1@/`sha1sum data.tar.xz | cut -d\ -f1`/" _gpg
  161. cd tmp && sed -i "s/@DATSIZE@/`stat -c %s data.tar.xz | cut -d\ -f1`/" _gpg
  162. gpg --batch --passphrase "$(GPG_PASSPHRASE)" --clearsign tmp/_gpg
  163. mv tmp/_gpg.asc tmp/_gpgbuilder
  164. ar r tmp/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb tmp/debian-binary tmp/control.tar.gz tmp/data.tar.xz tmp/_gpgbuilder
  165. mv tmp/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb RPMS/
  166. rm tmp/debian-binary tmp/control.tar.gz tmp/data.tar.xz tmp/_gpgbuilder tmp/_gpg
  167. @echo "*** Packaged DEB $* version $($*_version)-$(BUILD_NUMBER)"
  168. install-rpm-%: version-%
  169. #Make sure your host has the IAM role to read/write the S3 bucket OR that you set up ~/.boto
  170. @echo "*** Uploading $*-$($*_version)-$(BUILD_NUMBER).x86_64.rpm to AWS $(DEVOPS_PATH)CentOS repository"
  171. aws s3 sync s3://tendermint-packages/$(DEVOPS_PATH)centos/ tmp/s3/ --delete
  172. mkdir -p tmp/s3/7/os/x86_64/Packages
  173. cp RPMS/x86_64/$*-$($*_version)-$(BUILD_NUMBER).x86_64.rpm tmp/s3/7/os/x86_64/Packages
  174. cp ./RPM-GPG-KEY-Tendermint tmp/s3/7/os/x86_64/
  175. cp ./tendermint.repo tmp/s3/7/os/x86_64/
  176. rm -f tmp/s3/7/os/x86_64/repodata/*.bz2 tmp/s3/7/os/x86_64/repodata/*.gz tmp/s3/7/os/x86_64/repodata/repomd.xml.asc
  177. createrepo tmp/s3/7/os/x86_64/Packages -u https://tendermint-packages.interblock.io/$(DEVOPS_PATH)centos/7/os/x86_64/Packages -o tmp/s3/7/os/x86_64 --update -S --repo Tendermint --content tendermint --content basecoin --content ethermint
  178. gpg --batch --passphrase "$(GPG_PASSPHRASE)" --detach-sign -a tmp/s3/7/os/x86_64/repodata/repomd.xml
  179. aws s3 sync tmp/s3/ s3://tendermint-packages/$(DEVOPS_PATH)centos/ --delete --acl public-read
  180. @echo "*** Uploaded $* to AWS $(DEVOPS_PATH)CentOS repository"
  181. install-deb-%: version-%
  182. @echo "*** Uploading $*-$($*_version)-$(BUILD_NUMBER)_amd64.deb to AWS $(DEVOPS_PATH)Debian repository"
  183. @echo "Testing if $*-$($*_version)-$(BUILD_NUMBER)_amd64.deb is already uploaded"
  184. test ! -f tmp/debian-s3/pool/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb
  185. aws s3 sync s3://tendermint-packages/$(DEVOPS_PATH)debian/ tmp/debian-s3/ --delete
  186. @echo "Testing if $*-$($*_version)-$(BUILD_NUMBER)_amd64.deb is already uploaded"
  187. test ! -f tmp/debian-s3/pool/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb
  188. cp ./tendermint.list tmp/debian-s3/
  189. mkdir -p tmp/debian-s3/pool tmp/debian-s3/dists/stable/main/binary-amd64
  190. cp RPMS/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb tmp/debian-s3/pool
  191. cp ./Release_amd64 tmp/debian-s3/dists/stable/main/binary-amd64/Release
  192. #Packages / Packages.gz
  193. echo > tmp/Package
  194. echo "Filename: pool/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb" >> tmp/Package
  195. echo "MD5sum: `md5sum RPMS/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb | cut -d\ -f 1`" >> tmp/Package
  196. echo "SHA1: `sha1sum RPMS/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb | cut -d\ -f 1`" >> tmp/Package
  197. echo "SHA256: `sha256sum RPMS/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb | cut -d\ -f 1`" >> tmp/Package
  198. echo "Size: `stat -c %s RPMS/$*-$($*_version)-$(BUILD_NUMBER)_amd64.deb | cut -d\ -f 1`" >> tmp/Package
  199. cat BUILD/$*-$($*_version)-$(BUILD_NUMBER)/DEBIAN/control >> tmp/Package
  200. cat tmp/Package >> tmp/debian-s3/dists/stable/main/binary-amd64/Packages
  201. rm -f tmp/debian-s3/dists/stable/main/binary-amd64/Packages.gz
  202. gzip -c tmp/debian-s3/dists/stable/main/binary-amd64/Packages > tmp/debian-s3/dists/stable/main/binary-amd64/Packages.gz
  203. rm -f tmp/Package
  204. #main / Release / InRelease / Release.gpg
  205. cp ./Release tmp/debian-s3/dists/stable/main/Release
  206. rm -f tmp/debian-s3/dists/stable/main/InRelease
  207. rm -f tmp/debian-s3/dists/stable/main/Release.gpg
  208. echo "MD5Sum:" >> tmp/debian-s3/dists/stable/main/Release
  209. cd tmp/debian-s3/dists/stable/main && for f in `find . -type f | sed 's/^.\///'` ; do test "$$f" == "Release" && continue ; echo -n " " ; md5sum $$f | sed "s/ / `stat -c %s $$f` /" ; done >> Release
  210. echo "SHA1:" >> tmp/debian-s3/dists/stable/main/Release
  211. cd tmp/debian-s3/dists/stable/main && for f in `find . -type f | sed 's/^.\///'` ; do test "$$f" == "Release" && continue ; echo -n " " ; sha1sum $$f | sed "s/ / `stat -c %s $$f` /" ; done >> Release
  212. echo "SHA256:" >> tmp/debian-s3/dists/stable/main/Release
  213. cd tmp/debian-s3/dists/stable/main && for f in `find . -type f | sed 's/^.\///'` ; do test "$$f" == "Release" && continue ; echo -n " " ; sha256sum $$f | sed "s/ / `stat -c %s $$f` /" ; done >> Release
  214. gpg --batch --passphrase "$(GPG_PASSPHRASE)" --digest-algo SHA256 -b -a tmp/debian-s3/dists/stable/main/Release
  215. mv tmp/debian-s3/dists/stable/main/Release.asc tmp/debian-s3/dists/stable/main/Release.gpg
  216. gpg --batch --passphrase "$(GPG_PASSPHRASE)" --digest-algo SHA512 --clearsign tmp/debian-s3/dists/stable/main/Release
  217. mv tmp/debian-s3/dists/stable/main/Release.asc tmp/debian-s3/dists/stable/main/InRelease
  218. #stable / Release / InRelease / Release.gpg
  219. cp ./Release tmp/debian-s3/dists/stable/Release
  220. rm -f tmp/debian-s3/dists/stable/InRelease
  221. rm -f tmp/debian-s3/dists/stable/Release.gpg
  222. echo "MD5Sum:" >> tmp/debian-s3/dists/stable/Release
  223. cd tmp/debian-s3/dists/stable && for f in `find . -type f | sed 's/^.\///'` ; do test "$$f" == "Release" && continue ; echo -n " " ; md5sum $$f | sed "s/ / `stat -c %s $$f` /" ; done >> Release
  224. echo "SHA1:" >> tmp/debian-s3/dists/stable/Release
  225. cd tmp/debian-s3/dists/stable && for f in `find . -type f | sed 's/^.\///'` ; do test "$$f" == "Release" && continue ; echo -n " " ; sha1sum $$f | sed "s/ / `stat -c %s $$f` /" ; done >> Release
  226. echo "SHA256:" >> tmp/debian-s3/dists/stable/Release
  227. cd tmp/debian-s3/dists/stable && for f in `find . -type f | sed 's/^.\///'` ; do test "$$f" == "Release" && continue ; echo -n " " ; sha256sum $$f | sed "s/ / `stat -c %s $$f` /" ; done >> Release
  228. gpg --batch --passphrase "$(GPG_PASSPHRASE)" --digest-algo SHA256 -b -a tmp/debian-s3/dists/stable/Release
  229. mv tmp/debian-s3/dists/stable/Release.asc tmp/debian-s3/dists/stable/Release.gpg
  230. gpg --batch --passphrase "$(GPG_PASSPHRASE)" --digest-algo SHA512 --clearsign tmp/debian-s3/dists/stable/Release
  231. mv tmp/debian-s3/dists/stable/Release.asc tmp/debian-s3/dists/stable/InRelease
  232. aws s3 sync tmp/debian-s3/ s3://tendermint-packages/$(DEVOPS_PATH)debian/ --delete --acl public-read
  233. @echo "*** Uploaded $*-$($*_version)-$(BUILD_NUMBER)_amd64.deb to AWS $(DEVOPS_PATH)Debian repository"
  234. mostlyclean:
  235. rm -rf {BUILDROOT,SOURCES,SPECS,SRPMS,tmp}
  236. clean: mostlyclean
  237. rm -rf {BUILD,RPMS}
  238. distclean: clean
  239. rm -rf $(GOPATH)/src/github.com/tendermint/tendermint
  240. rm -rf $(GOPATH)/src/github.com/tendermint/basecoin
  241. rm -rf $(GOPATH)/src/github.com/tendermint/ethermint
  242. rm -rf $(GOPATH)/src/github.com/tendermint/trackomatron
  243. rm -rf $(GOPATH)/bin/tendermint
  244. rm -rf $(GOPATH)/bin/basecoin
  245. rm -rf $(GOPATH)/bin/basecli
  246. rm -rf $(GOPATH)/bin/ethermint
  247. rm -rf $(GOPATH)/bin/gaia
  248. rm -rf $(GOPATH)/bin/tracko
  249. rm -rf $(GOPATH)/bin/trackocli
  250. .PHONY : clean