diff mbox series

[v2] Add travis-ci config file

Message ID 20190214131228.32415-1-agraf@suse.de
State Superseded
Headers show
Series [v2] Add travis-ci config file | expand

Commit Message

Alexander Graf Feb. 14, 2019, 1:12 p.m. UTC
There is a really convenient service for open source project from Travis
CI: They allow for free CI testing using their infrastructure.

Grub has had issues with broken builds for various targets for a long time
already. The main reason is a lack of CI to just do smoke tests on whether
all targets still at least compile.

This patch adds a travis config file which builds (almost) all currently
available targets.

On top of that, this travis config also runs a small execution test on the
x86_64-efi target.

All of this config file can easily be extended further on. It probably makes
sense to do something similar to the u-boot test infrastructure that
communicates with the payload properly. Going forward, we also will want to
do more qemu runtime checks for other targets.

Currently, with this config alone, I already see about half of the available
targets as broken. So it's definitely desperately needed :).

Signed-off-by: Alexander Graf <agraf@suse.de>


---

v1 -> v2:

  - Fix comment about toolchain variable
---
 .travis.yml | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 118 insertions(+)
 create mode 100644 .travis.yml

-- 
2.12.3


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Comments

Daniel Kiper Feb. 18, 2019, 6:57 p.m. UTC | #1
On Thu, Feb 14, 2019 at 02:12:28PM +0100, Alexander Graf wrote:
> There is a really convenient service for open source project from Travis

> CI: They allow for free CI testing using their infrastructure.

>

> Grub has had issues with broken builds for various targets for a long time

> already. The main reason is a lack of CI to just do smoke tests on whether

> all targets still at least compile.

>

> This patch adds a travis config file which builds (almost) all currently

> available targets.

>

> On top of that, this travis config also runs a small execution test on the

> x86_64-efi target.

>

> All of this config file can easily be extended further on. It probably makes

> sense to do something similar to the u-boot test infrastructure that

> communicates with the payload properly. Going forward, we also will want to

> do more qemu runtime checks for other targets.

>

> Currently, with this config alone, I already see about half of the available

> targets as broken. So it's definitely desperately needed :).

>

> Signed-off-by: Alexander Graf <agraf@suse.de>

>

> ---

>

> v1 -> v2:

>

>   - Fix comment about toolchain variable

> ---

>  .travis.yml | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

>  1 file changed, 118 insertions(+)

>  create mode 100644 .travis.yml

>

> diff --git a/.travis.yml b/.travis.yml

> new file mode 100644

> index 000000000..8d6245ed4

> --- /dev/null

> +++ b/.travis.yml

> @@ -0,0 +1,118 @@

> +# SPDX-License-Identifier: GPL-3.0+

> +# Originally Copyright Roger Meier <r.meier@siemens.com>

> +# Adapted for grub by Alexander Graf <agraf@suse.de>


s/grub/GRUB/?

> +# build grub on Travis CI - https://travis-ci.org/


s/build grub/Build GRUB/?

> +dist: xenial

> +

> +language: c

> +

> +addons:

> +  apt:

> +    packages:

> +    - cppcheck

> +    - sloccount

> +    - sparse

> +    - bc

> +    - build-essential

> +    - libsdl1.2-dev

> +    - python

> +    - python-virtualenv

> +    - swig

> +    - libpython-dev

> +    - iasl

> +    - rpm2cpio

> +    - wget

> +    - device-tree-compiler

> +    - lzop

> +    - liblz4-tool

> +    - libisl15

> +    - qemu-system

> +    - ovmf

> +    - unifont


Do we really need all that stuff? sloccount? iasl? rpm2cpio? And maybe others?

> +env:

> +  global:

> +    - PATH=/tmp/qemu-install/bin:/tmp/grub/bin:/usr/bin:/bin:/tmp/cross/gcc-8.1.0-nolibc/aarch64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/arm-linux-gnueabi/bin:/tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/mips64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/powerpc64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv32-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/sparc64-linux/bin


Ugh... Is it minimal PATH required to do our tests? Really? Could we
trim it down? If not I will ask you to say in the comment why we need
so big PATH.

> +before_script:

> +  # install necessary toolchains based on $CROSS_TARGETS variable


