diff --git a/.circleci/config.yml b/.circleci/config.yml index cb1b1a5885..02fb797700 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -359,7 +359,7 @@ jobs: path: /tmp/jsonfile - run: *notify-slack-failure - # build all distros + # build is a templated job for build-x build-distros: &build-distros docker: - image: *GOLANG_IMAGE @@ -367,7 +367,13 @@ jobs: <<: *ENVIRONMENT steps: - checkout - - run: ./build-support/scripts/build-local.sh + - run: + name: Build + command: | + for os in $XC_OS; do + target="./pkg/bin/${GOOS}_${GOARCH}/" + GOOS="$os" CGO_ENABLED=0 go build -o "$target" -ldflags "$(GOLDFLAGS)" -tags "$(GOTAGS)" + done # save dev build to CircleCI - store_artifacts: @@ -380,7 +386,7 @@ jobs: environment: <<: *build-env XC_OS: "freebsd linux windows" - XC_ARCH: "386" + GOARCH: "386" # build all amd64 architecture supported OS binaries build-amd64: @@ -388,7 +394,7 @@ jobs: environment: <<: *build-env XC_OS: "darwin freebsd linux solaris windows" - XC_ARCH: "amd64" + GOARCH: "amd64" # build all arm/arm64 architecture supported OS binaries build-arm: @@ -433,7 +439,11 @@ jobs: - attach_workspace: # this normally runs as the first job and has nothing to attach; only used in main branch after rebuilding UI at: . - run: - command: make dev + name: Build + command: | + make dev + mkdir -p /home/circleci/go/bin + cp ./bin/consul /home/circleci/go/bin/consul # save dev build to pass to downstream jobs - persist_to_workspace: diff --git a/GNUmakefile b/GNUmakefile index 311a47533f..b47d04dc4f 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -1,3 +1,6 @@ +# For documentation on building consul from source, refer to: +# https://www.consul.io/docs/install#compiling-from-source + SHELL = bash GOGOVERSION?=$(shell grep github.com/gogo/protobuf go.mod | awk '{print $$2}') GOTOOLS = \ @@ -12,8 +15,6 @@ GOTOOLS = \ github.com/hashicorp/lint-consul-retry@master GOTAGS ?= -GOOS?=$(shell go env GOOS) -GOARCH?=$(shell go env GOARCH) GOPATH=$(shell go env GOPATH) MAIN_GOPATH=$(shell go env GOPATH | cut -d: -f1) @@ -134,20 +135,17 @@ ifdef SKIP_DOCKER_BUILD ENVOY_INTEG_DEPS=noop endif -# all builds binaries for all targets -all: bin +all: dev-build # used to make integration dependencies conditional noop: ; -bin: tools - @$(SHELL) $(CURDIR)/build-support/scripts/build-local.sh - -# dev creates binaries for testing locally - these are put into ./bin and $GOPATH +# dev creates binaries for testing locally - these are put into ./bin dev: dev-build dev-build: - @$(SHELL) $(CURDIR)/build-support/scripts/build-local.sh -o $(GOOS) -a $(GOARCH) + mkdir -p bin + CGO_ENABLED=0 go build -o ./bin -ldflags "$(GOLDFLAGS)" -tags "$(GOTAGS)" dev-docker: linux @echo "Pulling consul container image - $(CONSUL_IMAGE_VERSION)" @@ -175,9 +173,10 @@ ifeq ($(CIRCLE_BRANCH), main) @docker push $(CI_DEV_DOCKER_NAMESPACE)/$(CI_DEV_DOCKER_IMAGE_NAME):latest endif -# linux builds a linux package independent of the source platform +# linux builds a linux binary independent of the source platform linux: - @$(SHELL) $(CURDIR)/build-support/scripts/build-local.sh -o linux -a amd64 + mkdir -p bin + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o ./bin -ldflags "$(GOLDFLAGS)" -tags "$(GOTAGS)" # dist builds binaries for all platforms and packages them for distribution dist: diff --git a/build-support/functions/20-build.sh b/build-support/functions/20-build.sh index 7ce6d332c4..f878fb79eb 100644 --- a/build-support/functions/20-build.sh +++ b/build-support/functions/20-build.sh @@ -326,8 +326,7 @@ function build_consul { -e CGO_ENABLED=0 \ -e GOLDFLAGS="${GOLDFLAGS}" \ -e GOTAGS="${GOTAGS}" \ - ${image_name} \ - ./build-support/scripts/build-local.sh -o "${XC_OS}" -a "${XC_ARCH}") + ${image_name} make linux ret=$? if test $ret -eq 0 @@ -354,110 +353,3 @@ function build_consul { popd > /dev/null return $ret } - -function build_consul_local { - # Arguments: - # $1 - Path to the top level Consul source - # $2 - Space separated string of OSes to build. If empty will use env vars for determination. - # $3 - Space separated string of architectures to build. If empty will use env vars for determination. - # $4 - Subdirectory to put binaries in under pkg/bin (optional) - # - # Returns: - # 0 - success - # * - error - # - # Note: - # The GOLDFLAGS and GOTAGS environment variables will be used if set - # If the CONSUL_DEV environment var is truthy only the local platform/architecture is built. - # If the XC_OS or the XC_ARCH environment vars are present then only those platforms/architectures - # will be built. Otherwise all supported platform/architectures are built - # The GOXPARALLEL environment variable is used if set - - if ! test -d "$1" - then - err "ERROR: '$1' is not a directory. build_consul must be called with the path to the top level source as the first argument'" - return 1 - fi - - local sdir="$1" - local build_os="$2" - local build_arch="$3" - local extra_dir_name="$4" - local extra_dir="" - - if test -n "${extra_dir_name}" - then - extra_dir="${extra_dir_name}/" - fi - - pushd ${sdir} > /dev/null - if is_set "${CONSUL_DEV}" - then - if test -z "${XC_OS}" - then - XC_OS=$(go env GOOS) - fi - - if test -z "${XC_ARCH}" - then - XC_ARCH=$(go env GOARCH) - fi - fi - XC_OS=${XC_OS:-"solaris darwin freebsd linux windows"} - XC_ARCH=${XC_ARCH:-"386 amd64 arm arm64"} - - if test -z "${build_os}" - then - build_os="${XC_OS}" - fi - - if test -z "${build_arch}" - then - build_arch="${XC_ARCH}" - fi - - status_stage "==> Building Consul - OSes: ${build_os}, Architectures: ${build_arch}" - mkdir pkg.bin.new 2> /dev/null - - status "Building sequentially with go install" - for os in ${build_os} - do - for arch in ${build_arch} - do - outdir="pkg.bin.new/${extra_dir}${os}_${arch}" - osarch="${os}/${arch}" - - if ! supported_osarch "${osarch}" - then - continue - fi - echo "---> ${osarch}" - - mkdir -p "${outdir}" - GOBIN_EXTRA="" - if test "${os}" != "$(go env GOHOSTOS)" -o "${arch}" != "$(go env GOHOSTARCH)" - then - GOBIN_EXTRA="${os}_${arch}/" - fi - binname="consul" - if [ $os == "windows" ];then - binname="consul.exe" - fi - debug_run env CGO_ENABLED=0 GOOS=${os} GOARCH=${arch} go install -ldflags "${GOLDFLAGS}" -tags "${GOTAGS}" && cp "${MAIN_GOPATH}/bin/${GOBIN_EXTRA}${binname}" "${outdir}/${binname}" - if test $? -ne 0 - then - err "ERROR: Failed to build Consul for ${osarch}" - rm -r pkg.bin.new - return 1 - fi - done - done - - build_consul_post "${sdir}" "${extra_dir_name}" - if test $? -ne 0 - then - err "ERROR: Failed postprocessing Consul binaries" - return 1 - fi - return 0 -} diff --git a/build-support/scripts/build-local.sh b/build-support/scripts/build-local.sh deleted file mode 100755 index 45f33282d3..0000000000 --- a/build-support/scripts/build-local.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/bash -SCRIPT_NAME="$(basename ${BASH_SOURCE[0]})" -pushd $(dirname ${BASH_SOURCE[0]}) > /dev/null -SCRIPT_DIR=$(pwd) -pushd ../.. > /dev/null -SOURCE_DIR=$(pwd) -popd > /dev/null -pushd ../functions > /dev/null -FN_DIR=$(pwd) -popd > /dev/null -popd > /dev/null - -source "${SCRIPT_DIR}/functions.sh" - -function usage { -cat <<-EOF -Usage: ${SCRIPT_NAME} [] - -Description: - This script will build the Consul binary on the local system. - All the requisite tooling must be installed for this to be - successful. - -Options: - - -s | --source DIR Path to source to build. - Defaults to "${SOURCE_DIR}" - - -o | --os OSES Space separated string of OS - platforms to build. - - -a | --arch ARCH Space separated string of - architectures to build. - - -h | --help Print this help text. -EOF -} - -function err_usage { - err "$1" - err "" - err "$(usage)" -} - -function main { - declare sdir="${SOURCE_DIR}" - declare build_os="" - declare build_arch="" - - - while test $# -gt 0 - do - case "$1" in - -h | --help ) - usage - return 0 - ;; - -s | --source ) - if test -z "$2" - then - err_usage "ERROR: option -s/--source requires an argument" - return 1 - fi - - if ! test -d "$2" - then - err_usage "ERROR: '$2' is not a directory and not suitable for the value of -s/--source" - return 1 - fi - - sdir="$2" - shift 2 - ;; - -o | --os ) - if test -z "$2" - then - err_usage "ERROR: option -o/--os requires an argument" - return 1 - fi - - build_os="$2" - shift 2 - ;; - -a | --arch ) - if test -z "$2" - then - err_usage "ERROR: option -a/--arch requires an argument" - return 1 - fi - - build_arch="$2" - shift 2 - ;; - * ) - err_usage "ERROR: Unknown argument: '$1'" - return 1 - ;; - esac - done - - build_consul_local "${sdir}" "${build_os}" "${build_arch}" || return 1 - - return 0 -} - -main "$@" -exit $? \ No newline at end of file diff --git a/website/content/docs/install/index.mdx b/website/content/docs/install/index.mdx index f85405f96a..da8d113fcc 100644 --- a/website/content/docs/install/index.mdx +++ b/website/content/docs/install/index.mdx @@ -38,33 +38,57 @@ command-line, make sure to place it somewhere on your `PATH`. ## Compiling from Source To compile from source, you will need [Go](https://golang.org) installed and -configured properly (including a `GOPATH` environment variable set), as well as a copy of [`git`](https://www.git-scm.com/) in your `PATH`. -1. Clone the Consul repository from GitHub into your `GOPATH`: +1. Clone the Consul repository from GitHub: ```shell - $ mkdir -p $GOPATH/src/github.com/hashicorp && cd !$ $ git clone https://github.com/hashicorp/consul.git $ cd consul ``` -1. Bootstrap the project. This will download and compile libraries and tools - needed to compile Consul: +1. Build Consul for your target system. The binary will be placed in `./bin` + (relative to the git checkout). - ```shell - $ make tools - ``` + + + + + + ```shell-session $ make dev ``` + + + + Specify your target system by setting the following environment variables + before building: + + - `GOOS`: Target operating system. Valid values include: + `linux`, `darwin`, `windows`, `solaris`, `freebsd`. + - `GOARCH`: Target architecture. Valid values include: + `386`, `amd64`, `arm`, `arm64` + + ```shell-session + $ export GOOS=linux GOARCH=amd64 + $ make dev + ``` + + + + ## Verifying the Installation To verify Consul is properly installed, run `consul version` on your system. You