Merge pull request #10833 from jkirschner-hashicorp/improve-compile-from-source-docs
docs: improve compile from source docs
This commit is contained in:
commit
442bb7f4c4
|
@ -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:
|
||||
|
|
21
GNUmakefile
21
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:
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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} [<options ...>]
|
||||
|
||||
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 $?
|
|
@ -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
|
||||
```
|
||||
<!--
|
||||
The tabs below are intended to be indented with the step immediately
|
||||
above, but getting that to work is tricky.
|
||||
|
||||
1. Build Consul for your current system and put the binary in `./bin/`
|
||||
(relative to the git checkout). The `make dev` target is just a shortcut that
|
||||
builds `consul` for only your local build environment (no cross-compiled
|
||||
targets).
|
||||
The pre-commit linting rules will automatically unindent the <Tab>
|
||||
element upon commit. This causes compilation to fail, because <Tabs>
|
||||
and all its contained <Tab> elements need to be at the same indent level
|
||||
for compilation.
|
||||
|
||||
```shell
|
||||
To circumvent the pre-commit linting rules, commit with:
|
||||
$ git commit --no-verify
|
||||
-->
|
||||
|
||||
<Tabs>
|
||||
<Tab heading="Compile for your current system">
|
||||
|
||||
```shell-session
|
||||
$ make dev
|
||||
```
|
||||
|
||||
</Tab>
|
||||
<Tab heading="Cross-compile for another system">
|
||||
|
||||
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
|
||||
```
|
||||
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Verifying the Installation
|
||||
|
||||
To verify Consul is properly installed, run `consul version` on your system. You
|
||||
|
|
Loading…
Reference in New Issue