From 02823919e3b1fea48489db57d6ee227a8b0cb245 Mon Sep 17 00:00:00 2001 From: Rodrigo Arias Mallo Date: Thu, 9 Oct 2025 14:42:09 +0200 Subject: [PATCH] Add RISC-V cross-compilation target for CI --- .gitea/workflows/ci.yaml | 7 +++++- flake.nix | 4 +--- overlay.nix | 51 ++++++++++++++++++++++++++-------------- 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 7393352e..ba80b87a 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -12,4 +12,9 @@ jobs: runs-on: native steps: - uses: https://gitea.com/ScMi1/checkout@v1.4 - - run: nix build -L --no-link --print-out-paths .#bsc-ci.all + - run: nix build -L --no-link --print-out-paths .#bsc.ci.all + build:cross: + runs-on: native + steps: + - uses: https://gitea.com/ScMi1/checkout@v1.4 + - run: nix build -L --no-link --print-out-paths .#bsc.ci.cross diff --git a/flake.nix b/flake.nix index 0bdaabe2..9ff35543 100644 --- a/flake.nix +++ b/flake.nix @@ -42,9 +42,7 @@ in # full nixpkgs with our overlay applied legacyPackages.${system} = pkgs; - hydraJobs = { - inherit (self.legacyPackages.${system}.bsc-ci) tests pkgs cross; - }; + hydraJobs = self.legacyPackages.${system}.bsc.hydraJobs; # propagate nixpkgs lib, so we can do bscpkgs.lib inherit (nixpkgs) lib; diff --git a/overlay.nix b/overlay.nix index d54ea481..0eefc978 100644 --- a/overlay.nix +++ b/overlay.nix @@ -94,12 +94,18 @@ let }; }; - pkgs = filterAttrs (_: isDerivation) bscPkgs; + # For now, only build toplevel packages in CI/Hydra + pkgsTopLevel = filterAttrs (_: isDerivation) bscPkgs; - crossTargets = [ "riscv64" ]; - cross = prev.lib.genAttrs crossTargets (target: - final.pkgsCross.${target}.bsc-ci.pkgs - ); + # Native build in that platform doesn't imply cross build works + canCrossCompile = platform: pkg: + (isDerivation pkg) && + # Must be defined explicitly + (pkg.meta.cross or false) && + (meta.availableOn platform pkg); + + # For now only RISC-V + crossSet = { riscv64 = final.pkgsCross.riscv64.bsc.pkgsTopLevel; }; buildList = name: paths: final.runCommandLocal name { } '' @@ -113,22 +119,31 @@ let printf '%s\n' $deps >$out ''; - crossList = builtins.mapAttrs (t: v: buildList t (builtins.attrValues v)) cross; - - pkgsList = buildList "ci-pkgs" (builtins.attrValues pkgs); - testList = buildList "ci-tests" (collect isDerivation tests); - - all = buildList' "ci-all" [ pkgsList testList ]; + pkgsList = buildList "ci-pkgs" (builtins.attrValues pkgsTopLevel); + testsList = buildList "ci-tests" (collect isDerivation tests); + allList = buildList' "ci-all" [ pkgsList testsList ]; + # For now only RISC-V + crossList = buildList "ci-cross" + (filter + (canCrossCompile final.pkgsCross.riscv64.stdenv.hostPlatform) + (builtins.attrValues crossSet.riscv64)); in bscPkgs // { - # Prevent accidental usage of bsc attribute - bsc = throw "the bsc attribute is deprecated, packages are now in the root"; + # Prevent accidental usage of bsc-ci attribute + bsc-ci = throw "the bsc-ci attribute is deprecated, use bsc.ci"; # Internal for our CI tests - bsc-ci = { - inherit pkgs pkgsList; - inherit tests testList; - inherit cross crossList; - inherit all; + bsc = { + # CI targets for nix build + ci = { pkgs = pkgsList; tests = testsList; all = allList; cross = crossList; }; + + # Direct access to package sets + tests = tests; + pkgs = bscPkgs; + pkgsTopLevel = pkgsTopLevel; + cross = crossSet; + + # Hydra uses attribute sets of pkgs + hydraJobs = { tests = tests; pkgs = pkgsTopLevel; cross = crossSet; }; }; }