From ae707762335dabe2bb7e40639fd2ab2c7d3234fd Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Fri, 5 Aug 2022 15:59:44 -0400 Subject: gitlab-ci: Add basic support for cross-compiler testiing Here we add a simple qemu-based test for cross-compilers. --- .gitlab/ci.sh | 72 +++++++++++++++++++++++++++++++++++++++---------------- .gitlab/gen_ci.hs | 14 ++++++++--- .gitlab/jobs.yaml | 2 ++ 3 files changed, 64 insertions(+), 24 deletions(-) (limited to '.gitlab') diff --git a/.gitlab/ci.sh b/.gitlab/ci.sh index b23def26ea..8ff9c688cd 100755 --- a/.gitlab/ci.sh +++ b/.gitlab/ci.sh @@ -93,6 +93,7 @@ Environment variables determining build configuration of Hadrian system: BUILD_FLAVOUR Which flavour to build. REINSTALL_GHC Build and test a reinstalled "stage3" ghc built using cabal-install This tests the "reinstall" configuration + CROSS_EMULATOR The emulator to use for testing of cross-compilers. Environment variables determining bootstrap toolchain (Linux): @@ -564,15 +565,38 @@ function make_install_destdir() { fi info "merging file tree from $destdir to $instdir" cp -a "$destdir/$instdir"/* "$instdir"/ - "$instdir"/bin/ghc-pkg recache + "$instdir"/bin/${cross_prefix}ghc-pkg recache } -function test_hadrian() { - if [ -n "${CROSS_TARGET:-}" ]; then - info "Can't test cross-compiled build." - return - fi +# install the binary distribution in directory $1 to $2. +function install_bindist() { + local bindist="$1" + local instdir="$2" + pushd "$bindist" + case "$(uname)" in + MSYS_*|MINGW*) + mkdir -p "$instdir" + cp -a * "$instdir" + ;; + *) + read -r -a args <<< "${INSTALL_CONFIGURE_ARGS:-}" + + # FIXME: The bindist configure script shouldn't need to be reminded of + # the target platform. See #21970. + if [ -n "${CROSS_TARGET:-}" ]; then + args+=( "--target=$CROSS_TARGET" "--host=$CROSS_TARGET" ) + fi + run ./configure \ + --prefix="$instdir" \ + "${args[@]+"${args[@]}"}" + make_install_destdir "$TOP"/destdir "$instdir" + ;; + esac + popd +} + +function test_hadrian() { check_msys2_deps _build/stage1/bin/ghc --version check_release_build @@ -593,7 +617,21 @@ function test_hadrian() { fi - if [[ -n "${REINSTALL_GHC:-}" ]]; then + if [ -n "${CROSS_TARGET:-}" ]; then + if [ -n "${CROSS_EMULATOR:-}" ]; then + local instdir="$TOP/_build/install" + local test_compiler="$instdir/bin/${cross_prefix}ghc$exe" + install_bindist _build/bindist/ghc-*/ "$instdir" + echo 'main = putStrLn "hello world"' > hello.hs + echo "hello world" > expected + run "$test_compiler" hello.hs + $CROSS_EMULATOR ./hello > actual + run diff expected actual + else + info "Cannot test cross-compiled build without CROSS_EMULATOR being set." + return + fi + elif [[ -n "${REINSTALL_GHC:-}" ]]; then run_hadrian \ test \ --test-root-dirs=testsuite/tests/stage1 \ @@ -602,20 +640,9 @@ function test_hadrian() { --test-root-dirs=testsuite/tests/typecheck \ "runtest.opts+=${RUNTEST_ARGS:-}" || fail "hadrian cabal-install test" else - cd _build/bindist/ghc-*/ - case "$(uname)" in - MSYS_*|MINGW*) - mkdir -p "$TOP"/_build/install - cp -a * "$TOP"/_build/install - ;; - *) - read -r -a args <<< "${INSTALL_CONFIGURE_ARGS:-}" - run ./configure --prefix="$TOP"/_build/install "${args[@]+"${args[@]}"}" - make_install_destdir "$TOP"/destdir "$TOP"/_build/install - ;; - esac - cd ../../../ - test_compiler="$TOP/_build/install/bin/ghc$exe" + local instdir="$TOP/_build/install" + local test_compiler="$instdir/bin/ghc$exe" + install_bindist _build/bindist/ghc-*/ "$instdir" if [[ "${WINDOWS_HOST}" == "no" ]]; then run_hadrian \ @@ -779,6 +806,9 @@ esac if [ -n "${CROSS_TARGET:-}" ]; then info "Cross-compiling for $CROSS_TARGET..." target_triple="$CROSS_TARGET" + cross_prefix="$target_triple-" +else + cross_prefix="" fi echo "Branch name ${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:-}" diff --git a/.gitlab/gen_ci.hs b/.gitlab/gen_ci.hs index d9c9587790..21b12593e1 100755 --- a/.gitlab/gen_ci.hs +++ b/.gitlab/gen_ci.hs @@ -117,6 +117,7 @@ data BuildConfig , withAssertions :: Bool , withNuma :: Bool , crossTarget :: Maybe String + , crossEmulator :: Maybe String , fullyStatic :: Bool , tablesNextToCode :: Bool , threadSanitiser :: Bool @@ -159,6 +160,7 @@ vanilla = BuildConfig , withAssertions = False , withNuma = False , crossTarget = Nothing + , crossEmulator = Nothing , fullyStatic = False , tablesNextToCode = True , threadSanitiser = False @@ -189,8 +191,13 @@ static = vanilla { fullyStatic = True } staticNativeInt :: BuildConfig staticNativeInt = static { bignumBackend = Native } -crossConfig :: String -> BuildConfig -crossConfig triple = vanilla { crossTarget = Just triple } +crossConfig :: String -- ^ target triple + -> Maybe String -- ^ emulator for testing + -> BuildConfig +crossConfig triple emulator = + vanilla { crossTarget = Just triple + , crossEmulator = emulator + } llvm :: BuildConfig llvm = vanilla { llvmBootstrap = True } @@ -605,6 +612,7 @@ job arch opsys buildConfig = (jobName, Job {..}) , "BIGNUM_BACKEND" =: bignumString (bignumBackend buildConfig) , "CONFIGURE_ARGS" =: configureArgsStr buildConfig , maybe M.empty ("CROSS_TARGET" =:) (crossTarget buildConfig) + , maybe M.empty ("CROSS_EMULATOR" =:) (crossEmulator buildConfig) , if withNuma buildConfig then "ENABLE_NUMA" =: "1" else M.empty ] @@ -781,7 +789,7 @@ jobs = M.fromList $ concatMap flattenJobGroup $ , standardBuilds I386 (Linux Debian9) , allowFailureGroup (standardBuildsWithConfig Amd64 (Linux Alpine) static) , disableValidate (allowFailureGroup (standardBuildsWithConfig Amd64 (Linux Alpine) staticNativeInt)) - , validateBuilds Amd64 (Linux Debian11) (crossConfig "aarch64-linux-gnu") + , validateBuilds Amd64 (Linux Debian11) (crossConfig "aarch64-linux-gnu" (Just "qemu-aarch64 -L /usr/aarch64-linux-gnu")) ] where diff --git a/.gitlab/jobs.yaml b/.gitlab/jobs.yaml index 0efa391a01..10247aba4b 100644 --- a/.gitlab/jobs.yaml +++ b/.gitlab/jobs.yaml @@ -1433,6 +1433,7 @@ "BIN_DIST_NAME": "ghc-x86_64-linux-deb11-cross_aarch64-linux-gnu-validate", "BUILD_FLAVOUR": "validate", "CONFIGURE_ARGS": "--with-intree-gmp", + "CROSS_EMULATOR": "qemu-aarch64 -L /usr/aarch64-linux-gnu", "CROSS_TARGET": "aarch64-linux-gnu", "TEST_ENV": "x86_64-linux-deb11-cross_aarch64-linux-gnu-validate", "XZ_OPT": "-9" @@ -3972,6 +3973,7 @@ "BIN_DIST_NAME": "ghc-x86_64-linux-deb11-cross_aarch64-linux-gnu-validate", "BUILD_FLAVOUR": "validate", "CONFIGURE_ARGS": "--with-intree-gmp", + "CROSS_EMULATOR": "qemu-aarch64 -L /usr/aarch64-linux-gnu", "CROSS_TARGET": "aarch64-linux-gnu", "TEST_ENV": "x86_64-linux-deb11-cross_aarch64-linux-gnu-validate" } -- cgit v1.2.1