From 356f25be20ca0d1811687a71a712fc7655cdcea4 Mon Sep 17 00:00:00 2001 From: Ivan Mikushin Date: Mon, 14 Mar 2016 18:26:21 -0700 Subject: [PATCH] cross-build is back `HOST_ARCH=arm64 ./make.sh minimal` builds vmlinuz and initrd for arm64 on arm64 (sourcing .docker-env.arm64 in the process) `ARCH=arm ./make.sh rootfs` builds rootfs.tar.gz for arm on your current docker environment --- Dockerfile.dapper | 17 ++++++++++------- Makefile | 9 +++++++-- build.conf.arm | 1 + build.conf.arm64 | 2 +- scripts/ci | 2 +- scripts/dapper-common | 21 ++++++++++----------- scripts/make.sh | 2 +- scripts/mk-initrd.sh | 11 +++-------- scripts/mk-ros.sh | 8 +++++++- 9 files changed, 41 insertions(+), 32 deletions(-) diff --git a/Dockerfile.dapper b/Dockerfile.dapper index e0358e42..d457b461 100644 --- a/Dockerfile.dapper +++ b/Dockerfile.dapper @@ -1,24 +1,23 @@ FROM rancher/os-dapper-base -ARG ARCH -ENV ARCH ${ARCH} -ARG DOCKER_BINARY_URL -ENV DOCKER_BINARY_URL ${DOCKER_BINARY_URL} - RUN apt-get update && \ apt-get -y install locales sudo vim less curl wget git rsync build-essential isolinux xorriso gccgo \ libblkid-dev libmount-dev libselinux1-dev cpio genisoimage qemu-kvm python-pip ca-certificates pkg-config tox +ARG HOST_ARCH +ENV HOST_ARCH ${HOST_ARCH} RUN mkdir -p /usr/local && cd /usr/local && \ wget -O - https://storage.googleapis.com/golang/go1.6.src.tar.gz | tar -xz && \ - cd go/src && GOROOT_BOOTSTRAP=/usr GOARCH=${ARCH} GOHOSTARCH=${ARCH} ./make.bash + cd go/src && GOROOT_BOOTSTRAP=/usr GOARCH=${HOST_ARCH} GOHOSTARCH=${HOST_ARCH} ./make.bash ENV PATH /usr/local/go/bin:$PATH RUN mkdir -p /go/src /go/bin && chmod -R 777 /go ENV GOPATH /go ENV PATH /go/bin:$PATH -RUN wget -O - ${DOCKER_BINARY_URL} > /usr/local/bin/docker +ARG HOST_DOCKER_BINARY_URL +ENV HOST_DOCKER_BINARY_URL ${HOST_DOCKER_BINARY_URL} +RUN wget -O - ${HOST_DOCKER_BINARY_URL} > /usr/local/bin/docker RUN chmod +x /usr/local/bin/docker ENV DAPPER_DOCKER_SOCKET true @@ -35,6 +34,10 @@ CMD make ARG TOOLCHAIN ENV TOOLCHAIN ${TOOLCHAIN} +RUN if [ "${TOOLCHAIN}" != "" ] && ! which ${TOOLCHAIN}-gcc; then \ + apt-get install -y gcc-${TOOLCHAIN} g++-${TOOLCHAIN} \ + ;fi + RUN if [ "${TOOLCHAIN}" != "" ]; then \ cd /usr/local/src && \ for i in libselinux pcre3 util-linux; do \ diff --git a/Makefile b/Makefile index 65b74433..cdff12e3 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ FORCE_PULL := 0 DEV_BUILD := 0 +HOST_ARCH := amd64 ARCH := amd64 SUFFIX := $(if $(filter-out amd64,$(ARCH)),_$(ARCH)) @@ -13,7 +14,11 @@ bin/ros: build/host_ros: bin/ros mkdir -p $(dir $@) +ifeq "$(ARCH)" "$(HOST_ARCH)" ln -sf ../bin/ros $@ +else + ARCH=$(HOST_ARCH) TOOLCHAIN= VERSION=$(VERSION) ./scripts/mk-ros.sh $@ +endif assets/docker: @@ -42,7 +47,7 @@ build/kernel/: dist/artifacts/initrd: bin/ros assets/docker assets/selinux/policy.29 build/kernel/ build/images.tar mkdir -p $(dir $@) - ARCH=$(ARCH) DFS_IMAGE=$(DFS_IMAGE) DEV_BUILD=$(DEV_BUILD) ./scripts/mk-initrd.sh $@ + SUFFIX=$(SUFFIX) DFS_IMAGE=$(DFS_IMAGE) DEV_BUILD=$(DEV_BUILD) ./scripts/mk-initrd.sh $@ dist/artifacts/rancheros.iso: minimal @@ -74,7 +79,7 @@ build/images.tar: build/host_ros build/os-config.yml dist/artifacts/rootfs.tar.gz: bin/ros assets/docker build/images.tar assets/selinux/policy.29 mkdir -p $(dir $@) - ARCH=$(ARCH) DFS_IMAGE=$(DFS_IMAGE) DEV_BUILD=$(DEV_BUILD) IS_ROOTFS=1 ./scripts/mk-initrd.sh $@ + SUFFIX=$(SUFFIX) DFS_IMAGE=$(DFS_IMAGE) DEV_BUILD=$(DEV_BUILD) IS_ROOTFS=1 ./scripts/mk-initrd.sh $@ dist/artifacts/iso-checksums.txt: dist/artifacts/rancheros.iso diff --git a/build.conf.arm b/build.conf.arm index ea905e66..78e541b7 100644 --- a/build.conf.arm +++ b/build.conf.arm @@ -1,4 +1,5 @@ DAPPER_BASE=armhf/ubuntu:16.04 TOOLCHAIN=arm-linux-gnueabihf +COMPILED_KERNEL_URL= #empty DOCKER_BINARY_URL=https://github.com/rancher/docker/releases/download/v1.10.2-arm2/docker-1.10.2_arm diff --git a/build.conf.arm64 b/build.conf.arm64 index d2367db9..91c1b15d 100644 --- a/build.conf.arm64 +++ b/build.conf.arm64 @@ -1,5 +1,5 @@ DAPPER_BASE=aarch64/ubuntu:16.04 TOOLCHAIN=aarch64-linux-gnu -DOCKER_BINARY_URL=https://github.com/rancher/docker/releases/download/v1.10.2-arm2/docker-1.10.2_arm64 COMPILED_KERNEL_URL=https://github.com/imikushin/os-kernel/releases/download/Estuary-4.1.18-arm64/linux-4.1.18-arm64.tar.gz +DOCKER_BINARY_URL=https://github.com/rancher/docker/releases/download/v1.10.2-arm2/docker-1.10.2_arm64 diff --git a/scripts/ci b/scripts/ci index 4b2bcd7b..e78fd443 100755 --- a/scripts/ci +++ b/scripts/ci @@ -4,4 +4,4 @@ set -ex cd $(dirname $0)/.. . ./scripts/dapper-common -dapper -d -O make ARCH=${ARCH} DEV_BUILD=1 test +dapper -d -O make HOST_ARCH=${HOST_ARCH} ARCH=${ARCH} DEV_BUILD=1 test diff --git a/scripts/dapper-common b/scripts/dapper-common index 64bda766..3f5b7261 100755 --- a/scripts/dapper-common +++ b/scripts/dapper-common @@ -1,21 +1,20 @@ #!/bin/sh set -ex -guessArch() { - docker version | grep 'OS/Arch:' | tail -n+2 | awk '{print $2}' | cut -f2 -d'/' -} - -ARCH=${ARCH:-"$(guessArch)"} -ARCH=${ARCH:?"Failed to guess ARCH"} -export ARCH +HOST_ARCH=${HOST_ARCH:-$(docker version | grep 'OS/Arch:' | tail -n+2 | awk '{print $2}' | cut -f2 -d'/')} +HOST_ARCH=${HOST_ARCH:?"Failed to guess HOST_ARCH"} +ARCH=${ARCH:-"$HOST_ARCH"} +export HOST_ARCH ARCH cd $(dirname $0)/.. -[ -f "./.docker-env.${ARCH}" ] && . ./.docker-env.${ARCH} || echo "WARNING: missing .docker-env.${ARCH} (to use an ${ARCH} docker host)" +[ -f "./.docker-env.${HOST_ARCH}" ] && . ./.docker-env.${HOST_ARCH} || echo "WARNING: missing .docker-env.${HOST_ARCH} (to use an ${HOST_ARCH} docker host)" + +. ./build.conf.${HOST_ARCH} +export HOST_DOCKER_BINARY_URL=${DOCKER_BINARY_URL} +docker inspect $DAPPER_BASE >/dev/null 2>&1 || docker pull $DAPPER_BASE +docker tag $DAPPER_BASE rancher/os-dapper-base set -a . ./build.conf.${ARCH} set +a - -docker inspect $DAPPER_BASE >/dev/null 2>&1 || docker pull $DAPPER_BASE -docker tag $DAPPER_BASE rancher/os-dapper-base diff --git a/scripts/make.sh b/scripts/make.sh index b040e471..4b84c0b0 100755 --- a/scripts/make.sh +++ b/scripts/make.sh @@ -4,4 +4,4 @@ set -e cd $(dirname $0)/.. . ./scripts/dapper-common -dapper make ARCH=${ARCH} "$@" +dapper make HOST_ARCH=${HOST_ARCH} ARCH=${ARCH} "$@" diff --git a/scripts/mk-initrd.sh b/scripts/mk-initrd.sh index 9f34f1b7..31c02ad0 100755 --- a/scripts/mk-initrd.sh +++ b/scripts/mk-initrd.sh @@ -3,15 +3,10 @@ set -ex TARGET=$(pwd)/${1} -ARCH=${ARCH:?"ARCH not set"} +SUFFIX=${SUFFIX:-""} DFS_IMAGE=${DFS_IMAGE:?"DFS_IMAGE not set"} IS_ROOTFS=${IS_ROOTFS:-0} -suffix="" -[ "$ARCH" == "amd64" ] || suffix="_${ARCH}" - -DFS_ARCH_IMAGE=${DFS_IMAGE}${suffix} - cd $(dirname $0)/.. . scripts/build-common @@ -41,7 +36,7 @@ cp assets/selinux/seusers ${INITRD_DIR}/usr/etc/selinux/ros/ cp assets/selinux/lxc_contexts ${INITRD_DIR}/usr/etc/selinux/ros/contexts/ cp assets/selinux/failsafe_context ${INITRD_DIR}/usr/etc/selinux/ros/contexts/ -DFS_ARCH=$(docker create ${DFS_ARCH_IMAGE}) +DFS_ARCH=$(docker create ${DFS_IMAGE}${SUFFIX}) trap "docker rm -fv ${DFS_ARCH}" EXIT docker export ${DFS_ARCH} | tar xvf - -C ${INITRD_DIR} --exclude=usr/bin/dockerlaunch \ @@ -53,7 +48,7 @@ docker export ${DFS_ARCH} | tar xvf - -C ${INITRD_DIR} --exclude=usr/bin/dockerl usr if [ "$IS_ROOTFS" == "1" ]; then - DFS=$(docker run -d --privileged -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) ${DFS_ARCH_IMAGE}) + DFS=$(docker run -d --privileged -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) ${DFS_IMAGE}) trap "docker rm -fv ${DFS_ARCH} ${DFS}" EXIT docker exec -i ${DFS} docker load < ${BUILD}/images.tar docker stop ${DFS} diff --git a/scripts/mk-ros.sh b/scripts/mk-ros.sh index 6f32d6af..59034235 100755 --- a/scripts/mk-ros.sh +++ b/scripts/mk-ros.sh @@ -8,6 +8,12 @@ VERSION=${VERSION:?"VERSION not set"} cd $(dirname $0)/.. +strip_bin=$(which strip) [ "${ARCH}" == "arm" ] && export GOARM=6 +if [ "${TOOLCHAIN}" != "" ]; then + export CC=/usr/bin/${TOOLCHAIN}-gcc + export CGO_ENABLED=1 + strip_bin=/usr/${TOOLCHAIN}/bin/strip +fi GOARCH=${ARCH} go build -tags netgo -installsuffix netgo -ldflags "-X github.com/rancher/os/config.VERSION=${VERSION} -linkmode external -extldflags -static" -o ${ros} -strip --strip-all ${ros} +${strip_bin} --strip-all ${ros}