#!/bin/bash
# Copyright © 2019-2020 Collabora Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# (See debian/copyright)

set -e
set -u
set -x

arch="$(dpkg --print-architecture)"

case "$arch" in
    (amd64|i386)
        ;;
    (*)
        echo "1..0 # SKIP - not x86"
        exit 0
        ;;
esac

# Test that we can compile a simple project using meson and ninja.

tmpdir="$(mktemp -d)"
cleanup () {
    rm -fr "$tmpdir"
}
trap cleanup 0 INT QUIT ABRT PIPE TERM

# Meson wants a real locale
export LC_ALL=C.UTF-8

n=0
failed=

for compiler in \
    gcc \
    gcc-9 \
    gcc-10 \
    gcc-14 \
; do
    for aux in \
        '' \
        binutils-2.35.txt \
        mold.txt \
    ; do
        n=$((n + 1))
        can_use_mold=

        case "$compiler" in
            (gcc | gcc-10)
                # default version, guaranteed to be present in SDK
                ;;

            (gcc-14)
                case "$arch" in
                    (i386)
                        echo "ok $n - $compiler # SKIP not supported on i386"
                        continue
                        ;;
                esac
                can_use_mold=yes
                ;;

            (*)
                if ! command -v "$compiler" >/dev/null; then
                    echo "ok $n # SKIP $compiler not in PATH"
                    continue
                fi
                ;;
        esac

        if [ -z "$can_use_mold" ] && [ "$aux" = "mold.txt" ]; then
            echo "ok $n # SKIP $compiler does not support mold linker"
            continue
        fi

        if \
            meson setup \
                --cross-file "${compiler}-m32.txt" \
                ${aux:+--cross-file "$aux"} \
                "$tmpdir/b" \
                "$(pwd)/examples/glib" \
            && ninja -v -C "$tmpdir/b" \
            && "$tmpdir/b/hello" \
        ; then
            echo "ok $n - $compiler ${aux:-default}"
        else
            echo "not ok $n - $compiler ${aux:-default}"
            failed=1
        fi

        if [ "$aux" = "mold.txt" ]; then
            n=$((n + 1))

            if strings "$tmpdir/b/hello" | grep '^mold [0-9]' >&2; then
                echo "ok $n - $tmpdir/b/hello was linked with mold"
            else
                echo "not ok $n - $tmpdir/b/hello not linked with mold"
                failed=1
            fi
        fi

        ninja -v -C "$tmpdir/b" clean
        rm -fr "$tmpdir/b"
    done
done

echo "1..$n"

if [ -n "$failed" ]; then
    exit 1
fi

# vim:set sw=4 sts=4 et ft=sh:
