[igt-dev] [PATCH i-g-t 4/4] gitlab-ci: arm64 cross compiling

Daniel Vetter daniel.vetter at ffwll.ch
Mon Oct 29 08:10:30 UTC 2018


First I tried to build in a full sysroot, but I didn't figure out why
ld never found the libraries (this was on fedora, which might have
been part of the problem - if you just need a toolchain for kernel
corss-building fedora is perfectly fine).

Then I tried using debian's multiarch stuff, which worked a lot
better, except there's some minor gotchas:
- some libraries conflict and can't be multi-arch installed
- some libraries are buggy and cause conflicts when installing
- pkgconfig and ld get confused with some other libraries and pick the
  first one they find (i.e. the x86_64 one, not the arm64 one).
That means we need a new docker image with just the cross libaries
installed as -dev packages, and none of the native ones.

Next up I tried to run the tests. Meson has really nice support for an
exe wrapper, and qemu happily runs arm64 on x86_64. With that I
managed to run some tests successfully (it's not even that slow!). But
most are run through a script, and the script doesn't know about the
exe wrapper and hence fails miserably. I discussed this a bit with
Dylan and he filed an upstream meson issue:

https://github.com/mesonbuild/meson/issues/4427#issuecomment-433553689

Another option would be to use binfmt-misc handling (which works
neatly locally), but on the runners we have I can't control that.
Maybe I can beg Daniel Stone ...

For not let's just mark this stage as optional and that failures are
allowed.

Cc: Sean Paul <sean at poorly.run>
Cc: Eric Anholt <eric at anholt.net>
Cc: Dylan Baker <dylan at pnwbakers.com>
Cc: Daniel Stone <daniel at fooishbar.org>
Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
---
 .gitlab-ci.yml          | 31 +++++++++++++++++++++++++++
 Dockerfile.debian-arm64 | 46 +++++++++++++++++++++++++++++++++++++++++
 meson-cross-arm64.txt   | 12 +++++++++++
 3 files changed, 89 insertions(+)
 create mode 100644 Dockerfile.debian-arm64
 create mode 100644 meson-cross-arm64.txt

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2e04c0e84e1b..75e72998e596 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -57,6 +57,15 @@ build:tests-debian-meson:
     paths:
       - meson-test-list.txt
 
+build:tests-debian-meson-arm64:
+  image: $CI_REGISTRY/$CI_PROJECT_PATH/igt-debian-arm64:latest
+  stage: build
+  script:
+    - PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig/ meson --cross-file meson-cross-arm64.txt build
+    - ninja -C build
+  artifacts:
+    paths:
+      - build
 
 build:tests-debian-autotools:
   image: $CI_REGISTRY/$CI_PROJECT_PATH/igt-debian:latest
@@ -77,6 +86,14 @@ test:ninja-test:
   stage: test
   script: ninja -C build test
 
+test:ninja-test-arm64:
+  when: manual
+  image: $CI_REGISTRY/$CI_PROJECT_PATH/igt-debian-arm64:latest
+  dependencies:
+    - build:tests-debian-meson-arm64
+  stage: test
+  script: ninja -C build test
+
 test:test-list-diff:
   dependencies:
     - build:tests-debian-autotools
@@ -115,6 +132,20 @@ containers:igt-debian:
     - docker build -t $CI_REGISTRY/$CI_PROJECT_PATH/igt-debian -f Dockerfile.debian .
     - docker push $CI_REGISTRY/$CI_PROJECT_PATH/igt-debian
 
+containers:igt-debian-arm64:
+  stage: containers
+  when: manual
+  image: docker:stable
+  services:
+    - docker:dind
+  variables:
+    DOCKER_HOST: tcp://docker:2375
+    DOCKER_DRIVER: overlay2
+  script:
+    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
+    - docker build -t $CI_REGISTRY/$CI_PROJECT_PATH/igt-debian-arm64 -f Dockerfile.debian-arm64 .
+    - docker push $CI_REGISTRY/$CI_PROJECT_PATH/igt-debian-arm64
+
 containers:igt-fedora:
   stage: containers
   when: manual
diff --git a/Dockerfile.debian-arm64 b/Dockerfile.debian-arm64
new file mode 100644
index 000000000000..20c2e8b30663
--- /dev/null
+++ b/Dockerfile.debian-arm64
@@ -0,0 +1,46 @@
+FROM debian:stretch-backports
+
+RUN apt-get update
+RUN apt-get install -y \
+			flex \
+			bison \
+			pkg-config \
+			x11proto-dri2-dev \
+			python-docutils \
+			valgrind \
+			peg
+
+RUN dpkg --add-architecture arm64
+RUN apt-get update
+RUN apt-get install -y \
+			gcc-aarch64-linux-gnu \
+			libpciaccess-dev:arm64 \
+			libkmod-dev:arm64 \
+			libprocps-dev:arm64 \
+			libunwind-dev:arm64 \
+			libdw-dev:arm64 \
+			zlib1g-dev:arm64 \
+			liblzma-dev:arm64 \
+			libssl-dev:arm64 \
+			libcairo-dev:arm64 \
+			libpixman-1-dev:arm64 \
+			libudev-dev:arm64 \
+			libgsl-dev:arm64 \
+			libasound2-dev:arm64 \
+			libjson-c-dev:arm64 \
+			libcurl4-openssl-dev:arm64 \
+			libxrandr-dev:arm64 \
+			libxv-dev:arm64
+
+RUN apt-get install -t stretch-backports -y \
+					meson \
+					libdrm-dev:arm64 \
+					qemu-user
+
+# autotools build deps
+RUN apt-get install -y \
+			autoconf \
+			automake \
+			xutils-dev \
+			libtool \
+			make
diff --git a/meson-cross-arm64.txt b/meson-cross-arm64.txt
new file mode 100644
index 000000000000..d96f180e2b05
--- /dev/null
+++ b/meson-cross-arm64.txt
@@ -0,0 +1,12 @@
+[binaries]
+c = '/usr/bin/aarch64-linux-gnu-gcc'
+ar = '/usr/bin/aarch64-linux-gnu-gcc-ar'
+strip = '/usr/bin/aarch64-linux-gnu-strip'
+pkgconfig = 'pkg-config'
+exe_wrapper = 'qemu-aarch64'
+
+[host_machine]
+system = 'linux'
+cpu_family = 'aarch64'
+cpu = 'aarch64'
+endian = 'little'
-- 
2.19.1



More information about the igt-dev mailing list