I know that there is a fashion to start everything with small latter but
I prefer proper full sentences with a full stop at the end.

> +  - mkdir /tmp/cross

> +  # results in binaries like /tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin/ia64-linux-gcc

> +  - for i in $CROSS_TARGETS; do

> +        ( cd /tmp/cross; wget -O - https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-$i.tar.xz | xzcat | tar x );


Should not we add e.g. -t 3 to wget command line?

s/mirrors.edge.kernel.org/mirrors.kernel.org/?
s/xzcat | tar x/tar xJ/

And should not we verify signatures of
x86_64-gcc-8.1.0-nolibc-$i.tar.xz?

And why we need "(...)", brackets here?

> +    done

> +

> +script:

> +  # Comments must be outside the command strings below, or the Travis parser

> +  # will get confused.

> +  - ./autogen.sh

> +

> +  # Build all selected grub targets:

> +  - for target in $GRUB_TARGETS; do

> +      plat=${target#*-};

> +      arch=${target%-*};

> +      [ "$arch" = "arm64" ] && arch=aarch64-linux;

> +      [ "$arch" = "arm" ] && arch=arm-linux-gnueabi;

> +      [ "$arch" = "ia64" ] && arch=ia64-linux;

> +      [ "$arch" = "mipsel" ] && arch=mips64-linux;

> +      [ "$arch" = "powerpc" ] && arch=powerpc64-linux;

> +      [ "$arch" = "riscv32" ] && arch=riscv32-linux;

> +      [ "$arch" = "riscv64" ] && arch=riscv64-linux;

> +      [ "$arch" = "sparc64" ] && arch=sparc64-linux;

> +      echo "Building $target";

> +      mkdir obj-$target;

> +      ( cd obj-$target && ../configure --target=$arch --with-platform=$plat --prefix=/tmp/grub && make -j4 && make -j4 install ) &> log || ( cat log; false );


Are you sure that each build environment has 3 CPUs available? Could you
use "getconf _NPROCESSORS_ONLN" or nproc to get number of CPUs
available? I use something like that:

JOBS=`getconf _NPROCESSORS_ONLN 2> /dev/null || echo 1`
JOBS=`if [ "$JOBS" -gt 1 ]; then expr "$JOBS" + 1; else echo 1; fi`

The downside of using that is that build messages may not be aligned
with relevant commands. Do we care about that here? To some extent
probably yes.

> +    done

> +

> +  # Our test canary

> +  - echo -e "insmod echo\\ninsmod reboot\\necho hello world\\nreboot" > grub.cfg

> +

> +  # Assemble images and possibly run them

> +  - for target in $GRUB_TARGETS; do grub-mkimage -c grub.cfg -p / -O $target -o grub-$target echo reboot normal; done

> +

> +  # Run images we know how to run

> +  - if [[ "$GRUB_TARGETS" == *"x86_64-efi"* ]]; then qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -m 512 -no-reboot -nographic -net nic -net user,tftp=.,bootfile=grub-x86_64-efi | tee grub.log && grep "hello world" grub.log; fi

> +

> +matrix:

> +  include:

> +  # each env setting here is a dedicated build

> +    - name: "x86_64"

> +      env:

> +        - GRUB_TARGETS="x86_64-efi x86_64-xen"

> +    - name: "i386"

> +      env:

> +        - GRUB_TARGETS="i386-efi i386-xen i386-xen_pvh i386-pc i386-multiboot i386-coreboot i386-ieee1275 i386-qemu"


May we have this sorted in alphabetic order?
And i386-emu seems missing to me.

> +    - name: "powerpc"

> +      env:

> +        - GRUB_TARGETS="powerpc-ieee1275"

> +        - CROSS_TARGETS=powerpc64-linux"

> +    - name: "sparc64"

> +      env:

> +        - GRUB_TARGETS="sparc64-ieee1275"

> +        - CROSS_TARGETS=sparc64-linux"

> +    - name: "ia64"

> +      env:

> +        - GRUB_TARGETS="ia64-efi"

> +        - CROSS_TARGETS=ia64-linux"

> +    - name: "mips"

> +      env:

> +        - GRUB_TARGETS="mips-qemu_mips mips-arc mipsel-arc mipsel-qemu_mips"


May we have this sorted in alphabetic order?

> +        - CROSS_TARGETS=mips64-linux"

> +    - name: "arm"

> +      env:

> +        - GRUB_TARGETS="arm-uboot arm-coreboot arm-efi"


Ditto.

Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
Daniel Kiper Feb. 18, 2019, 7:08 p.m. UTC | #2
On Mon, Feb 18, 2019 at 07:57:35PM +0100, Daniel Kiper wrote:
> On Thu, Feb 14, 2019 at 02:12:28PM +0100, Alexander Graf wrote:


[...]

> > +  - mkdir /tmp/cross

> > +  # results in binaries like /tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin/ia64-linux-gcc

> > +  - for i in $CROSS_TARGETS; do

> > +        ( cd /tmp/cross; wget -O - https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-$i.tar.xz | xzcat | tar x );

>

> Should not we add e.g. -t 3 to wget command line?

>

> s/mirrors.edge.kernel.org/mirrors.kernel.org/?

> s/xzcat | tar x/tar xJ/

>

> And should not we verify signatures of

> x86_64-gcc-8.1.0-nolibc-$i.tar.xz?

>

> And why we need "(...)", brackets here?


https://mirrors.edge.kernel.org/pub/tools/crosstool/ says:
  These compilers are only functional for kernel builds, they cannot be
  used to build userspace code. For complete toolchains, go to
  https://toolchains.bootlin.com/

We build userspace code. So, maybe this is not the best fit for us.

Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
Alexander Graf Feb. 19, 2019, 1:44 p.m. UTC | #3
On 02/18/2019 08:08 PM, Daniel Kiper wrote:
> On Mon, Feb 18, 2019 at 07:57:35PM +0100, Daniel Kiper wrote:

>> On Thu, Feb 14, 2019 at 02:12:28PM +0100, Alexander Graf wrote:

> [...]

>

>>> +  - mkdir /tmp/cross

>>> +  # results in binaries like /tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin/ia64-linux-gcc

>>> +  - for i in $CROSS_TARGETS; do

>>> +        ( cd /tmp/cross; wget -O - https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-$i.tar.xz | xzcat | tar x );

>> Should not we add e.g. -t 3 to wget command line?

>>

>> s/mirrors.edge.kernel.org/mirrors.kernel.org/?

>> s/xzcat | tar x/tar xJ/

>>

>> And should not we verify signatures of

>> x86_64-gcc-8.1.0-nolibc-$i.tar.xz?

>>

>> And why we need "(...)", brackets here?

> https://mirrors.edge.kernel.org/pub/tools/crosstool/ says:

>    These compilers are only functional for kernel builds, they cannot be

>    used to build userspace code. For complete toolchains, go to

>    https://toolchains.bootlin.com/

>

> We build userspace code. So, maybe this is not the best fit for us.


We do not build user space code for the cross target, only for the host. 
Pretty much the same as the kernel.


Alex


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
Alexander Graf Feb. 19, 2019, 1:49 p.m. UTC | #4
On 02/18/2019 07:57 PM, Daniel Kiper wrote:
> On Thu, Feb 14, 2019 at 02:12:28PM +0100, Alexander Graf wrote:

>> There is a really convenient service for open source project from Travis

>> CI: They allow for free CI testing using their infrastructure.

>>

>> Grub has had issues with broken builds for various targets for a long time

>> already. The main reason is a lack of CI to just do smoke tests on whether

>> all targets still at least compile.

>>

>> This patch adds a travis config file which builds (almost) all currently

>> available targets.

>>

>> On top of that, this travis config also runs a small execution test on the

>> x86_64-efi target.

>>

>> All of this config file can easily be extended further on. It probably makes

>> sense to do something similar to the u-boot test infrastructure that

>> communicates with the payload properly. Going forward, we also will want to

>> do more qemu runtime checks for other targets.

>>

>> Currently, with this config alone, I already see about half of the available

>> targets as broken. So it's definitely desperately needed :).

>>

>> Signed-off-by: Alexander Graf <agraf@suse.de>

>>

>> ---

>>

>> v1 -> v2:

>>

>>    - Fix comment about toolchain variable

>> ---

>>   .travis.yml | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

>>   1 file changed, 118 insertions(+)

>>   create mode 100644 .travis.yml

>>

>> diff --git a/.travis.yml b/.travis.yml

>> new file mode 100644

>> index 000000000..8d6245ed4

>> --- /dev/null

>> +++ b/.travis.yml

>> @@ -0,0 +1,118 @@

>> +# SPDX-License-Identifier: GPL-3.0+

>> +# Originally Copyright Roger Meier <r.meier@siemens.com>

>> +# Adapted for grub by Alexander Graf <agraf@suse.de>

> s/grub/GRUB/?

>

>> +# build grub on Travis CI - https://travis-ci.org/

> s/build grub/Build GRUB/?

>

>> +dist: xenial

>> +

>> +language: c

>> +

>> +addons:

>> +  apt:

>> +    packages:

>> +    - cppcheck

>> +    - sloccount

>> +    - sparse

>> +    - bc

>> +    - build-essential

>> +    - libsdl1.2-dev

>> +    - python

>> +    - python-virtualenv

>> +    - swig

>> +    - libpython-dev

>> +    - iasl

>> +    - rpm2cpio

>> +    - wget

>> +    - device-tree-compiler

>> +    - lzop

>> +    - liblz4-tool

>> +    - libisl15

>> +    - qemu-system

>> +    - ovmf

>> +    - unifont

> Do we really need all that stuff? sloccount? iasl? rpm2cpio? And maybe others?


Not really. The problem is that every test run to reduce the set takes 
~15 minutes...

>

>> +env:

>> +  global:

>> +    - PATH=/tmp/qemu-install/bin:/tmp/grub/bin:/usr/bin:/bin:/tmp/cross/gcc-8.1.0-nolibc/aarch64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/arm-linux-gnueabi/bin:/tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/mips64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/powerpc64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv32-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/sparc64-linux/bin

> Ugh... Is it minimal PATH required to do our tests? Really? Could we

> trim it down? If not I will ask you to say in the comment why we need

> so big PATH.


It is not the minimal, it is a PATH that has all cross compilers 
included. That way we don't need to worry about adding the respective 
cross path to the PATH for cross targets.

>

>> +before_script:

>> +  # install necessary toolchains based on $CROSS_TARGETS variable

> I know that there is a fashion to start everything with small latter but

> I prefer proper full sentences with a full stop at the end.

>

>> +  - mkdir /tmp/cross

>> +  # results in binaries like /tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin/ia64-linux-gcc

>> +  - for i in $CROSS_TARGETS; do

>> +        ( cd /tmp/cross; wget -O - https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-$i.tar.xz | xzcat | tar x );

> Should not we add e.g. -t 3 to wget command line?

>

> s/mirrors.edge.kernel.org/mirrors.kernel.org/?

> s/xzcat | tar x/tar xJ/

>

> And should not we verify signatures of

> x86_64-gcc-8.1.0-nolibc-$i.tar.xz?

>

> And why we need "(...)", brackets here?


To keep the path stable.

>

>> +    done

>> +

>> +script:

>> +  # Comments must be outside the command strings below, or the Travis parser

>> +  # will get confused.

>> +  - ./autogen.sh

>> +

>> +  # Build all selected grub targets:

>> +  - for target in $GRUB_TARGETS; do

>> +      plat=${target#*-};

>> +      arch=${target%-*};

>> +      [ "$arch" = "arm64" ] && arch=aarch64-linux;

>> +      [ "$arch" = "arm" ] && arch=arm-linux-gnueabi;

>> +      [ "$arch" = "ia64" ] && arch=ia64-linux;

>> +      [ "$arch" = "mipsel" ] && arch=mips64-linux;

>> +      [ "$arch" = "powerpc" ] && arch=powerpc64-linux;

>> +      [ "$arch" = "riscv32" ] && arch=riscv32-linux;

>> +      [ "$arch" = "riscv64" ] && arch=riscv64-linux;

>> +      [ "$arch" = "sparc64" ] && arch=sparc64-linux;

>> +      echo "Building $target";

>> +      mkdir obj-$target;

>> +      ( cd obj-$target && ../configure --target=$arch --with-platform=$plat --prefix=/tmp/grub && make -j4 && make -j4 install ) &> log || ( cat log; false );

> Are you sure that each build environment has 3 CPUs available? Could you

> use "getconf _NPROCESSORS_ONLN" or nproc to get number of CPUs

> available? I use something like that:

>

> JOBS=`getconf _NPROCESSORS_ONLN 2> /dev/null || echo 1`

> JOBS=`if [ "$JOBS" -gt 1 ]; then expr "$JOBS" + 1; else echo 1; fi`

>

> The downside of using that is that build messages may not be aligned

> with relevant commands. Do we care about that here? To some extent

> probably yes.


What do you mean? They are as well aligned as with -j4, no?

>

>> +    done

>> +

>> +  # Our test canary

>> +  - echo -e "insmod echo\\ninsmod reboot\\necho hello world\\nreboot" > grub.cfg

>> +

>> +  # Assemble images and possibly run them

>> +  - for target in $GRUB_TARGETS; do grub-mkimage -c grub.cfg -p / -O $target -o grub-$target echo reboot normal; done

>> +

>> +  # Run images we know how to run

>> +  - if [[ "$GRUB_TARGETS" == *"x86_64-efi"* ]]; then qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -m 512 -no-reboot -nographic -net nic -net user,tftp=.,bootfile=grub-x86_64-efi | tee grub.log && grep "hello world" grub.log; fi

>> +

>> +matrix:

>> +  include:

>> +  # each env setting here is a dedicated build

>> +    - name: "x86_64"

>> +      env:

>> +        - GRUB_TARGETS="x86_64-efi x86_64-xen"

>> +    - name: "i386"

>> +      env:

>> +        - GRUB_TARGETS="i386-efi i386-xen i386-xen_pvh i386-pc i386-multiboot i386-coreboot i386-ieee1275 i386-qemu"

> May we have this sorted in alphabetic order?


This is the order from configure's check whether a target exists. But if 
you think alphabetic makes more sense ...

> And i386-emu seems missing to me.


Yes, that didn't work for me. Feel free to add it once we have the basics.


Alex

>

>> +    - name: "powerpc"

>> +      env:

>> +        - GRUB_TARGETS="powerpc-ieee1275"

>> +        - CROSS_TARGETS=powerpc64-linux"

>> +    - name: "sparc64"

>> +      env:

>> +        - GRUB_TARGETS="sparc64-ieee1275"

>> +        - CROSS_TARGETS=sparc64-linux"

>> +    - name: "ia64"

>> +      env:

>> +        - GRUB_TARGETS="ia64-efi"

>> +        - CROSS_TARGETS=ia64-linux"

>> +    - name: "mips"

>> +      env:

>> +        - GRUB_TARGETS="mips-qemu_mips mips-arc mipsel-arc mipsel-qemu_mips"

> May we have this sorted in alphabetic order?

>

>> +        - CROSS_TARGETS=mips64-linux"

>> +    - name: "arm"

>> +      env:

>> +        - GRUB_TARGETS="arm-uboot arm-coreboot arm-efi"

> Ditto.

>

> Daniel




_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
diff mbox series

Patch

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..8d6245ed4
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,118 @@ 
+# SPDX-License-Identifier: GPL-3.0+
+# Originally Copyright Roger Meier <r.meier@siemens.com>
+# Adapted for grub by Alexander Graf <agraf@suse.de>
+
+# build grub on Travis CI - https://travis-ci.org/
+
+dist: xenial
+
+language: c
+
+addons:
+  apt:
+    packages:
+    - cppcheck
+    - sloccount
+    - sparse
+    - bc
+    - build-essential
+    - libsdl1.2-dev
+    - python
+    - python-virtualenv
+    - swig
+    - libpython-dev
+    - iasl
+    - rpm2cpio
+    - wget
+    - device-tree-compiler
+    - lzop
+    - liblz4-tool
+    - libisl15
+    - qemu-system
+    - ovmf
+    - unifont
+
+env:
+  global:
+    - PATH=/tmp/qemu-install/bin:/tmp/grub/bin:/usr/bin:/bin:/tmp/cross/gcc-8.1.0-nolibc/aarch64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/arm-linux-gnueabi/bin:/tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/mips64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/powerpc64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv32-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/riscv64-linux/bin:/tmp/cross/gcc-8.1.0-nolibc/sparc64-linux/bin
+
+before_script:
+  # install necessary toolchains based on $CROSS_TARGETS variable
+  - mkdir /tmp/cross
+  # results in binaries like /tmp/cross/gcc-8.1.0-nolibc/ia64-linux/bin/ia64-linux-gcc
+  - for i in $CROSS_TARGETS; do
+        ( cd /tmp/cross; wget -O - https://mirrors.edge.kernel.org/pub/tools/crosstool/files/bin/x86_64/8.1.0/x86_64-gcc-8.1.0-nolibc-$i.tar.xz | xzcat | tar x );
+    done
+
+script:
+  # Comments must be outside the command strings below, or the Travis parser
+  # will get confused.
+  - ./autogen.sh
+
+  # Build all selected grub targets:
+  - for target in $GRUB_TARGETS; do
+      plat=${target#*-};
+      arch=${target%-*};
+      [ "$arch" = "arm64" ] && arch=aarch64-linux;
+      [ "$arch" = "arm" ] && arch=arm-linux-gnueabi;
+      [ "$arch" = "ia64" ] && arch=ia64-linux;
+      [ "$arch" = "mipsel" ] && arch=mips64-linux;
+      [ "$arch" = "powerpc" ] && arch=powerpc64-linux;
+      [ "$arch" = "riscv32" ] && arch=riscv32-linux;
+      [ "$arch" = "riscv64" ] && arch=riscv64-linux;
+      [ "$arch" = "sparc64" ] && arch=sparc64-linux;
+      echo "Building $target";
+      mkdir obj-$target;
+      ( cd obj-$target && ../configure --target=$arch --with-platform=$plat --prefix=/tmp/grub && make -j4 && make -j4 install ) &> log || ( cat log; false );
+    done
+
+  # Our test canary
+  - echo -e "insmod echo\\ninsmod reboot\\necho hello world\\nreboot" > grub.cfg
+
+  # Assemble images and possibly run them
+  - for target in $GRUB_TARGETS; do grub-mkimage -c grub.cfg -p / -O $target -o grub-$target echo reboot normal; done
+
+  # Run images we know how to run
+  - if [[ "$GRUB_TARGETS" == *"x86_64-efi"* ]]; then qemu-system-x86_64 -bios /usr/share/ovmf/OVMF.fd -m 512 -no-reboot -nographic -net nic -net user,tftp=.,bootfile=grub-x86_64-efi | tee grub.log && grep "hello world" grub.log; fi
+
+matrix:
+  include:
+  # each env setting here is a dedicated build
+    - name: "x86_64"
+      env:
+        - GRUB_TARGETS="x86_64-efi x86_64-xen"
+    - name: "i386"
+      env:
+        - GRUB_TARGETS="i386-efi i386-xen i386-xen_pvh i386-pc i386-multiboot i386-coreboot i386-ieee1275 i386-qemu"
+    - name: "powerpc"
+      env:
+        - GRUB_TARGETS="powerpc-ieee1275"
+        - CROSS_TARGETS=powerpc64-linux"
+    - name: "sparc64"
+      env:
+        - GRUB_TARGETS="sparc64-ieee1275"
+        - CROSS_TARGETS=sparc64-linux"
+    - name: "ia64"
+      env:
+        - GRUB_TARGETS="ia64-efi"
+        - CROSS_TARGETS=ia64-linux"
+    - name: "mips"
+      env:
+        - GRUB_TARGETS="mips-qemu_mips mips-arc mipsel-arc mipsel-qemu_mips"
+        - CROSS_TARGETS=mips64-linux"
+    - name: "arm"
+      env:
+        - GRUB_TARGETS="arm-uboot arm-coreboot arm-efi"
+        - CROSS_TARGETS="arm-linux-gnueabi"
+    - name: "arm64"
+      env:
+        - GRUB_TARGETS="arm64-efi"
+        - CROSS_TARGETS=aarch64-linux"
+    - name: "riscv32"
+      env:
+        - GRUB_TARGETS="riscv32-efi"
+        - CROSS_TARGETS=riscv32-linux"
+    - name: "riscv64"
+      env:
+        - GRUB_TARGETS="riscv64-efi"
+        - CROSS_TARGETS=riscv64-linux"