Add RISC-V cross-compilation target for CI #195

Manually merged
rarias merged 2 commits from add-cross-ci into master 2025-10-10 12:13:10 +02:00
4 changed files with 43 additions and 22 deletions

View File

@ -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

View File

@ -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;

View File

@ -94,12 +94,18 @@ let
};
};
pkgs = filterAttrs (_: isDerivation) bscPkgs;
# For now, only build toplevel packages in CI/Hydra
pkgsTopLevel = filterAttrs (_: isDerivation) bscPkgs;
rarias marked this conversation as resolved Outdated

So, meta.cross = true is for packages that cross compile, and we know they are correct (tested to be working), right?

So, `meta.cross = true` is for packages that cross compile, and we know they are correct (tested to be working), right?

I think for now I would keep the meaning to just: "This package will be added to the bsc.ci.cross target". The precise meaning is whatever we currently have set in bsc.ci.cross, so we could add future architectures there without touching the packages. Banning a package from cross-compilation to a future arch can be controlled with meta.badPlatforms.

In particular, it would mean that the package builds, not neccesarily that it was further tested.

I think for now I would keep the meaning to just: "This package will be added to the `bsc.ci.cross` target". The precise meaning is whatever we currently have set in `bsc.ci.cross`, so we could add future architectures there without touching the packages. Banning a package from cross-compilation to a future arch can be controlled with `meta.badPlatforms`. In particular, it would mean that the package builds, not neccesarily that it was further tested.
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;
rarias marked this conversation as resolved Outdated

inherit pkgs; would fix the set building non top-level derivations, but maybe we want to do something else?

I think building intelPackages should be fine, but callPackage adding override messes things up.

`inherit pkgs;` would fix the set building non top-level derivations, but maybe we want to do something else? I think building intelPackages should be fine, but callPackage adding override messes things up.

I think building derivations in intelPackages would be a good thing. But we only want to build the amd driver, not every package in linuxPackages. Not sure if recurseForDerivations could help here.

Otherwise, leaving it only for top-level packages would be ok for now.

I think building derivations in intelPackages would be a good thing. But we only want to build the amd driver, not every package in linuxPackages. Not sure if recurseForDerivations could help here. Otherwise, leaving it only for top-level packages would be ok for now.

Leaving it for top-level only.

Leaving it for top-level only.
pkgs = bscPkgs;
pkgsTopLevel = pkgsTopLevel;
cross = crossSet;
# Hydra uses attribute sets of pkgs
hydraJobs = { tests = tests; pkgs = pkgsTopLevel; cross = crossSet; };
};
}

View File

@ -55,4 +55,7 @@ in
doCheck = true;
checkTarget = "test";
hardeningDisable = [ "all" ];
meta = {
cross = true;
};
}