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

set -e
set -u
set -x

# Test that we can cross-compile a simple project using CMake.

if [ -z "${DEB_HOST_ARCH-}" ] || [ "$DEB_HOST_ARCH" = "${DEB_BUILD_ARCH-}" ]; then
    echo "1..0 # SKIP DEB_HOST_ARCH not configured"
    exit 0
fi

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

n=0
failed=

gnu_tuple="$(dpkg-architecture -a"$DEB_HOST_ARCH" -qDEB_HOST_GNU_TYPE 2>/dev/null)"
gcc_major=$(gcc -dumpversion)
clang_major=$(clang -dumpversion | cut -d. -f1)

for cc in \
    clang \
    "clang-${clang_major}" \
    gcc \
    "gcc-${gcc_major}" \
    gcc-14 \
; do
    n=$((n + 1))

    case "$cc" in
        (clang | "clang-${clang_major}" | gcc | "gcc-${gcc_major}")
            # default version, guaranteed to be present in SDK
            ;;

        (gcc-14)
            # backport, supported on all architectures except i386
            if [ "$DEB_BUILD_ARCH" = i386 ]; then
                echo "ok $n - $cc # SKIP not supported on i386"
                continue
            fi
            ;;

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

    toolchain="/usr/share/steamrt/cmake/${gnu_tuple}-${cc}.cmake"

    if \
        mkdir "$tmpdir/b" \
        && \
            CFLAGS=-O1 \
            CXXFLAGS=-O1 \
            cmake \
                -S "$(pwd)/examples/glib" \
                -B "$tmpdir/b" \
                -DCMAKE_TOOLCHAIN_FILE="$toolchain" \
                -GNinja \
        && ninja -v -C "$tmpdir/b" \
        && ./tests/assert-correct-ldso.sh "$DEB_HOST_ARCH" "$tmpdir/b/hello" \
    ; then
        echo "ok $n - ${cc} with toolchain file"

        case "$DEB_BUILD_ARCH/$DEB_HOST_ARCH" in
            (amd64/i386)
                "$tmpdir/b/hello"
                ;;
        esac
    else
        echo "not ok $n - ${cc} with toolchain file"
        failed=1
    fi

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

echo "1..$n"

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

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