github.com/fafucoder/cilium@v1.6.11/Makefile (about)

     1  include Makefile.defs
     2  include daemon/bpf.sha
     3  
     4  SUBDIRS_CILIUM_CONTAINER := proxylib envoy plugins/cilium-cni bpf cilium daemon cilium-health bugtool
     5  ifdef LIBNETWORK_PLUGIN
     6  SUBDIRS_CILIUM_CONTAINER += plugins/cilium-docker
     7  endif
     8  SUBDIRS := $(SUBDIRS_CILIUM_CONTAINER) operator plugins tools
     9  GOFILES_EVAL := $(subst _$(ROOT_DIR)/,,$(shell $(CGO_DISABLED) $(GO) list ./... | grep -v -e /vendor/ -e /contrib/))
    10  GOFILES ?= $(GOFILES_EVAL)
    11  TESTPKGS_EVAL := $(subst github.com/cilium/cilium/,,$(shell $(CGO_DISABLED) $(GO) list ./... | grep -v '/api/v1\|/vendor\|/contrib' | grep -v -P 'test(?!/helpers/logutils)'))
    12  TESTPKGS ?= $(TESTPKGS_EVAL)
    13  GOLANGVERSION := $(shell $(GO) version 2>/dev/null | grep -Eo '(go[0-9].[0-9])')
    14  GOLANG_SRCFILES := $(shell for pkg in $(subst github.com/cilium/cilium/,,$(GOFILES)); do find $$pkg -name *.go -print; done | grep -v vendor | sort | uniq)
    15  BPF_FILES_EVAL := $(shell git ls-files $(ROOT_DIR)/bpf/ | grep -v .gitignore | tr "\n" ' ')
    16  BPF_FILES ?= $(BPF_FILES_EVAL)
    17  BPF_SRCFILES := $(subst ../,,$(BPF_FILES))
    18  
    19  SWAGGER_VERSION := v0.19.0
    20  SWAGGER := $(CONTAINER_ENGINE_FULL) run --rm -v $(CURDIR):$(CURDIR) -w $(CURDIR) -e GOPATH=$(GOPATH) --entrypoint swagger quay.io/goswagger/swagger:$(SWAGGER_VERSION)
    21  
    22  COVERPKG_EVAL := $(shell if [ $$(echo "$(TESTPKGS)" | wc -w) -gt 1 ]; then echo "./..."; else echo "$(TESTPKGS)"; fi)
    23  COVERPKG ?= $(COVERPKG_EVAL)
    24  GOTEST_BASE := -test.v -timeout 360s
    25  GOTEST_UNIT_BASE := $(GOTEST_BASE) -check.vv
    26  GOTEST_PRIV_OPTS := $(GOTEST_UNIT_BASE) -tags=privileged_tests
    27  GOTEST_COVER_OPTS := -coverprofile=coverage.out -covermode=count -coverpkg $(COVERPKG)
    28  BENCH_EVAL := "."
    29  BENCH ?= $(BENCH_EVAL)
    30  BENCHFLAGS_EVAL := -bench=$(BENCH) -run=^$ -benchtime=10s
    31  BENCHFLAGS ?= $(BENCHFLAGS_EVAL)
    32  # Level of logs emitted to console during unit test runs
    33  LOGLEVEL ?= "error"
    34  
    35  JOB_BASE_NAME ?= cilium_test
    36  
    37  UTC_DATE=$(shell date -u "+%Y-%m-%d")
    38  
    39  # Since there's a bug with NFS or the kernel, the flock syscall hangs the documentation
    40  # build in the developer VM. For this reason the documentation build is skipped if NFS
    41  # is running in the developer VM.
    42  SKIP_DOCS ?= $(shell if mount | grep -q "/home/vagrant/go/src/github.com/cilium/cilium type nfs"; then echo "true"; else echo "false"; fi)
    43  
    44  TEST_LDFLAGS=-ldflags "-X github.com/cilium/cilium/pkg/kvstore.consulDummyAddress=https://consul:8443 \
    45  	-X github.com/cilium/cilium/pkg/kvstore.etcdDummyAddress=http://etcd:4002 \
    46  	-X github.com/cilium/cilium/pkg/testutils.CiliumRootDir=$(ROOT_DIR) \
    47  	-X github.com/cilium/cilium/pkg/datapath.DatapathSHA=1234567890abcdef7890"
    48  
    49  TEST_UNITTEST_LDFLAGS= -ldflags "-X github.com/cilium/cilium/pkg/kvstore.consulDummyConfigFile=/tmp/cilium-consul-certs/cilium-consul.yaml \
    50  	-X github.com/cilium/cilium/pkg/testutils.CiliumRootDir=$(ROOT_DIR) \
    51  	-X github.com/cilium/cilium/pkg/datapath.DatapathSHA=1234567890abcdef7890 \
    52  	-X github.com/cilium/cilium/pkg/logging.DefaultLogLevelStr=$(LOGLEVEL)"
    53  
    54  define generate_k8s_api
    55  	cd "./vendor/k8s.io/code-generator" && \
    56  	GO111MODULE=off ./generate-groups.sh $(1) \
    57  	    github.com/cilium/cilium/pkg/k8s/client \
    58  	    $(2) \
    59  	    $(3) \
    60  	    --go-header-file "$(PWD)/hack/custom-boilerplate.go.txt"
    61  endef
    62  
    63  define generate_k8s_api_all
    64  	$(call generate_k8s_api,all,$(1),$(2))
    65  endef
    66  
    67  define generate_k8s_api_deepcopy
    68  	$(call generate_k8s_api,deepcopy,$(1),$(2))
    69  endef
    70  
    71  all: precheck build postcheck
    72  	@echo "Build finished."
    73  
    74  build: $(SUBDIRS)
    75  
    76  build-container:
    77  	for i in $(SUBDIRS_CILIUM_CONTAINER); do $(MAKE) -C $$i all; done
    78  
    79  $(SUBDIRS): force
    80  	@ $(MAKE) -C $@ all
    81  
    82  jenkins-precheck:
    83  	docker-compose -f test/docker-compose.yml -p $(JOB_BASE_NAME)-$$BUILD_NUMBER run --rm precheck
    84  
    85  clean-jenkins-precheck:
    86  	docker-compose -f test/docker-compose.yml -p $(JOB_BASE_NAME)-$$BUILD_NUMBER rm
    87  	# remove the networks
    88  	docker-compose -f test/docker-compose.yml -p $(JOB_BASE_NAME)-$$BUILD_NUMBER down
    89  
    90  PRIV_TEST_PKGS_EVAL := $(shell for pkg in $(TESTPKGS); do echo $(pkg); done | xargs grep --include='*.go' -ril '+build [^!]*privileged_tests' | xargs dirname | sort | uniq)
    91  PRIV_TEST_PKGS ?= $(PRIV_TEST_PKGS_EVAL)
    92  tests-privileged:
    93  	# cilium-map-migrate is a dependency of some unit tests.
    94  	$(MAKE) -C bpf cilium-map-migrate
    95  	$(QUIET)$(foreach pkg,$(PRIV_TEST_PKGS),\
    96  		$(GO) test $(TEST_LDFLAGS) github.com/cilium/cilium/$(pkg) $(GOTEST_PRIV_OPTS) || exit 1;)
    97  
    98  start-kvstores:
    99  	@echo Starting key-value store containers...
   100  	-$(CONTAINER_ENGINE_FULL) rm -f "cilium-etcd-test-container" 2> /dev/null
   101  	$(CONTAINER_ENGINE_FULL) run -d \
   102  		--name "cilium-etcd-test-container" \
   103  		-p 4002:4001 \
   104  		quay.io/coreos/etcd:v3.2.17 \
   105  		etcd -name etcd0 \
   106  		-advertise-client-urls http://0.0.0.0:4001 \
   107  		-listen-client-urls http://0.0.0.0:4001 \
   108  		-listen-peer-urls http://0.0.0.0:2380 \
   109  		-initial-cluster-token etcd-cluster-1 \
   110  		-initial-cluster-state new
   111  	-$(CONTAINER_ENGINE_FULL) rm -f "cilium-consul-test-container" 2> /dev/null
   112  	rm -rf /tmp/cilium-consul-certs
   113  	mkdir /tmp/cilium-consul-certs
   114  	cp $(CURDIR)/test/consul/* /tmp/cilium-consul-certs
   115  	chmod -R a+rX /tmp/cilium-consul-certs
   116  	$(CONTAINER_ENGINE_FULL) run -d \
   117  		--name "cilium-consul-test-container" \
   118  		-p 8501:8443 \
   119  		-e 'CONSUL_LOCAL_CONFIG={"skip_leave_on_interrupt": true, "disable_update_check": true}' \
   120  		-v /tmp/cilium-consul-certs:/cilium-consul/ \
   121  		consul:1.1.0 \
   122  		agent -client=0.0.0.0 -server -bootstrap-expect 1 -config-file=/cilium-consul/consul-config.json
   123  
   124  stop-kvstores:
   125  	$(CONTAINER_ENGINE_FULL) rm -f "cilium-etcd-test-container"
   126  	$(CONTAINER_ENGINE_FULL) rm -f "cilium-consul-test-container"
   127  	rm -rf /tmp/cilium-consul-certs
   128  
   129  tests: force
   130  	$(MAKE) unit-tests
   131  
   132  generate-cov:
   133  	# Remove generated code from coverage
   134  	$(QUIET) grep -Ev '(^github.com/cilium/cilium/api/v1)|(generated.deepcopy.go)|(^github.com/cilium/cilium/pkg/k8s/client/)' \
   135  		coverage-all-tmp.out > coverage-all.out
   136  	$(QUIET)$(GO) tool cover -html=coverage-all.out -o=coverage-all.html
   137  	$(QUIET) rm coverage.out coverage-all-tmp.out
   138  
   139  unit-tests: start-kvstores
   140  	$(QUIET) $(MAKE) -C test/bpf/
   141  	test/bpf/unit-test
   142  	$(QUIET) $(MAKE) -C daemon/ check-bindata
   143  	$(MAKE) govet
   144  	$(QUIET) echo "mode: count" > coverage-all-tmp.out
   145  	$(QUIET) echo "mode: count" > coverage.out
   146  	$(QUIET)$(foreach pkg,$(patsubst %,github.com/cilium/cilium/%,$(TESTPKGS)),\
   147  		$(GO) test $(TEST_UNITTEST_LDFLAGS) $(pkg) $(GOTEST_BASE) $(GOTEST_COVER_OPTS) || exit 1; \
   148  		tail -n +2 coverage.out >> coverage-all-tmp.out;)
   149  	$(MAKE) generate-cov
   150  	@rmdir ./daemon/1 ./daemon/1_backup 2> /dev/null || true
   151  	$(MAKE) stop-kvstores
   152  
   153  bench: start-kvstores
   154  	$(QUIET)$(foreach pkg,$(patsubst %,github.com/cilium/cilium/%,$(TESTPKGS)),\
   155  		$(GO) test $(TEST_UNITTEST_LDFLAGS) $(GOTEST_BASE) $(BENCHFLAGS) \
   156  			$(pkg) \
   157  		|| exit 1;)
   158  	$(MAKE) stop-kvstores
   159  
   160  bench-privileged:
   161  	$(QUIET)$(foreach pkg,$(patsubst %,github.com/cilium/cilium/%,$(TESTPKGS)),\
   162  		$(GO) test $(TEST_UNITTEST_LDFLAGS) $(GOTEST_BASE) $(BENCHFLAGS) \
   163  			-tags=privileged_tests $(pkg) \
   164  		|| exit 1;)
   165  
   166  clean-tags:
   167  	@$(ECHO_CLEAN) tags
   168  	@-rm -f cscope.out cscope.in.out cscope.po.out cscope.files tags
   169  
   170  tags: $(GOLANG_SRCFILES) $(BPF_SRCFILES) cscope.files
   171  	ctags $(GOLANG_SRCFILES) $(BPF_SRCFILES)
   172  	@ echo $(GOLANG_SRCFILES) $(BPF_SRCFILES) | sed 's/ /\n/g' | sort > cscope.files
   173  	cscope -R -b -q
   174  
   175  clean-container:
   176  	-for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done
   177  
   178  clean: clean-container
   179  	-$(MAKE) -C ./contrib/packaging/deb clean
   180  	-$(MAKE) -C ./contrib/packaging/rpm clean
   181  	-rm -f GIT_VERSION
   182  
   183  install:
   184  	$(INSTALL) -m 0755 -d $(DESTDIR)$(BINDIR)
   185  	for i in $(SUBDIRS); do $(MAKE) -C $$i install; done
   186  
   187  install-container:
   188  	$(INSTALL) -m 0755 -d $(DESTDIR)$(BINDIR)
   189  	for i in $(SUBDIRS_CILIUM_CONTAINER); do $(MAKE) -C $$i install; done
   190  
   191  # Workaround for not having git in the build environment
   192  GIT_VERSION: .git
   193  	echo "$(GIT_VERSION)" >GIT_VERSION
   194  
   195  docker-image: clean docker-image-no-clean docker-operator-image
   196  
   197  docker-image-no-clean: GIT_VERSION
   198  	$(CONTAINER_ENGINE_FULL) build \
   199  		--build-arg LOCKDEBUG=${LOCKDEBUG} \
   200  		--build-arg V=${V} \
   201  		--build-arg LIBNETWORK_PLUGIN=${LIBNETWORK_PLUGIN} \
   202  		-t "cilium/cilium:$(DOCKER_IMAGE_TAG)" .
   203  	$(QUIET)echo "Push like this when ready:"
   204  	$(QUIET)echo "${CONTAINER_ENGINE} push cilium/cilium:$(DOCKER_IMAGE_TAG)"
   205  
   206  dev-docker-image: GIT_VERSION
   207  	$(CONTAINER_ENGINE_FULL) build \
   208  		--build-arg LOCKDEBUG=${LOCKDEBUG} \
   209  		--build-arg V=${V} \
   210  		--build-arg LIBNETWORK_PLUGIN=${LIBNETWORK_PLUGIN} \
   211  		-t "cilium/cilium-dev:$(DOCKER_IMAGE_TAG)" .
   212  	$(QUIET)echo "Push like this when ready:"
   213  	$(QUIET)echo "${CONTAINER_ENGINE} push cilium/cilium-dev:$(DOCKER_IMAGE_TAG)"
   214  
   215  docker-operator-image: GIT_VERSION
   216  	$(CONTAINER_ENGINE_FULL) build --build-arg LOCKDEBUG=${LOCKDEBUG} -f cilium-operator.Dockerfile -t "cilium/operator:$(DOCKER_IMAGE_TAG)" .
   217  	$(QUIET)echo "Push like this when ready:"
   218  	$(QUIET)echo "docker push cilium/operator:$(DOCKER_IMAGE_TAG)"
   219  
   220  docker-image-init:
   221  	$(QUIET)cd contrib/packaging/docker && ${CONTAINER_ENGINE} build -t "cilium/cilium-init:$(UTC_DATE)" -f Dockerfile.init .
   222  
   223  docker-image-runtime:
   224  	cd contrib/packaging/docker && ${CONTAINER_ENGINE} build -t "cilium/cilium-runtime:$(UTC_DATE)" -f Dockerfile.runtime .
   225  
   226  docker-image-builder:
   227  	${CONTAINER_ENGINE_FULL} build -t "cilium/cilium-builder:$(UTC_DATE)" -f Dockerfile.builder .
   228  
   229  build-deb:
   230  	$(MAKE) -C ./contrib/packaging/deb
   231  
   232  build-rpm:
   233  	$(MAKE) -C ./contrib/packaging/rpm
   234  
   235  runtime-tests:
   236  	$(MAKE) -C tests runtime-tests
   237  
   238  k8s-tests:
   239  	$(MAKE) -C tests k8s-tests
   240  
   241  generate-api: api/v1/openapi.yaml
   242  	@$(ECHO_GEN)api/v1/openapi.yaml
   243  	-$(SWAGGER) generate server -s server -a restapi \
   244  		-t api/v1 -f api/v1/openapi.yaml --default-scheme=unix -C api/v1/cilium-server.yml
   245  	-$(SWAGGER) generate client -a restapi \
   246  		-t api/v1 -f api/v1/openapi.yaml
   247  
   248  generate-health-api: api/v1/health/openapi.yaml
   249  	@$(ECHO_GEN)api/v1/health/openapi.yaml
   250  	-$(SWAGGER) generate server -s server -a restapi \
   251  		-t api/v1 -t api/v1/health/ -f api/v1/health/openapi.yaml --default-scheme=unix -C api/v1/cilium-server.yml
   252  	-$(SWAGGER) generate client -a restapi \
   253  		-t api/v1 -t api/v1/health/ -f api/v1/health/openapi.yaml
   254  
   255  generate-k8s-api:
   256  	$(call generate_k8s_api_all,github.com/cilium/cilium/pkg/k8s/apis,"cilium.io:v2")
   257  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"policy:api")
   258  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium,"pkg:node")
   259  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium,"pkg:service")
   260  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/api,"v1:models")
   261  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"k8s:types")
   262  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:policymap")
   263  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:ipcache")
   264  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:lxcmap")
   265  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:tunnel")
   266  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:encrypt")
   267  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:metricsmap")
   268  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:nat")
   269  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:lbmap")
   270  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:configmap")
   271  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:eppolicymap")
   272  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:sockmap")
   273  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium/pkg,"maps:ctmap")
   274  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium,"pkg:tuple")
   275  	$(call generate_k8s_api_deepcopy,github.com/cilium/cilium,"pkg:bpf")
   276  
   277  vps:
   278  	VBoxManage list runningvms
   279  
   280  reload:
   281  	sudo systemctl stop cilium cilium-docker
   282  	sudo $(MAKE) install
   283  	sudo systemctl start cilium cilium-docker
   284  	sleep 6
   285  	cilium status
   286  
   287  release:
   288  	$(eval TAG_VERSION := $(shell git tag | grep v$(VERSION) > /dev/null; echo $$?))
   289  	$(eval BRANCH := $(shell git rev-parse --abbrev-ref HEAD))
   290  	$(info Checking if tag $(VERSION) is created '$(TAG_VERSION)' $(BRANCH))
   291  
   292  	@if [ "$(TAG_VERSION)" -eq "0" ];then { echo Git tag v$(VERSION) is already created; exit 1; } fi
   293  	$(MAKE) -C ./contrib/packaging/deb release
   294  	git commit -m "Version $(VERSION)"
   295  	git tag v$(VERSION)
   296  	git archive --format tar $(BRANCH) | gzip > ../cilium_$(VERSION).orig.tar.gz
   297  
   298  gofmt:
   299  	$(QUIET)for pkg in $(GOFILES); do $(GO) fmt $$pkg; done
   300  
   301  govet:
   302  	@$(ECHO_CHECK) vetting all GOFILES...
   303  	$(QUIET)$(GO) vet \
   304      ./api/... \
   305      ./bugtool/... \
   306      ./cilium/... \
   307      ./cilium-health/... \
   308      ./common/... \
   309      ./daemon/... \
   310      ./operator/... \
   311      ./pkg/... \
   312      ./plugins/... \
   313      ./proxylib/... \
   314      ./test/. \
   315      ./test/config/... \
   316      ./test/ginkgo-ext/... \
   317      ./test/helpers/... \
   318      ./test/runtime/... \
   319      ./test/k8sT/... \
   320      ./tools/...
   321  
   322  ineffassign:
   323  	@$(ECHO_CHECK) ineffassign
   324  	$(QUIET) ineffassign .
   325  
   326  logging-subsys-field:
   327  	@$(ECHO_CHECK) contrib/scripts/check-logging-subsys-field.sh
   328  	$(QUIET) contrib/scripts/check-logging-subsys-field.sh
   329  
   330  check-microk8s:
   331  	@$(ECHO_CHECK) microk8s is ready...
   332  	$(QUIET)microk8s.status >/dev/null \
   333  		|| (echo "Error: Microk8s is not running" && exit 1)
   334  	$(QUIET)microk8s.status --yaml | grep -q "registry.*enabled" \
   335  		|| (echo "Error: Microk8s registry must be enabled" && exit 1)
   336  
   337  LOCAL_IMAGE_TAG=local
   338  LOCAL_IMAGE=localhost:32000/cilium/cilium:$(LOCAL_IMAGE_TAG)
   339  microk8s: check-microk8s
   340  	$(QUIET)$(MAKE) dev-docker-image DOCKER_IMAGE_TAG=$(LOCAL_IMAGE_TAG)
   341  	@echo "  DPLOY image to microk8s ($(LOCAL_IMAGE))"
   342  	$(CONTAINER_ENGINE_FULL) tag cilium/cilium-dev:$(LOCAL_IMAGE_TAG) $(LOCAL_IMAGE)
   343  	$(CONTAINER_ENGINE_FULL) push $(LOCAL_IMAGE)
   344  	$(QUIET)kubectl apply -f contrib/k8s/microk8s-prepull.yaml
   345  	$(QUIET)kubectl -n kube-system delete pod -l name=prepull
   346  	$(QUIET)kubectl -n kube-system rollout status ds/prepull
   347  	@echo
   348  	@echo "Update image tag like this when ready:"
   349  	@echo "    kubectl -n kube-system set image ds/cilium cilium-agent=$(LOCAL_IMAGE)"
   350  	@echo "Or, redeploy the Cilium pods:"
   351  	@echo "    kubectl -n kube-system delete pod -l k8s-app=cilium"
   352  
   353  precheck: ineffassign logging-subsys-field
   354  	@$(ECHO_CHECK) contrib/scripts/check-fmt.sh
   355  	$(QUIET) contrib/scripts/check-fmt.sh
   356  	@$(ECHO_CHECK) contrib/scripts/check-log-newlines.sh
   357  	$(QUIET) contrib/scripts/check-log-newlines.sh
   358  	@$(ECHO_CHECK) contrib/scripts/check-missing-tags-in-tests.sh
   359  	$(QUIET) contrib/scripts/check-missing-tags-in-tests.sh
   360  	@$(ECHO_CHECK) contrib/scripts/check-assert-deep-equals.sh
   361  	$(QUIET) contrib/scripts/check-assert-deep-equals.sh
   362  	$(QUIET) $(MAKE) -C bpf build_all
   363  
   364  pprof-help:
   365  	@echo "Available pprof targets:"
   366  	@echo "  pprof-heap"
   367  	@echo "  pprof-profile"
   368  	@echo "  pprof-block"
   369  	@echo "  pprof-trace-5s"
   370  	@echo "  pprof-mutex"
   371  
   372  pprof-heap:
   373  	$(QUIET)$(GO) tool pprof http://localhost:6060/debug/pprof/heap
   374  
   375  pprof-profile:
   376  	$(QUIET)$(GO) tool pprof http://localhost:6060/debug/pprof/profile
   377  
   378  
   379  pprof-block:
   380  	$(QUIET)$(GO) tool pprof http://localhost:6060/debug/pprof/block
   381  
   382  pprof-trace-5s:
   383  	curl http://localhost:6060/debug/pprof/trace?seconds=5
   384  
   385  pprof-mutex:
   386  	$(QUIET)$(GO) tool pprof http://localhost:6060/debug/pprof/mutex
   387  
   388  update-authors:
   389  	@echo "Updating AUTHORS file..."
   390  	@echo "The following people, in alphabetical order, have either authored or signed" > AUTHORS
   391  	@echo "off on commits in the Cilium repository:" >> AUTHORS
   392  	@echo "" >> AUTHORS
   393  	@contrib/scripts/extract_authors.sh >> AUTHORS
   394  	@cat .authors.aux >> AUTHORS
   395  
   396  docs-container:
   397  	$(QUIET)cp -r ./api ./Documentation/_api
   398  	$(CONTAINER_ENGINE_FULL) image build -t cilium/docs-builder -f Documentation/Dockerfile ./Documentation; \
   399  	  (ret=$$?; rm -r ./Documentation/_api && exit $$ret)
   400  
   401  DOCS_PORT=9081
   402  render-docs: test-docs
   403  	$(CONTAINER_ENGINE_FULL) container run --rm -dit --name docs-cilium -p $(DOCS_PORT):80 -v $$(pwd)/Documentation/_build/html/:/usr/local/apache2/htdocs/ httpd:2.4
   404  	@echo "$$(tput setaf 2)Running at http://localhost:$(DOCS_PORT)$$(tput sgr0)"
   405  
   406  test-docs: docs-container
   407  	-$(CONTAINER_ENGINE_FULL) container rm -f docs-cilium >/dev/null 2>&1 || true
   408  	$(CONTAINER_ENGINE_FULL) container run --rm -v $$(pwd):/srv/ cilium/docs-builder /bin/bash -c 'make html'
   409  
   410  manpages:
   411  	-rm -r man
   412  	mkdir -p man
   413  	cilium cmdman -d man
   414  
   415  install-manpages:
   416  	cp man/* /usr/local/share/man/man1/
   417  	mandb
   418  
   419  # Strip "tabs assets" errors from the dummy target, but fail on target failure.
   420  check-docs:
   421  	$(QUIET)($(MAKE) -C Documentation/ dummy SPHINXOPTS="$(SPHINXOPTS)" 2>&1 && touch $@.ok) \
   422  		| grep -v "tabs assets"
   423  	@rm $@.ok 2>/dev/null
   424  
   425  postcheck: build
   426  	@$(ECHO_CHECK) contrib/scripts/check-cmdref.sh
   427  	$(QUIET) MAKE=$(MAKE) contrib/scripts/check-cmdref.sh
   428  	@$(ECHO_CHECK) contrib/scripts/lock-check.sh
   429  	$(QUIET) contrib/scripts/lock-check.sh
   430  	@$(SKIP_DOCS) || $(MAKE) check-docs
   431  
   432  minikube:
   433  	$(QUIET) contrib/scripts/minikube.sh
   434  
   435  .PHONY: force generate-api generate-health-api install
   436  force :;