centralized all working directories at .work in the root of the tree. also centralize all download directories to .download at the root of the tree. cleaned up the rsync behavior between host and docker cross build when running on non-linux host.
315 lines
8.6 KiB
Makefile
315 lines
8.6 KiB
Makefile
# Copyright 2016 The Rook Authors. All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
# set the shell to bash in case some environments use sh
|
|
.PHONY: all
|
|
all: build
|
|
|
|
# ====================================================================================
|
|
# Build Options
|
|
|
|
# set the shell to bash in case some environments use sh
|
|
SHELL := /bin/bash
|
|
|
|
# Can be used for additional go build flags
|
|
BUILDFLAGS ?=
|
|
LDFLAGS ?=
|
|
TAGS ?=
|
|
|
|
# if set to 'dynamic' all dependencies are dynamically linked. if
|
|
# set to 'static' all dependencies will be statically linked. If set
|
|
# to 'stdlib' then the standard library will be dynamically
|
|
# linked and everything else will be statically linked.
|
|
LINKMODE ?= dynamic
|
|
ifeq ($(LINKMODE),dynamic)
|
|
TAGS += dynamic
|
|
else
|
|
ifeq ($(LINKMODE),stdlib)
|
|
TAGS += stdlib
|
|
else
|
|
TAGS += static
|
|
endif
|
|
endif
|
|
|
|
# build a position independent executable. This implies dynamic linking
|
|
# since statically-linked PIE is not supported by the linker/glibc. PIE
|
|
# is only supported on Linux.
|
|
PIE ?= 0
|
|
ifeq ($(PIE),1)
|
|
ifeq ($(LINKMODE),static)
|
|
$(error PIE only supported with dynamic linking. Set LINKMODE=dynamic or LINKMODE=stdlib.)
|
|
endif
|
|
endif
|
|
|
|
# turn on more verbose build
|
|
V ?= 0
|
|
ifeq ($(V),1)
|
|
LDFLAGS += -v -n
|
|
BUILDFLAGS += -x
|
|
MAKEFLAGS += VERBOSE=1
|
|
else
|
|
MAKEFLAGS += --no-print-directory
|
|
endif
|
|
|
|
# the operating system and arch to build
|
|
GOOS ?= $(shell go env GOOS)
|
|
GOARCH ?= $(shell go env GOARCH)
|
|
|
|
# the working directory to store packages and intermediate build files
|
|
WORKDIR ?= $(abspath .work)
|
|
DOWNLOADDIR ?= $(abspath .download)
|
|
|
|
# bin and relase dirs
|
|
BIN_DIR=bin
|
|
RELEASE_DIR=release
|
|
|
|
ALL_PLATFORMS ?= linux_amd64 linux_arm64 darwin_amd64 windows_amd64
|
|
|
|
GO_PROJECT=github.com/rook/rook
|
|
|
|
# set the version number. you should not need to do this
|
|
# for the majority of scenarios.
|
|
ifeq ($(origin VERSION), undefined)
|
|
VERSION = $(shell git describe --dirty --always --tags)
|
|
endif
|
|
LDFLAGS += -X $(GO_PROJECT)/pkg/version.Version=$(VERSION)
|
|
|
|
# the release channel. Can be set to master, alpha, beta or stable
|
|
CHANNEL ?=
|
|
|
|
# ====================================================================================
|
|
# Setup Go projects
|
|
|
|
# support for cross compiling
|
|
include build/makelib/cross.mk
|
|
|
|
ifeq ($(GOOS),linux)
|
|
|
|
# Set the memory allocator used for ceph
|
|
CEPH_BRANCH ?= kraken
|
|
|
|
# Set the memory allocator used for ceph
|
|
ALLOCATOR ?= tcmalloc_minimal
|
|
|
|
ifeq ($(ALLOCATOR),jemalloc)
|
|
TAGS += jemalloc
|
|
else
|
|
ifeq ($(ALLOCATOR),tcmalloc_minimal)
|
|
TAGS += tcmalloc_minimal
|
|
else
|
|
endif
|
|
endif
|
|
|
|
# Set the cgo flags to link externals
|
|
CGO_CFLAGS = -I$(abspath $(WORKDIR)/build/$(CROSS_TRIPLE)/include)
|
|
CGO_LDFLAGS = -L$(abspath $(WORKDIR)/build/$(CROSS_TRIPLE)/lib)
|
|
|
|
endif
|
|
|
|
GO_BIN_DIR = $(BIN_DIR)
|
|
|
|
ifeq ($(LINKMODE),static)
|
|
GO_STATIC_PACKAGES=$(GO_PROJECT)
|
|
ifeq ($(GOOS),linux)
|
|
GO_STATIC_CGO_PACKAGES=$(GO_PROJECT)/cmd/rookd
|
|
endif
|
|
else
|
|
GO_NONSTATIC_PACKAGES=$(GO_PROJECT)
|
|
ifeq ($(GOOS),linux)
|
|
ifeq ($(PIE),1)
|
|
GO_NONSTATIC_PIE_PACKAGES+= $(GO_PROJECT)/cmd/rookd
|
|
else
|
|
GO_NONSTATIC_PACKAGES+= $(GO_PROJECT)/cmd/rookd
|
|
endif
|
|
endif
|
|
endif
|
|
|
|
GO_BUILDFLAGS=$(BUILDFLAGS)
|
|
GO_LDFLAGS=$(LDFLAGS)
|
|
GO_TAGS=$(TAGS)
|
|
|
|
GO_WORK_DIR ?= $(WORKDIR)
|
|
GO_TOOLS_DIR ?= $(DOWNLOADDIR)/tools
|
|
GO_PKG_DIR ?= $(WORKDIR)/pkg
|
|
|
|
include build/makelib/golang.mk
|
|
|
|
# ====================================================================================
|
|
# Setup Distribution
|
|
|
|
RELEASE_VERSION=$(VERSION)
|
|
RELEASE_CHANNEL=$(CHANNEL)
|
|
RELEASE_BIN_DIR=$(BIN_DIR)
|
|
RELEASE_PLATFORMS=$(ALL_PLATFORMS)
|
|
include build/makelib/release.mk
|
|
|
|
# ====================================================================================
|
|
# External Targets
|
|
|
|
export WORKDIR DOWNLOADDIR CEPH_BRANCH ALLOCATOR
|
|
|
|
ifneq ($(ALWAYS_BUILD),)
|
|
export ALWAYS_BUILD
|
|
endif
|
|
|
|
external:
|
|
ifeq ($(GOOS),linux)
|
|
@$(MAKE) -C external PLATFORMS=$(CROSS_TRIPLE) cross
|
|
endif
|
|
|
|
$(WORKDIR)/build/$(CROSS_TRIPLE)/lib/libcephd.a:
|
|
@$(MAKE) external
|
|
|
|
external.clean:
|
|
@$(MAKE) -C external clean
|
|
|
|
external.distclean:
|
|
@$(MAKE) -C external distclean
|
|
|
|
.PHONY: external external.clean external.distclean
|
|
|
|
# ====================================================================================
|
|
# Targets
|
|
|
|
dev: $(WORKDIR)/build/$(CROSS_TRIPLE)/lib/libcephd.a
|
|
@$(MAKE) go.init
|
|
@$(MAKE) go.validate
|
|
@$(MAKE) go.build
|
|
@$(MAKE) release.build.containers.$(GOOS)_$(GOARCH)
|
|
|
|
build.common:
|
|
@$(MAKE) go.init
|
|
@$(MAKE) go.validate
|
|
@$(MAKE) external
|
|
|
|
build: build.common
|
|
@$(MAKE) go.build
|
|
|
|
install: build.common
|
|
@$(MAKE) go.install
|
|
|
|
check test: build.common
|
|
@$(MAKE) go.test
|
|
|
|
lint:
|
|
@$(MAKE) go.init
|
|
@$(MAKE) go.lint
|
|
|
|
vet:
|
|
@$(MAKE) go.init
|
|
@$(MAKE) go.vet
|
|
|
|
fmt:
|
|
@$(MAKE) go.init
|
|
@$(MAKE) go.fmt
|
|
|
|
vendor: go.vendor
|
|
|
|
clean: go.clean external.clean
|
|
@rm -fr $(WORKDIR) $(RELEASE_DIR)/* $(BIN_DIR)/*
|
|
|
|
distclean: go.distclean clean external.distclean
|
|
@rm -fr $(DOWNLOADDIR)
|
|
|
|
cross.build:
|
|
@$(MAKE) external
|
|
@$(MAKE) go.build
|
|
|
|
cross.build.platform.%:
|
|
@$(MAKE) GOOS=$(word 1, $(subst _, ,$*)) GOARCH=$(word 2, $(subst _, ,$*)) cross.build
|
|
|
|
cross.parallel: $(foreach p,$(ALL_PLATFORMS), cross.build.platform.$(p))
|
|
|
|
cross:
|
|
@$(MAKE) go.init
|
|
@$(MAKE) go.validate
|
|
@$(MAKE) cross.parallel
|
|
|
|
release: cross
|
|
@$(MAKE) release.build
|
|
|
|
publish:
|
|
ifneq ($(filter master alpha beta stable, $(CHANNEL)),)
|
|
@$(MAKE) release.publish
|
|
else
|
|
@echo skipping publish. invalid channel "$(CHANNEL)"
|
|
endif
|
|
|
|
promote:
|
|
ifneq ($(filter master alpha beta stable, $(CHANNEL)),)
|
|
@$(MAKE) release.promote
|
|
else
|
|
@echo skipping promote. invalid channel "$(CHANNEL)"
|
|
endif
|
|
|
|
publish.cleanup:
|
|
ifneq ($(filter master alpha beta stable, $(CHANNEL)),)
|
|
@$(MAKE) release.cleanup
|
|
else
|
|
@echo skipping publish.cleanup. invalid channel "$(CHANNEL)"
|
|
endif
|
|
|
|
.PHONY: build.common cross.build cross.parallel
|
|
.PHONY: dev build install test check vet fmt vendor clean distclean cross release publish
|
|
|
|
# ====================================================================================
|
|
# Help
|
|
|
|
.PHONY: help
|
|
help:
|
|
@echo 'Usage: make <OPTIONS> ... <TARGETS>'
|
|
@echo ''
|
|
@echo 'Targets:'
|
|
@echo ' build Build project for host platform.'
|
|
@echo ' cross Build project for all platforms.'
|
|
@echo ' check Runs unit tests.'
|
|
@echo ' clean Remove all files that are created '
|
|
@echo ' by building.'
|
|
@echo ' dev A quick build path for go projects'
|
|
@echo ' and containers. Skips building externals.'
|
|
@echo ' distclean Remove all files that are created '
|
|
@echo ' by building or configuring.'
|
|
@echo ' fmt Check formatting of go sources.'
|
|
@echo ' lint Check syntax and styling of go sources.'
|
|
@echo ' help Show this help info.'
|
|
@echo ' vendor Installs vendor dependencies.'
|
|
@echo ' vet Runs lint checks on go sources.'
|
|
@echo ''
|
|
@echo 'Distribution:'
|
|
@echo ' release Builds all packages.'
|
|
@echo ' publish Publishes all packages from a release.'
|
|
@echo ''
|
|
@echo 'Options:'
|
|
@echo ' CHANNEL Sets the release channel. Can be set to master,'
|
|
@echo ' alpha, beta, or stable. Default is not set.'
|
|
@echo ' DOWNLOADDIR A directory where downloaded files and other'
|
|
@echo ' files used during the build are cached. These'
|
|
@echo ' files help speedup the build by avoding network'
|
|
@echo ' transfers. Its safe to use these files across builds.'
|
|
@echo ' GOARCH The arch to build.'
|
|
@echo ' GOOS The OS to build for.'
|
|
@echo ' LINKMODE Set to "dynamic" to link all libraries dynamically.'
|
|
@echo ' Set to "stdlib" to link the standard library'
|
|
@echo ' dynamically and everything else statically. Set to'
|
|
@echo ' "static" to link everything statically. Default is'
|
|
@echo ' "dynamic".'
|
|
@echo ' PIE Set to 1 to build build a position independent'
|
|
@echo ' executable. Can not be combined with LINKMODE'
|
|
@echo ' set to "static". The default is 0.'
|
|
@echo ' VERSION The version information compiled into binaries.'
|
|
@echo ' The default is obtained from git.'
|
|
@echo ' V Set to 1 enable verbose build. Default is 0.'
|
|
@echo ' WORKDIR The working directory where most build files'
|
|
@echo ' are stored. The default is .work'
|