[v3,2/3] new: debian docker targets for cross-compiling

Message ID 20170214100733.22280-3-alex.bennee@linaro.org
State New
Headers show
Series
  • Docker cross-compile targets and user build support
Related show

Commit Message

Alex Bennée Feb. 14, 2017, 10:07 a.m.
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

Comments

Fam Zheng Feb. 14, 2017, 2 p.m. | #1
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
Fam Zheng Feb. 14, 2017, 2:27 p.m. | #2
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-

Peter Maydell Feb. 14, 2017, 2:30 p.m. | #3
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
Alex Bennée Feb. 14, 2017, 3:09 p.m. | #4
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
Alex Bennée Feb. 14, 2017, 3:10 p.m. | #5
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
Fam Zheng Feb. 14, 2017, 3:18 p.m. | #6
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

Patch hide | download patch | download mbox

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