Makefile 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. .PHONY: test e2e-test cover gofmt gofmt-fix license-check clean tar.gz docker-push release docker-push-all flannel-git
  2. # Registry used for publishing images
  3. REGISTRY?=quay.io/coreos/flannel
  4. # Default tag and architecture. Can be overridden
  5. TAG?=$(shell git describe --tags --dirty)
  6. ARCH?=amd64
  7. # These variables can be overridden by setting an environment variable.
  8. TEST_PACKAGES?=pkg/ip subnet subnet/etcdv2
  9. TEST_PACKAGES_EXPANDED=$(TEST_PACKAGES:%=github.com/coreos/flannel/%)
  10. PACKAGES?=$(TEST_PACKAGES) network
  11. PACKAGES_EXPANDED=$(PACKAGES:%=github.com/coreos/flannel/%)
  12. # Set the (cross) compiler to use for different architectures
  13. ifeq ($(ARCH),amd64)
  14. LIB_DIR=x86_64-linux-gnu
  15. CC=gcc
  16. endif
  17. ifeq ($(ARCH),arm)
  18. LIB_DIR=arm-linux-gnueabi
  19. CC=arm-linux-gnueabi-gcc
  20. endif
  21. ifeq ($(ARCH),arm64)
  22. LIB_DIR=aarch64-linux-gnu
  23. CC=aarch64-linux-gnu-gcc
  24. endif
  25. ifeq ($(ARCH),ppc64le)
  26. LIB_DIR=powerpc64le-linux-gnu
  27. CC=powerpc64le-linux-gnu-gcc
  28. endif
  29. ifeq ($(ARCH),s390x)
  30. LIB_DIR=s390x-linux-gnu
  31. CC=s390x-linux-gnu-gcc
  32. endif
  33. GOARM=6
  34. ifeq ($(ARCH),s390x)
  35. # kube-cross:v1.7.4-1 supports s390x
  36. KUBE_CROSS_TAG=v1.7.4-1
  37. else
  38. KUBE_CROSS_TAG=v1.6.2-2
  39. endif
  40. IPTABLES_VERSION=1.4.21
  41. dist/flanneld: $(shell find . -type f -name '*.go')
  42. go build -o dist/flanneld \
  43. -ldflags "-X github.com/coreos/flannel/version.Version=$(TAG)"
  44. test: license-check gofmt
  45. go test -cover $(TEST_PACKAGES_EXPANDED)
  46. cd dist; ./mk-docker-opts_tests.sh
  47. e2e-test: dist/flanneld-$(TAG)-$(ARCH).docker
  48. cd dist; ./functional-test.sh $(REGISTRY):$(TAG)-$(ARCH)
  49. cover:
  50. # A single package must be given - e.g. 'PACKAGES=pkg/ip make cover'
  51. go test -coverprofile cover.out $(PACKAGES_EXPANDED)
  52. go tool cover -html=cover.out
  53. # Throw an error if gofmt finds problems.
  54. # "read" will return a failure return code if there is no output. This is inverted wth the "!"
  55. gofmt:
  56. bash -c '! gofmt -d $(PACKAGES) 2>&1 | read'
  57. gofmt-fix:
  58. gofmt -w $(PACKAGES)
  59. license-check:
  60. ./license-check.sh
  61. clean:
  62. rm -f dist/flanneld*
  63. rm -f dist/iptables*
  64. rm -f dist/*.aci
  65. rm -f dist/*.docker
  66. rm -f dist/*.tar.gz
  67. ## Create a docker image on disk for a specific arch and tag
  68. dist/flanneld-$(TAG)-$(ARCH).docker: dist/flanneld-$(ARCH) dist/iptables-$(ARCH) dist/libpthread.so.0-$(ARCH)
  69. docker build -f Dockerfile.$(ARCH) -t $(REGISTRY):$(TAG)-$(ARCH) .
  70. docker save -o dist/flanneld-$(TAG)-$(ARCH).docker $(REGISTRY):$(TAG)-$(ARCH)
  71. # amd64 gets an image with the suffix too (i.e. it's the default)
  72. ifeq ($(ARCH),amd64)
  73. docker build -f Dockerfile.$(ARCH) -t $(REGISTRY):$(TAG) .
  74. endif
  75. ## Create an ACI on disk for a specific arch and tag
  76. dist/flanneld-$(TAG)-$(ARCH).aci: dist/flanneld-$(TAG)-$(ARCH).docker
  77. docker2aci dist/flanneld-$(TAG)-$(ARCH).docker
  78. mv quay.io-coreos-flannel-$(TAG)-$(ARCH).aci dist/flanneld-$(TAG)-$(ARCH).aci
  79. actool patch-manifest --replace --capability=CAP_NET_ADMIN \
  80. --mounts=run-flannel,path=/run/flannel,readOnly=false:etc-ssl-etcd,path=/etc/ssl/etcd,readOnly=true:dev-net,path=/dev/net,readOnly=false \
  81. dist/flanneld-$(TAG)-$(ARCH).aci
  82. docker-push: dist/flanneld-$(TAG)-$(ARCH).docker
  83. docker push $(REGISTRY):$(TAG)-$(ARCH)
  84. # amd64 gets an image with the suffix too (i.e. it's the default)
  85. ifeq ($(ARCH),amd64)
  86. docker push $(REGISTRY):$(TAG)
  87. endif
  88. ## Build an architecture specific flanneld binary
  89. dist/flanneld-$(ARCH):
  90. # Build for other platforms with 'ARCH=$$ARCH make dist/flanneld-$$ARCH'
  91. # valid values for $$ARCH are [amd64 arm arm64 ppc64le s390x]
  92. docker run -e CC=$(CC) -e GOARM=$(GOARM) -e GOARCH=$(ARCH) \
  93. -u $(shell id -u):$(shell id -g) \
  94. -v $(CURDIR):/go/src/github.com/coreos/flannel:ro \
  95. -v $(CURDIR)/dist:/go/src/github.com/coreos/flannel/dist \
  96. gcr.io/google_containers/kube-cross:$(KUBE_CROSS_TAG) /bin/bash -c '\
  97. cd /go/src/github.com/coreos/flannel && \
  98. CGO_ENABLED=1 make -e dist/flanneld && \
  99. mv dist/flanneld dist/flanneld-$(ARCH) && \
  100. file dist/flanneld-$(ARCH)'
  101. ## Busybox images are missing pthread. Pull it out of the kube-cross image
  102. dist/libpthread.so.0-$(ARCH):
  103. ifeq ($(ARCH),s390x)
  104. # Busybox images are having older version of libc.so.6 and ld64.so.1. Pull it out of the kube-cross image
  105. docker run --rm -v `pwd`:/host gcr.io/google_containers/kube-cross:$(KUBE_CROSS_TAG) cp /usr/$(LIB_DIR)/lib/libpthread.so.0 /host/dist/libpthread.so.0-$(ARCH)
  106. docker run --rm -v `pwd`:/host gcr.io/google_containers/kube-cross:$(KUBE_CROSS_TAG) cp /usr/$(LIB_DIR)/lib/libc-2.23.so /host/dist/libc.so.6
  107. docker run --rm -v `pwd`:/host gcr.io/google_containers/kube-cross:$(KUBE_CROSS_TAG) cp /usr/$(LIB_DIR)/lib/ld-2.23.so /host/dist/ld64.so.1
  108. else
  109. docker run --rm -v `pwd`:/host gcr.io/google_containers/kube-cross:$(KUBE_CROSS_TAG) cp /lib/$(LIB_DIR)/libpthread.so.0 /host/dist/libpthread.so.0-$(ARCH)
  110. endif
  111. ## Build an architecture specific iptables binary
  112. dist/iptables-$(ARCH):
  113. docker run -e CC=$(CC) -e GOARM=$(GOARM) -e GOARCH=$(ARCH) \
  114. -u $(shell id -u):$(shell id -g) \
  115. -v $(CURDIR):/go/src/github.com/coreos/flannel:ro \
  116. -v $(CURDIR)/dist:/go/src/github.com/coreos/flannel/dist \
  117. gcr.io/google_containers/kube-cross:$(KUBE_CROSS_TAG) /bin/bash -c '\
  118. curl -sSL http://www.netfilter.org/projects/iptables/files/iptables-$(IPTABLES_VERSION).tar.bz2 | tar -jxv && \
  119. cd iptables-$(IPTABLES_VERSION) && \
  120. ./configure \
  121. --prefix=/usr \
  122. --mandir=/usr/man \
  123. --disable-shared \
  124. --disable-devel \
  125. --disable-nftables \
  126. --enable-static \
  127. --host=amd64 && \
  128. make && \
  129. cp iptables/xtables-multi /go/src/github.com/coreos/flannel/dist/iptables-$(ARCH) && \
  130. cd /go/src/github.com/coreos/flannel && \
  131. file dist/iptables-$(ARCH)'
  132. ## Build a .tar.gz for the amd64 ppc64le arm arm64 flanneld binary
  133. tar.gz:
  134. ARCH=amd64 make dist/flanneld-amd64
  135. tar --transform='flags=r;s|-amd64||' -zcvf dist/flannel-$(TAG)-linux-amd64.tar.gz -C dist flanneld-amd64 mk-docker-opts.sh ../README.md
  136. tar -tvf dist/flannel-$(TAG)-linux-amd64.tar.gz
  137. ARCH=ppc64le make dist/flanneld-ppc64le
  138. tar --transform='flags=r;s|-ppc64le||' -zcvf dist/flannel-$(TAG)-linux-ppc64le.tar.gz -C dist flanneld-ppc64le mk-docker-opts.sh ../README.md
  139. tar -tvf dist/flannel-$(TAG)-linux-ppc64le.tar.gz
  140. ARCH=arm make dist/flanneld-arm
  141. tar --transform='flags=r;s|-arm||' -zcvf dist/flannel-$(TAG)-linux-arm.tar.gz -C dist flanneld-arm mk-docker-opts.sh ../README.md
  142. tar -tvf dist/flannel-$(TAG)-linux-arm.tar.gz
  143. ARCH=arm64 make dist/flanneld-arm64
  144. tar --transform='flags=r;s|-arm64||' -zcvf dist/flannel-$(TAG)-linux-arm64.tar.gz -C dist flanneld-arm64 mk-docker-opts.sh ../README.md
  145. tar -tvf dist/flannel-$(TAG)-linux-arm64.tar.gz
  146. ARCH=s390x make dist/flanneld-s390x
  147. tar --transform='flags=r;s|-s390x||' -zcvf dist/flannel-$(TAG)-linux-s390x.tar.gz -C dist flanneld-s390x mk-docker-opts.sh ../README.md
  148. tar -tvf dist/flannel-$(TAG)-linux-s390x.tar.gz
  149. ## Make a release after creating a tag
  150. release: tar.gz
  151. ARCH=amd64 make dist/flanneld-$(TAG)-amd64.aci
  152. ARCH=arm make dist/flanneld-$(TAG)-arm.aci
  153. ARCH=arm64 make dist/flanneld-$(TAG)-arm64.aci
  154. ARCH=ppc64le make dist/flanneld-$(TAG)-ppc64le.aci
  155. ARCH=s390x make dist/flanneld-$(TAG)-s390x.aci
  156. @echo "Everything should be built for $(TAG)"
  157. @echo "Add all *.aci, flanneld-* and *.tar.gz files from dist/ to the Github release"
  158. @echo "Use make docker-push-all to push the images to a registry"
  159. docker-push-all:
  160. ARCH=amd64 make docker-push
  161. ARCH=arm make docker-push
  162. ARCH=arm64 make docker-push
  163. ARCH=ppc64le make docker-push
  164. ARCH=s390x make docker-push
  165. flannel-git:
  166. ARCH=amd64 REGISTRY=quay.io/coreos/flannel-git make clean dist/flanneld-$(TAG)-amd64.docker docker-push
  167. docker build -f Dockerfile.amd64 -t quay.io/coreos/flannel-git .
  168. docker push quay.io/coreos/flannel-git
  169. ARCH=arm REGISTRY=quay.io/coreos/flannel-git make clean dist/flanneld-$(TAG)-arm.docker docker-push
  170. ARCH=arm64 REGISTRY=quay.io/coreos/flannel-git make clean dist/flanneld-$(TAG)-arm64.docker docker-push
  171. ARCH=ppc64le REGISTRY=quay.io/coreos/flannel-git make clean dist/flanneld-$(TAG)-ppc64le.docker docker-push
  172. ARCH=s390x REGISTRY=quay.io/coreos/flannel-git make clean dist/flanneld-$(TAG)-s390x.docker docker-push