# Copyright 2017-2020 Authors of Cilium # SPDX-License-Identifier: Apache-2.0 SHELL := /bin/bash .SHELLFLAGS := -eu -o pipefail -c # define a function replacing spaces with commas in a list empty := space := $(empty) $(empty) comma := , join-with-comma = $(subst $(space),$(comma),$(strip $1)) ROOT_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) RELATIVE_DIR := $(shell echo $(realpath .) | sed "s;$(ROOT_DIR)[/]*;;") include $(ROOT_DIR)/Makefile.quiet PREFIX?=/usr BINDIR?=$(PREFIX)/bin CNIBINDIR?=/opt/cni/bin CNICONFDIR?=/etc/cni/net.d LIBDIR?=$(PREFIX)/lib LOCALSTATEDIR?=/var RUNDIR?=/var/run CONFDIR?=/etc INSTALL = install CONTAINER_ENGINE?=docker # Set DOCKER_DEV_ACCOUNT with "cilium" by default ifeq ($(DOCKER_DEV_ACCOUNT),) DOCKER_DEV_ACCOUNT="cilium" endif # Set DOCKER_IMAGE_TAG with "latest" by default ifeq ($(DOCKER_IMAGE_TAG),) DOCKER_IMAGE_TAG="latest" endif ifeq ($(shell uname -m),aarch64) ETCD_IMAGE=quay.io/coreos/etcd:v3.3.20-arm64 else ETCD_IMAGE=quay.io/coreos/etcd:v3.3.20 endif CONSUL_IMAGE=consul:1.7.2 GO ?= go # go build/test/clean flags # these are declared here so they are treated explicitly # as non-immediate variables GO_BUILD_FLAGS = GO_TEST_FLAGS = GO_CLEAN_FLAGS = GO_BUILD_LDFLAGS = # go build/test -tags values GO_TAGS_FLAGS = osusergo # This is declared here as it is needed to change the covermode depending on if # RACE is specified. GOTEST_COVER_OPTS = VERSION = $(shell cat $(dir $(lastword $(MAKEFILE_LIST)))/VERSION) VERSION_MAJOR = $(shell cat $(dir $(lastword $(MAKEFILE_LIST)))/VERSION | cut -d. -f1) # Use git only if in a Git repo ifneq ($(wildcard $(dir $(lastword $(MAKEFILE_LIST)))/.git),) GIT_VERSION = $(shell git show -s --format='format:%h %aI') else GIT_VERSION = $(shell cat $(ROOT_DIR)/GIT_VERSION) endif FULL_BUILD_VERSION = $(VERSION) $(GIT_VERSION) GO_BUILD_LDFLAGS += -X "github.com/cilium/cilium/pkg/version.ciliumVersion=$(FULL_BUILD_VERSION)" ifeq ($(NOSTRIP),) # Note: these options will not remove annotations needed for stack # traces, so panic backtraces will still be readable. # # -w: Omit the DWARF symbol table. # -s: Omit the symbol table and debug information. GO_BUILD_LDFLAGS += -s -w endif CILIUM_ENVOY_SHA=$(shell grep -o "FROM.*cilium/cilium-envoy:[0-9a-fA-F]*" $(ROOT_DIR)/Dockerfile | cut -d : -f 2) GO_BUILD_LDFLAGS += -X "github.com/cilium/cilium/pkg/envoy.RequiredEnvoyVersionSHA=$(CILIUM_ENVOY_SHA)" # Use git only if in a Git repo, otherwise find the files from the file system BPF_SRCFILES_IGNORE = bpf/.gitignore ifneq ($(wildcard $(dir $(lastword $(MAKEFILE_LIST)))/.git),) BPF_SRCFILES := $(shell git ls-files $(ROOT_DIR)/bpf/ | LC_ALL=C sort | tr "\n" ' ') else # this line has to be in-sync with bpf/.gitignore, please note usage of make patterns like `%.i` BPF_SRCFILES_IGNORE += bpf/cilium-map-migrate bpf/cilium-probe-kernel-hz bpf/%.i bpf/%.s bpf/.rebuild_all BPF_SRCFILES := $(shell find $(ROOT_DIR)/bpf/ -type f | LC_ALL=C sort | tr "\n" ' ') endif # ROOT_DIR can be either `../` or absolute path, each of these need to be stripped BPF_SRCFILES := $(filter-out $(BPF_SRCFILES_IGNORE),$(subst ../,,$(subst $(ROOT_DIR)/,,$(BPF_SRCFILES)))) CILIUM_DATAPATH_SHA=$(shell cd $(ROOT_DIR); cat $(BPF_SRCFILES) | sha1sum | awk '{print $$1}') GO_BUILD_LDFLAGS += -X "github.com/cilium/cilium/pkg/datapath/loader.DatapathSHA=$(CILIUM_DATAPATH_SHA)" # Set -mod=vendor if running >= go 1.13 or if GO111MODULE is set. # A go build is being executed with go modules if: # * The go command is invoked with GO111MODULE=on environment variable set. # * The go command is invoked in a directory outside of the $GOPATH/src tree # and the environment variable GO111MODULE unset (or explicitly set to 'auto'). ifeq ($(GO111MODULE),on) GO_BUILD_FLAGS += -mod=vendor GO_TEST_FLAGS += -mod=vendor GO_CLEAN_FLAGS += -mod=vendor else GO_MAJOR_VERSION_GE_1 := $(shell expr `$(GO) version | grep -E 'go[0-9]{1}+' -o | sed 's/go//g'` \>= 1) ifeq ($(GO_MAJOR_VERSION_GE_1),1) GO_MINOR_VERSION_GE_13 := $(shell expr `$(GO) version | grep -E 'go[^ ]+' -o | sed 's/go1.//g'` \>= 13) ifeq ($(GO_MINOR_VERSION_GE_13),1) GO_BUILD_FLAGS += -mod=vendor GO_TEST_FLAGS += -mod=vendor GO_CLEAN_FLAGS += -mod=vendor endif endif endif GO_BUILD = CGO_ENABLED=0 $(GO) build GO_BUILD_WITH_CGO = CGO_ENABLED=1 $(GO) build ifneq ($(RACE),) GO_BUILD_FLAGS += -race GO_TEST_FLAGS += -race GOTEST_COVER_OPTS += -covermode=atomic # GO_BUILD becomes GO_BUILD_WITH_CGO as `-race` requires CGO GO_BUILD = $(GO_BUILD_WITH_CGO) else GOTEST_COVER_OPTS += -covermode=count endif ifneq ($(LOCKDEBUG),) GO_TAGS_FLAGS += lockdebug endif GO_BUILD_FLAGS += -ldflags '$(GO_BUILD_LDFLAGS) $(EXTRA_GO_BUILD_LDFLAGS)' -tags=$(call join-with-comma,$(GO_TAGS_FLAGS)) $(EXTRA_GO_BUILD_FLAGS) GO_TEST_FLAGS += -tags=$(call join-with-comma,$(GO_TAGS_FLAGS)) GO_BUILD += $(GO_BUILD_FLAGS) GO_BUILD_WITH_CGO += $(GO_BUILD_FLAGS) GO_TEST = $(GO) test $(GO_TEST_FLAGS) GO_CLEAN = $(GO) clean $(GO_CLEAN_FLAGS) # TODO: remove `GO111MODULE=off` once Go 1.13 is deprecated by Go maintainers GO_VET = GO111MODULE=off $(GO) vet GO_LIST = GO111MODULE=off $(GO) list