diff --git a/Makefile b/Makefile index d732656f7..3f5eabf82 100644 --- a/Makefile +++ b/Makefile @@ -104,7 +104,7 @@ CEPHD_PLATFORM = $(GOOS)_$(GOARCH) CEPHD_TOUCH_ON_BUILD = pkg/cephmgr/cephd/dummy.cc GO_CGO_PACKAGES=cmd/castled -CGO_LDFLAGS = -L$(CURDIR)/$(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM)/lib +CGO_LDFLAGS = -L$(abspath $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM)/lib) CGO_PREREQS = cephd.build include build/makelib/cephd.mk diff --git a/build/cross-image/Dockerfile b/build/cross-image/Dockerfile index 7e5c7c7ed..23c868929 100644 --- a/build/cross-image/Dockerfile +++ b/build/cross-image/Dockerfile @@ -1,12 +1,10 @@ FROM ubuntu:xenial MAINTAINER Bassam Tabbara -RUN echo \ - "deb [arch=amd64] http://archive.ubuntu.com/ubuntu xenial main universe restricted\n\ - deb [arch=amd64] http://archive.ubuntu.com/ubuntu xenial-updates main universe restricted\n\ - deb [arch=arm64] http://ports.ubuntu.com/ xenial main universe restricted\n\ - deb [arch=arm64] http://ports.ubuntu.com/ xenial-updates main universe restricted\n\ - " > /etc/apt/sources.list && \ +RUN echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu xenial main universe restricted" > /etc/apt/sources.list &&\ + echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu xenial-updates main universe restricted" >> /etc/apt/sources.list &&\ + echo "deb [arch=arm64] http://ports.ubuntu.com/ xenial main universe restricted" >> /etc/apt/sources.list &&\ + echo "deb [arch=arm64] http://ports.ubuntu.com/ xenial-updates main universe restricted" >> /etc/apt/sources.list &&\ dpkg --add-architecture arm64 && \ apt-get update @@ -53,9 +51,11 @@ ENV PATH /usr/local/osxcross/bin:$PATH RUN ACBUILD_VERSION=0.4.0 && \ curl -fsSLO https://github.com/containers/build/releases/download/v${ACBUILD_VERSION}/acbuild-v${ACBUILD_VERSION}.tar.gz && \ tar -C /usr/local/bin --strip-components=1 -xzf acbuild-v${ACBUILD_VERSION}.tar.gz && \ + rm -f acbuild-v${ACBUILD_VERSION}.tar.gz && \ DOCKER2ACI_VERSION=0.12.3 && \ curl -fsSLO https://github.com/appc/docker2aci/releases/download/v${DOCKER2ACI_VERSION}/docker2aci-v${DOCKER2ACI_VERSION}.tar.gz && \ - tar -C /usr/local/bin --strip-components=1 -xzf docker2aci-v${DOCKER2ACI_VERSION}.tar.gz + tar -C /usr/local/bin --strip-components=1 -xzf docker2aci-v${DOCKER2ACI_VERSION}.tar.gz && \ + rm -f docker2aci-v${DOCKER2ACI_VERSION}.tar.gz # # install multi-arch packages needed to build ceph diff --git a/build/makelib/cephd.mk b/build/makelib/cephd.mk index 2569d1f2d..d1b43739c 100644 --- a/build/makelib/cephd.mk +++ b/build/makelib/cephd.mk @@ -49,7 +49,7 @@ cephd.config: @mkdir -p $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM) @echo "$(CEPHD_CMAKE)" > $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM)/cephd.cmake.new @if test ! -f $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM)/cephd.cmake || ! diff $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM)/cephd.cmake.new $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM)/cephd.cmake > /dev/null; then \ - cd $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM) && cmake $(CEPHD_CMAKE) -DCMAKE_TOOLCHAIN_FILE=$(CURDIR)/build/makelib/toolchain.$(CEPHD_PLATFORM).cmake $(CURDIR)/ceph; \ + cd $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM) && cmake $(CEPHD_CMAKE) -DCMAKE_TOOLCHAIN_FILE=$(abspath build/makelib/toolchain.$(CEPHD_PLATFORM).cmake) $(abspath ceph); \ echo "$(CEPHD_CMAKE)" > cephd.cmake; \ fi @rm $(CEPHD_BUILD_DIR)/$(CEPHD_PLATFORM)/cephd.cmake.new diff --git a/build/makelib/golang.mk b/build/makelib/golang.mk index ea094d09e..12015a43b 100644 --- a/build/makelib/golang.mk +++ b/build/makelib/golang.mk @@ -63,21 +63,17 @@ unexport CGO_ENABLED export CGO_CFLAGS CGO_CPPFLAGS CGO_LDFLAGS GLIDE_HOME # setup glide -GLIDE_HOME := $(CURDIR)/.glide +GLIDE_HOME := $(abspath .glide) GLIDE := $(GO_TOOLS_DIR)/glide GO := go GOHOST := GOOS=$(GOHOSTOS) GOARCH=$(GOHOSTARCH) go -ifeq ($(GOOS)_$(GOARCH),$(GOHOSTOS)_$(GOHOSTARCH)) -GO_OUT_DIR := $(CURDIR)/$(GO_BIN_DIR) -else -GO_OUT_DIR := $(CURDIR)/$(GO_BIN_DIR)/$(GOOS)_$(GOARCH) -endif +GO_OUT_DIR := $(abspath $(GO_BIN_DIR)/$(GOOS)_$(GOARCH)) ifneq ($(GO_PKG_DIR),) -GO_PKG_FLAGS := -pkgdir $(CURDIR)/$(GO_PKG_DIR)/$(GOOS)_$(GOARCH) -GO_PKG_STATIC_FLAGS := -pkgdir $(CURDIR)/$(GO_PKG_DIR)/$(GOOS)_$(GOARCH)_static -installsuffix static +GO_PKG_FLAGS := -pkgdir $(abspath $(GO_PKG_DIR)/$(GOOS)_$(GOARCH)) +GO_PKG_STATIC_FLAGS := -pkgdir $(abspath $(GO_PKG_DIR)/$(GOOS)_$(GOARCH)_static) -installsuffix static else GO_PKG_STATIC_FLAGS := -installsuffix static endif @@ -85,8 +81,7 @@ endif # ==================================================================================== # Targets -ifneq ($(MAKECMDGOALS), help) -ifneq ($(MAKECMDGOALS), clean) +ifeq ($(filter help clean distclean, $(MAKECMDGOALS)),) .PHONY: go.check go.check: ifneq ($(shell $(GO) version | grep -q -E '\bgo($(GO_SUPPORTED_VERSIONS))\b' && echo 0 || echo 1), 0) @@ -103,7 +98,6 @@ go.init: $(GO_VENDOR_DIR)/vendor.stamp -include go.init endif -endif .PHONY: go.build go.build: go.vet go.fmt $(CGO_PREREQS) diff --git a/build/run b/build/run index 36f68b665..bbe937d59 100755 --- a/build/run +++ b/build/run @@ -1,10 +1,10 @@ #!/bin/bash -e scriptdir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - friendly_name=cross-build version=$(cat ${scriptdir}/cross-image/version) container=quantum/castle-${friendly_name}:${version} +volume=cross-build function ver() { printf "%d%03d%03d%03d" $(echo "$1" | tr '.' ' ') @@ -28,40 +28,55 @@ if [ ! -z $DOCKER_HOST ]; then return 1 fi +# if our volume does not exist create one. +# NOTE: osxfs is really slow so we avoid using it +if [[ ! $(docker volume ls | grep $volume) ]]; then + echo ==== Creating docker volume ${volume} + docker volume create --name ${volume} +fi + # if the container does not exist the pull or build it if [[ ! $(docker images -q ${container}) ]]; then + echo ==== Pulling ${container} docker pull ${container} fi -USER_ARGS="-e BUILDER_UID=$( id -u ) -e BUILDER_GID=$( id -g ) -e BUILDER_USER=$( id -un ) -e BUILDER_GROUP=$( id -gn )" -BUILDER_HOME=/home/$( id -un ) +# on Linux we run the container with the same uid and gid of the user to avoid +# permissions issues. For docker on macOS this is not needed since we rely on osxfs +if [ "`uname -s`" == "Linux" ]; then + USER_ARGS="-e BUILDER_UID=$( id -u ) -e BUILDER_GID=$( id -g ) -e BUILDER_USER=$( id -un ) -e BUILDER_GROUP=$( id -gn )" + BUILDER_HOME=/home/$( id -un ) +else + BUILDER_HOME=/root +fi -if [ -n ${CCACHE_DIR+x} ]; then +if [[ `which ccache` && -n "${CCACHE_DIR}" ]]; then CCACHE_ARGS="-e CCACHE_DIR=${BUILDER_HOME}/.ccache -e CCACHE_LOG -v ${CCACHE_DIR}:${BUILDER_HOME}/.ccache" fi +# we copy credential files for github access [[ -f ${HOME}/.netrc ]] && NETRC_ARGS="-v ${HOME}/.netrc:${BUILDER_HOME}/.netrc" tty -s && TTY_ARGS=-ti || TTY_ARGS= +# docker seems more reliable when running with net=host. if [ -z "${DISABLE_HOST_NETWORK}" ]; then NET_ARGS="--net=host" fi +# sometimes we run docker inside docker. bind the docker config and socket if [ -z "${DISABLE_NESTED_DOCKER}" ]; then DOCKER_NESTED_ARGS="\ -v ${HOME}/.docker/config.json:${BUILDER_HOME}/.docker/config.json \ -v /var/run/docker.sock:/var/run/docker.sock" fi -# NOTE: docker seems more reliable when running with net=host. - docker run \ --rm \ --name "${friendly_name}" \ --hostname "${friendly_name}" \ -e GOPATH="${BUILDER_HOME}/go" \ - -e WORKDIR=".work/cross" \ + -e WORKDIR="${BUILDER_HOME}/go/.cross" \ -e GO_PKG_DIR="" \ -e GITHUB_TOKEN \ -e VERSION \ @@ -71,8 +86,8 @@ docker run \ ${USER_ARGS} \ ${DOCKER_NESTED_ARGS} \ ${NET_ARGS} \ + -v cross-build:${BUILDER_HOME}/go \ -v ${scriptdir}/../bin:${BUILDER_HOME}/go/bin \ - -v ${scriptdir}/../.work/cross/pkg:${BUILDER_HOME}/go/pkg \ -v ${scriptdir}/..:${BUILDER_HOME}/go/src/github.com/quantum/castle \ -w ${BUILDER_HOME}/go/src/github.com/quantum/castle \ ${container} \