Message ID | 20170214100733.22280-3-alex.bennee@linaro.org |
---|---|
State | New |
Headers | show |
Series | Docker cross-compile targets and user build support | expand |
On Tue, 02/14 10:07, Alex Bennée wrote: > This provides a basic Debian install with access to the emdebian cross > compilers. The debian-armhf-cross and debian-arm64-cross targets build > on the basic Debian image to allow cross compiling to those targets. > > To build against the cross compiler a cross-compile prefix needs to be > set in the configure options, for example: > > make docker-test-build@debian-arm64-cross \ > EXTRA_CONFIGURE_OPTS="--cross-prefix=aarch64-linux-gnu-" \ > TARGET_LIST="aarch64-softmmu,aarch64-linux-user" If cross-compile is the only meaningful way to use this image, we probably should bake the configure option into the dockerfile and pick it up automatically in common.rc. What do you think? Fam
On Tue, 02/14 22:00, Fam Zheng wrote: > On Tue, 02/14 10:07, Alex Bennée wrote: > > This provides a basic Debian install with access to the emdebian cross > > compilers. The debian-armhf-cross and debian-arm64-cross targets build > > on the basic Debian image to allow cross compiling to those targets. > > > > To build against the cross compiler a cross-compile prefix needs to be > > set in the configure options, for example: > > > > make docker-test-build@debian-arm64-cross \ > > EXTRA_CONFIGURE_OPTS="--cross-prefix=aarch64-linux-gnu-" \ > > TARGET_LIST="aarch64-softmmu,aarch64-linux-user" > > If cross-compile is the only meaningful way to use this image, we probably > should bake the configure option into the dockerfile and pick it up > automatically in common.rc. What do you think? The example change is like this:diff --git a/tests/docker/common.rc b/tests/docker/common.rc index 21657e87c6..6865689bb5 100755 --- a/tests/docker/common.rc +++ b/tests/docker/common.rc @@ -29,7 +29,7 @@ build_qemu() config_opts="--enable-werror \ ${TARGET_LIST:+--target-list=${TARGET_LIST}} \ --prefix=$PWD/install \ - $EXTRA_CONFIGURE_OPTS \ + $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS \ $@" echo "Configure options:" echo $config_opts diff --git a/tests/docker/dockerfiles/debian-arm64-cross.docker b/tests/docker/dockerfiles/debian-arm64-cross.docker index 04212629f7..fc1c135e74 100644 --- a/tests/docker/dockerfiles/debian-arm64-cross.docker +++ b/tests/docker/dockerfiles/debian-arm64-cross.docker @@ -10,3 +10,4 @@ RUN dpkg --add-architecture arm64 RUN apt update RUN apt install -yy crossbuild-essential-arm64 RUN apt-get build-dep -yy -a arm64 qemu +ENV QEMU_CONFIGURE_OPTS --cross-prefix=aarch64-linux-gnu-
On 14 February 2017 at 10:07, Alex Bennée <alex.bennee@linaro.org> wrote: > This provides a basic Debian install with access to the emdebian cross > compilers. The debian-armhf-cross and debian-arm64-cross targets build > on the basic Debian image to allow cross compiling to those targets. Is there a particular reason for creating different docker images for each cross target rather than just having one image with all the cross compilers in it? thanks -- PMM
Peter Maydell <peter.maydell@linaro.org> writes: > On 14 February 2017 at 10:07, Alex Bennée <alex.bennee@linaro.org> wrote: >> This provides a basic Debian install with access to the emdebian cross >> compilers. The debian-armhf-cross and debian-arm64-cross targets build >> on the basic Debian image to allow cross compiling to those targets. > > Is there a particular reason for creating different docker images > for each cross target rather than just having one image with > all the cross compilers in it? Mainly the clashing of build-dependencies. Debian's multi-arch is pretty good but you still can't generally have two arches worth of complex dependencies installed at once. I did originally have one base docker image with all the compilers and intended to do the dependencies step as part of test-build. However when running as builders the docker images don't actually have network ability so couldn't download them. -- Alex Bennée
Fam Zheng <famz@redhat.com> writes: > On Tue, 02/14 22:00, Fam Zheng wrote: >> On Tue, 02/14 10:07, Alex Bennée wrote: >> > This provides a basic Debian install with access to the emdebian cross >> > compilers. The debian-armhf-cross and debian-arm64-cross targets build >> > on the basic Debian image to allow cross compiling to those targets. >> > >> > To build against the cross compiler a cross-compile prefix needs to be >> > set in the configure options, for example: >> > >> > make docker-test-build@debian-arm64-cross \ >> > EXTRA_CONFIGURE_OPTS="--cross-prefix=aarch64-linux-gnu-" \ >> > TARGET_LIST="aarch64-softmmu,aarch64-linux-user" >> >> If cross-compile is the only meaningful way to use this image, we probably >> should bake the configure option into the dockerfile and pick it up >> automatically in common.rc. What do you think? > > The example change is like this: > > diff --git a/tests/docker/common.rc b/tests/docker/common.rc > index 21657e87c6..6865689bb5 100755 > --- a/tests/docker/common.rc > +++ b/tests/docker/common.rc > @@ -29,7 +29,7 @@ build_qemu() > config_opts="--enable-werror \ > ${TARGET_LIST:+--target-list=${TARGET_LIST}} \ > --prefix=$PWD/install \ > - $EXTRA_CONFIGURE_OPTS \ > + $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS \ > $@" > echo "Configure options:" > echo $config_opts > diff --git a/tests/docker/dockerfiles/debian-arm64-cross.docker b/tests/docker/dockerfiles/debian-arm64-cross.docker > index 04212629f7..fc1c135e74 100644 > --- a/tests/docker/dockerfiles/debian-arm64-cross.docker > +++ b/tests/docker/dockerfiles/debian-arm64-cross.docker > @@ -10,3 +10,4 @@ RUN dpkg --add-architecture arm64 > RUN apt update > RUN apt install -yy crossbuild-essential-arm64 > RUN apt-get build-dep -yy -a arm64 qemu > +ENV QEMU_CONFIGURE_OPTS --cross-prefix=aarch64-linux-gnu- Yeah that seems like a good idea. Then a make docker-test-build@debian-armhf-cross will work as expected ;-) -- Alex Bennée
On Tue, 02/14 15:09, Alex Bennée wrote: > > Peter Maydell <peter.maydell@linaro.org> writes: > > > On 14 February 2017 at 10:07, Alex Bennée <alex.bennee@linaro.org> wrote: > >> This provides a basic Debian install with access to the emdebian cross > >> compilers. The debian-armhf-cross and debian-arm64-cross targets build > >> on the basic Debian image to allow cross compiling to those targets. > > > > Is there a particular reason for creating different docker images > > for each cross target rather than just having one image with > > all the cross compilers in it? > > Mainly the clashing of build-dependencies. Debian's multi-arch is pretty > good but you still can't generally have two arches worth of complex > dependencies installed at once. > > I did originally have one base docker image with all the compilers and > intended to do the dependencies step as part of test-build. However when > running as builders the docker images don't actually have network > ability so couldn't download them. Yes, having to "prepare", especially to download things, for each test invocation is not resource friendly for CI too. Fam
diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include index 8db55e43aa..dbd12d9042 100644 --- a/tests/docker/Makefile.include +++ b/tests/docker/Makefile.include @@ -54,6 +54,10 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker $(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\ "BUILD","$*") +# Enforce dependancies for composite images +docker-image-debian-armhf-cross: docker-image-debian +docker-image-debian-arm64-cross: docker-image-debian + # Expand all the pre-requistes for each docker image and test combination $(foreach i,$(DOCKER_IMAGES), \ $(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \ diff --git a/tests/docker/dockerfiles/debian-arm64-cross.docker b/tests/docker/dockerfiles/debian-arm64-cross.docker new file mode 100644 index 0000000000..04212629f7 --- /dev/null +++ b/tests/docker/dockerfiles/debian-arm64-cross.docker @@ -0,0 +1,12 @@ +# +# Docker arm64 cross-compiler target +# +# This docker target builds on the base debian image. +# +FROM qemu:debian + +# Add the foreign architecture we want and install dependacies +RUN dpkg --add-architecture arm64 +RUN apt update +RUN apt install -yy crossbuild-essential-arm64 +RUN apt-get build-dep -yy -a arm64 qemu diff --git a/tests/docker/dockerfiles/debian-armhf-cross.docker b/tests/docker/dockerfiles/debian-armhf-cross.docker new file mode 100644 index 0000000000..1377641e3e --- /dev/null +++ b/tests/docker/dockerfiles/debian-armhf-cross.docker @@ -0,0 +1,12 @@ +# +# Docker armhf cross-compiler target +# +# This docker target builds on the base debian image. +# +FROM qemu:debian + +# Add the foreign architecture we want and install dependacies +RUN dpkg --add-architecture armhf +RUN apt update +RUN apt install -yy crossbuild-essential-armhf +RUN apt-get build-dep -yy -a armhf qemu diff --git a/tests/docker/dockerfiles/debian.docker b/tests/docker/dockerfiles/debian.docker new file mode 100644 index 0000000000..52bd79938e --- /dev/null +++ b/tests/docker/dockerfiles/debian.docker @@ -0,0 +1,25 @@ +# +# Docker multiarch cross-compiler target +# +# This docker target is builds on Debian and Emdebian's cross compiler targets +# to build distro with a selection of cross compilers for building test binaries. +# +# On its own you can't build much but the docker-foo-cross targets +# build on top of the base debian image. +# +FROM debian:stable-slim + +# Setup some basic tools we need +RUN apt update +RUN apt install -yy curl aptitude + +# Setup Emdebian +RUN echo "deb http://emdebian.org/tools/debian/ jessie main" >> /etc/apt/sources.list +RUN curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add - + +# Duplicate deb line as deb-src +RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list + +# Install common build utilities +RUN apt update +RUN apt install -yy build-essential clang
This provides a basic Debian install with access to the emdebian cross compilers. The debian-armhf-cross and debian-arm64-cross targets build on the basic Debian image to allow cross compiling to those targets. To build against the cross compiler a cross-compile prefix needs to be set in the configure options, for example: make docker-test-build@debian-arm64-cross \ EXTRA_CONFIGURE_OPTS="--cross-prefix=aarch64-linux-gnu-" \ TARGET_LIST="aarch64-softmmu,aarch64-linux-user" Signed-off-by: Alex Bennée <alex.bennee@linaro.org> --- v2 - add clang (keep shippable happy) - rm adduser code (done direct now) - add aptitude (useful for debugging package clashes) v3 - split into debian, debian-armhf-cross and debian-aarch64-cross --- tests/docker/Makefile.include | 4 ++++ tests/docker/dockerfiles/debian-arm64-cross.docker | 12 +++++++++++ tests/docker/dockerfiles/debian-armhf-cross.docker | 12 +++++++++++ tests/docker/dockerfiles/debian.docker | 25 ++++++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 tests/docker/dockerfiles/debian-arm64-cross.docker create mode 100644 tests/docker/dockerfiles/debian-armhf-cross.docker create mode 100644 tests/docker/dockerfiles/debian.docker -- 2.11.0