rustshop / flakebox

Flakebox is to your Rust project dev environment, what NixOS is to your OS, or home-manager to your home directory.
95 stars 5 forks source link

true cross-compilation? #160

Open SilentVoid13 opened 1 week ago

SilentVoid13 commented 1 week ago

Hey there, I have a question about cross-compilation with flakebox. It seems to work perfectly as long as you don't have any external pkgs dependencies.

If you do, you want to be using pkgsCross.<target> instead of pkgs for the buildInputs and nativeBuildInputs, but there are no easy way to specify that with flakebox's craneMultiBuild.

A hacky way to manually make it work for a target is to specify the target's pkgs in your flake with:

    pkgs = import nixpkgs {
      localSystem = "x86_64-linux";
      crossSystem.config = "aarch64-unknown-linux-gnu";
    };

To make the cross-compilation work, but of course this is now imposing the aarch64 pkgs on all targets, which is not the point.

Am I missing something or is that a limitation of flakebox? I did take a look at flakebox's source to make it work, but it doesn't seem like a trivial change. My idea would be to accept a pkgsCross function for craneMultiBuild that would look like this:

          nativeBuildInputs = pkgsCross: [
            pkgsCross.openssl
            pkgsCross.sqlite
          ];

This would somehow be forwarded to mkStdTargets where the correct pkgs would be resolved and later passed to mkTarget.

Thoughts about it?

dpc commented 1 week ago

@SilentVoid13 I think your approach might be better, but here's how we've dealt with linking with compiled libraries when cross-compiling:

https://github.com/fedimint/fedimint/blob/748bcfaff28f2d5e396f169065ba60c2053472a4/nix/flakebox.nix#L82

dpc commented 1 week ago

Generally cross-compiling is a PITA, Flake do not have a native support for it, stuff often hits some corner cases etc.

Crane is still doing some fixes too: https://github.com/ipetkov/crane/pull/652

dpc commented 1 week ago

We could relatively easily add support in mergeArgs to support elements of the list which are lambdas pkgsCross: ... and evaluate over specific pkgCross in craneMultiBuild. It wouldn't be a huge change, I guess.

If you have some time, please submit a PR. @SilentVoid13 .

SilentVoid13 commented 1 week ago

Thanks for the reply, I'll take a look at it and see if I come up with something functional.