cachix / devenv

Fast, Declarative, Reproducible, and Composable Developer Environments
https://devenv.sh
Apache License 2.0
3.56k stars 259 forks source link

Devenv not working with cargo-cross package #866

Closed CryoMyst closed 1 month ago

CryoMyst commented 6 months ago

Devenv does not seem to play nicely with cargo-cross which I use a lot for cross compilation.

Example

Repo example: https://github.com/CryoMyst/cargo_cross_flake_test

just edit flake.nix to switch between devenv and a normal rust overlay.

Devenv

flake.nix

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    devenv.url = "github:cachix/devenv";
    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = inputs@{ nixpkgs, flake-parts, ... }:
    flake-parts.lib.mkFlake { inherit inputs; } {
      imports = [
        inputs.devenv.flakeModule
      ];
      systems = nixpkgs.lib.systems.flakeExposed;

      perSystem = { config, self', inputs', pkgs, system, ... }: {
        devenv.shells.default = {
          packages = with pkgs; [ 
            rustup
            docker
            cargo-cross
          ];
          languages.rust.enable = true;
          languages.rust.channel = "nightly";
          languages.rust.components = [ "rustc" "cargo" "clippy" "rustfmt" "rust-analyzer" "rust-src" "rust-std" ];
          env.RUST_BACKTRACE = "1";
        };
      };
    };
}

Result

warning: Git tree 'XXX/cargo_cross_flake_test' is dirty
error: invalid toolchain name: 'ymb2iynlj139ycasq3702qiwf1y7iqgk-rust-nightly-latest-with-std-2023-11-06'
Error: 
   0: couldn't install toolchain `ymb2iynlj139ycasq3702qiwf1y7iqgk-rust-nightly-latest-with-std-2023-11-06`
   1: `rustup toolchain add ymb2iynlj139ycasq3702qiwf1y7iqgk-rust-nightly-latest-with-std-2023-11-06 --profile minimal` failed with exit status: 1

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                                ⋮ 2 frames hidden ⋮                               
   3: cross::rustup::install_toolchain::hdd468ccbb79b9f56
      at <unknown source file>:<unknown line>
   4: cross::run::hc97f40af300abf4a
      at <unknown source file>:<unknown line>
   5: cross::main::hcf16ece8b1c21125
      at <unknown source file>:<unknown line>
   6: std::sys_common::backtrace::__rust_begin_short_backtrace::hb542e52ccc67ec61
      at <unknown source file>:<unknown line>
   7: main<unknown>
      at <unknown source file>:<unknown line>
   8: __libc_start_call_main<unknown>
      at <unknown source file>:<unknown line>
   9: __libc_start_main_impl<unknown>
      at <unknown source file>:<unknown line>
  10: _start<unknown>
      at <unknown source file>:<unknown line>

Overlay

flake.nix

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    rust-overlay.url = "github:oxalica/rust-overlay";
  };

  outputs = {
    self,
    nixpkgs,
    rust-overlay,
  }: let
    system = "x86_64-linux";
    pkgs = import nixpkgs {
      inherit system;
      overlays = [rust-overlay.overlays.default];
    };
    toolchain = pkgs.rust-bin.fromRustupToolchainFile ./toolchain.toml;
  in {
    devShells.${system}.default = pkgs.mkShell {
      packages = [
        pkgs.docker
        pkgs.rustup
        pkgs.cargo-cross
        toolchain
      ];

      shellHook = ''
        export RUST_SRC_PATH="${toolchain}/lib/rustlib/src/rust/library"
      '';
    };
  };
}

Result

➜  cargo_cross_flake_test git:(master) ✗ ./build-flake.sh
warning: Git tree 'XXX/cargo_cross_flake_test' is dirty
   Compiling windows_x86_64_gnu v0.48.5
   Compiling windows-targets v0.48.5
   Compiling windows v0.48.0
   Compiling flake_overlay v0.1.0 (/project)
    Finished release [optimized] target(s) in 2.29s
sandydoo commented 6 months ago

It's using the wrong rust-std. You need the one for your target platform. The rust-overlay example reads the target from your toolchain.toml. The devenv+fenix version doesn't know anything about targets.

I imagine no one's done this before, so we're missing a nice interface to specify the targets. I managed to get a bit further by overriding the toolchain. It gets stuck on something else later on though.

languages.rust.enable = true;
languages.rust.channel = "nightly";
languages.rust.components = [];
languages.rust.toolchain = pkgs.lib.mkForce (with fenix.packages.${system};
  combine [ latest.rustc latest.cargo latest.rust-src targets.x86_64-pc-windows-gnu.latest.rust-std ]
);
sandydoo commented 6 months ago

@CryoMyst, could you try running the above on your end? I don't have an x86 machine to try this on.

sandydoo commented 6 months ago

Turns out fenix supports toolchain files!

languages.rust.toolchain =
  fenix.packages.${system}.fromToolchainFile {
    file = ./toolchain.toml;
    sha256 = "sha256-SS4GpScL/PIMXVvrIRJTHQyTEvX5cAXgeXz0zu7MbvU=";
  };
CryoMyst commented 6 months ago

@sandydoo

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    devenv.url = "github:cachix/devenv";
    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = inputs@{ nixpkgs, flake-parts, ... }:
    flake-parts.lib.mkFlake { inherit inputs; } {
      imports = [
        inputs.devenv.flakeModule
      ];
      systems = nixpkgs.lib.systems.flakeExposed;

      perSystem = { config, self', inputs', pkgs, system, ... }: {
        devenv.shells.default = {
          packages = with pkgs; [ 
            rustup
            docker
            cargo-cross
          ];
          languages.rust.enable = true;
          languages.rust.channel = "nightly";
          languages.rust.toolchain = pkgs.lib.mkForce (with inputs.fenix.packages.${system};
            combine [ latest.rustc latest.cargo latest.rust-src targets.x86_64-pc-windows-gnu.latest.rust-std ]
          );
          env.RUST_BACKTRACE = "1";
        };
      };
    };
}

Still results in

[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ ./build.sh 
error: invalid toolchain name: 'c9sfgb6nm54dcagbys51dvjbwbbmbh2r-rustc-1.72.1'
Error: 
   0: couldn't install toolchain `c9sfgb6nm54dcagbys51dvjbwbbmbh2r-rustc-1.72.1`
   1: `rustup toolchain add c9sfgb6nm54dcagbys51dvjbwbbmbh2r-rustc-1.72.1 --profile minimal` failed with exit status: 1

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                                ⋮ 2 frames hidden ⋮                               
   3: cross::rustup::install_toolchain::hdd468ccbb79b9f56
      at <unknown source file>:<unknown line>
   4: cross::run::hc97f40af300abf4a
      at <unknown source file>:<unknown line>
   5: cross::main::hcf16ece8b1c21125
      at <unknown source file>:<unknown line>
   6: std::sys_common::backtrace::__rust_begin_short_backtrace::hb542e52ccc67ec61
      at <unknown source file>:<unknown line>
   7: main<unknown>
      at <unknown source file>:<unknown line>
   8: __libc_start_call_main<unknown>
      at <unknown source file>:<unknown line>
   9: __libc_start_main_impl<unknown>
      at <unknown source file>:<unknown line>
  10: _start<unknown>
      at <unknown source file>:<unknown line>
(devenv) 
sandydoo commented 6 months ago

It's important to set this:

languages.rust.components = [];
CryoMyst commented 6 months ago

Fair, So I did that and rustc and cargo were not in path so did this

        devenv.shells.default = {
          packages = with pkgs; [
            rustup
            docker
            cargo-cross
            inputs.fenix.packages.${system}.latest.rustc
            inputs.fenix.packages.${system}.latest.cargo
          ];
          languages.rust.enable = true;
          languages.rust.channel = "nightly";
          languages.rust.components = [];
          languages.rust.toolchain = pkgs.lib.mkForce (with inputs.fenix.packages.${system};
            combine [ latest.rustc latest.cargo latest.rust-src targets.x86_64-pc-windows-gnu.latest.rust-std ]
          );
          env.RUST_BACKTRACE = "1";
          env.NIX_STORE = "/nix/store"
          enterShell = ''
            export PATH="${inputs.fenix.packages.${system}.latest.rustc.outPath}/bin:$PATH"
            export PATH="${inputs.fenix.packages.${system}.latest.cargo.outPath}/bin:$PATH"
          '';
        };

Still results in the following

error: invalid toolchain name: 'wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11'
Error: 
   0: couldn't install toolchain `wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11`
   1: `rustup toolchain add wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11 --profile minimal` failed with exit status: 1
   ...
CryoMyst commented 6 months ago

The paths are /nix/store/4wklwyfpkqxvwhg6y0kzcmczl0yd3vis-cargo-nightly-latest-2023-11-11/bin:/nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11/bin

So it is pulling it from this path.

rustc --print sysroot
/nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11
CryoMyst commented 6 months ago

Tried setting CROSS_CUSTOM_TOOLCHAIN and CROSS_CUSTOM_TOOLCHAIN_COMPAT from their source

[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ echo $CROSS_CUSTOM_TOOLCHAIN
1
(devenv) 
[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ echo $CROSS_CUSTOM_TOOLCHAIN_COMPAT
x86_64-pc-windows-gnu
(devenv) 
[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ cross build -vv --target x86_64-pc-windows-gnu --release
+ cargo metadata --format-version 1 --filter-platform x86_64-pc-windows-gnu
+ rustc --print sysroot
+ rustup toolchain list
+ rustup --verbose toolchain add wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11 --profile minimal
verbose: read metadata version: '12'
error: invalid toolchain name: 'wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11'
Error: 
   0: couldn't install toolchain `wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11`
   1: `rustup --verbose toolchain add wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11 --profile minimal` failed with exit status: 1

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                                ⋮ 2 frames hidden ⋮                               
   3: cross::rustup::install_toolchain::hdd468ccbb79b9f56
      at <unknown source file>:<unknown line>
   4: cross::run::hc97f40af300abf4a
      at <unknown source file>:<unknown line>
   5: cross::main::hcf16ece8b1c21125
      at <unknown source file>:<unknown line>
   6: std::sys_common::backtrace::__rust_begin_short_backtrace::hb542e52ccc67ec61
      at <unknown source file>:<unknown line>
   7: main<unknown>
      at <unknown source file>:<unknown line>
   8: __libc_start_call_main<unknown>
      at <unknown source file>:<unknown line>
   9: __libc_start_main_impl<unknown>
      at <unknown source file>:<unknown line>
  10: _start<unknown>
      at <unknown source file>:<unknown line>
(devenv) 
CryoMyst commented 6 months ago

Ok so this seems to be slightly better when I use the master branch of https://github.com/cross-rs/cross

          env.NIX_STORE = "/nix/store";
          env.CROSS_CUSTOM_TOOLCHAIN = "1";
          env.CROSS_CUSTOM_TOOLCHAIN_COMPAT = "x86_64-pc-windows-gnu";
          enterShell = ''
            export PATH="${inputs.fenix.packages.${system}.latest.rustc.outPath}/bin:$PATH"
            export PATH="${inputs.fenix.packages.${system}.latest.cargo.outPath}/bin:$PATH"
          '';
[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ ../cross/target/debug/cross build -vv --target x86_64-pc-windows-gnu --release
+ cargo metadata --format-version 1 --filter-platform x86_64-pc-windows-gnu
+ rustc --print sysroot
+ /nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11/bin/rustc
+ /nix/store/kzbarw9ljqzgrmjx8i9q2s321bsl9ir2-devenv-profile/bin/docker
+ /nix/store/kzbarw9ljqzgrmjx8i9q2s321bsl9ir2-devenv-profile/bin/docker version -f '{{ .Server.Os }},,,{{ .Server.Arch }}'
+ /nix/store/kzbarw9ljqzgrmjx8i9q2s321bsl9ir2-devenv-profile/bin/docker buildx build --progress auto --build-arg 'VERBOSE=1' --label 'org.cross-rs.for-cross-target=x86_64-pc-windows-gnu' --label 'org.cross-rs.runs-with=x86_64-unknown-linux-gnu' --label 'org.cross-rs.workspace_root=/home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test' --tag localhost/cross-rs/cross-custom-cargo_cross_flake_test:x86_64-pc-windows-gnu-1d63a-pre-build --build-arg 'CROSS_CMD=apt-get update' --file /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test/target/x86_64-pc-windows-gnu/Dockerfile.x86_64-pc-windows-gnu-custom --output 'type=docker' /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test
[+] Building 0.3s (6/6) FINISHED                                                                                                                                docker:default
 => [internal] load build definition from Dockerfile.x86_64-pc-windows-gnu-custom                                                                                         0.0s
 => => transferring dockerfile: 239B                                                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                         0.0s
 => => transferring context: 2B                                                                                                                                           0.0s
 => [internal] load metadata for ghcr.io/cross-rs/x86_64-pc-windows-gnu:main                                                                                              0.3s
 => [1/2] FROM ghcr.io/cross-rs/x86_64-pc-windows-gnu:main@sha256:a46f97bb305d0fcabc04c3bd2d59b953f17b039d353af3e2138a785e4fd11e0c                                        0.0s
 => CACHED [2/2] RUN eval "apt-get update"                                                                                                                                0.0s
 => exporting to image                                                                                                                                                    0.0s
 => => exporting layers                                                                                                                                                   0.0s
 => => writing image sha256:3f6265cc4fe7d3bb913aedb0806b95a3822a4a0130b5e1c5329e95f03461cfdf                                                                              0.0s
 => => naming to localhost/cross-rs/cross-custom-cargo_cross_flake_test:x86_64-pc-windows-gnu-1d63a-pre-build                                                             0.0s
+ /nix/store/kzbarw9ljqzgrmjx8i9q2s321bsl9ir2-devenv-profile/bin/docker run --userns host -e 'PKG_CONFIG_ALLOW_CROSS=1' -e 'XARGO_HOME=/home/cryomyst/.xargo' -e 'CARGO_HOME=/home/cryomyst/.cargo' -e 'CROSS_RUST_SYSROOT=/nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11' -e 'CARGO_TARGET_DIR=/target' -e 'CROSS_RUNNER=' -e CROSS_CUSTOM_TOOLCHAIN -e CROSS_CUSTOM_TOOLCHAIN_COMPAT -e TERM -e CARGO_INSTALL_ROOT -e 'USER=cryomyst' -e 'CROSS_RUSTC_MAJOR_VERSION=1' -e 'CROSS_RUSTC_MINOR_VERSION=0' -e 'CROSS_RUSTC_PATCH_VERSION=0' --name cross-wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11-1ad8a-edf0b1db0-x86_64-pc-windows-gnu-1d63a-1699712572669 --rm --user 1000:100 -v /home/cryomyst/.xargo:/home/cryomyst/.xargo:z -v /home/cryomyst/.cargo:/home/cryomyst/.cargo:z -v /home/cryomyst/.cargo/bin -v /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test:/home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test:z -v /nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11:/nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11:z,ro -v /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test/target:/target:z -w /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test -v /nix/store:/nix/store:z -t localhost/cross-rs/cross-custom-cargo_cross_flake_test:x86_64-pc-windows-gnu-1d63a-pre-build sh -c 'PATH="$PATH":"/nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11/bin" cargo build -vv --target x86_64-pc-windows-gnu --release'
sh: 1: cargo: not found
+ rustup component list --toolchain wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11
Error: 
   0: could not execute `rustup component list --toolchain wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11`
   1: No such file or directory (os error 2)

Location:
   /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/convert/mod.rs:716

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                                ⋮ 5 frames hidden ⋮                               
   6: <T as core::convert::Into<U>>::into::ha6de9877ef1fdbac
      at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/convert/mod.rs:716
                                 ⋮ 1 frame hidden ⋮                               
   8: cross::errors::CommandError::to_section_report::h4e7cedc47ebc5afe
      at /home/cryomyst/Projects/Personal/Other/cross/src/errors.rs:151
   9: <std::process::Command as cross::extensions::CommandExt>::run_and_get_output::{{closure}}::h69830eea5e8b12e2
      at /home/cryomyst/Projects/Personal/Other/cross/src/extensions.rs:187
  10: core::result::Result<T,E>::map_err::hfda0fe2248711ecd
      at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/result.rs:829
  11: <std::process::Command as cross::extensions::CommandExt>::run_and_get_output::h1e35f4c067c1ad26
      at /home/cryomyst/Projects/Personal/Other/cross/src/extensions.rs:186
  12: <std::process::Command as cross::extensions::CommandExt>::run_and_get_stdout::h1ee9915c29e46d5d
      at /home/cryomyst/Projects/Personal/Other/cross/src/extensions.rs:172
  13: cross::rustup::check_component::h6cd0f257aec9c6fe
      at /home/cryomyst/Projects/Personal/Other/cross/src/rustup.rs:240
  14: cross::warn_on_failure::h7ffd23b875241349
      at /home/cryomyst/Projects/Personal/Other/cross/src/lib.rs:493
  15: cross::run::h73adc16128454b03
      at /home/cryomyst/Projects/Personal/Other/cross/src/lib.rs:644
  16: cross::main::h95a7d649eb4f97ef
      at /home/cryomyst/Projects/Personal/Other/cross/src/bin/cross.rs:22
  17: core::ops::function::FnOnce::call_once::h70c538c954f5e7e8
      at /rustc/cc66ad468955717ab92600c770da8c1601a4ff33/library/core/src/ops/function.rs:250
                                ⋮ 16 frames hidden ⋮                              

Run with COLORBT_SHOW_HIDDEN=1 environment variable to disable frame filtering.
Run with RUST_BACKTRACE=full to include source snippets.
(devenv) 
CryoMyst commented 6 months ago

So the overlay way works setting the NIX_SHELL and CROSS_CUSTOM_TOOLCHAIN vars Seems the problem is with the devenv solution above cargo and rustc are in different nix stores locations instead of together. Cross only seems to add the rustc path to PATH. @sandydoo What do you think?

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
    flake-utils.url = "github:numtide/flake-utils";
    rust-overlay = {
      url = "github:oxalica/rust-overlay";
      inputs = {
        nixpkgs.follows = "nixpkgs";
        flake-utils.follows = "flake-utils";
      };
    };
  };
  outputs = { self, nixpkgs, flake-utils, rust-overlay }:
    flake-utils.lib.eachDefaultSystem
      (system:
        let
          overlays = [ (import rust-overlay) ];
          pkgs = import nixpkgs {
            inherit system overlays;
          };
          # 👇 new! note that it refers to the path ./rust-toolchain.toml
          rustToolchain = pkgs.pkgsBuildHost.rust-bin.fromRustupToolchainFile ./toolchain.toml;
        in
        with pkgs;
        {
          devShells.default = mkShell {
            # 👇 we can just use `rustToolchain` here:
            buildInputs = [ rustToolchain ];
            shellHook = ''
              export NIX_STORE="/nix/store"
              export CROSS_CUSTOM_TOOLCHAIN="1"
              export CROSS_CUSTOM_TOOLCHAIN_COMPAT="x86_64-pc-windows-gnu"
            ''; 
          };
        }
      );
}
[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ ../cross/target/debug/cross build -vv --target x86_64-pc-windows-gnu --release
+ cargo metadata --format-version 1 --filter-platform x86_64-pc-windows-gnu
+ rustc --print sysroot
+ /nix/store/mwm5ny2zxah1cqd0z12p79vc2dyq4v2l-rust-complete-1.75.0-nightly-2023-11-11/bin/rustc
+ /run/current-system/sw/bin/docker
+ /run/current-system/sw/bin/docker version -f '{{ .Server.Os }},,,{{ .Server.Arch }}'
+ /run/current-system/sw/bin/docker buildx build --progress auto --build-arg 'VERBOSE=1' --label 'org.cross-rs.for-cross-target=x86_64-pc-windows-gnu' --label 'org.cross-rs.runs-with=x86_64-unknown-linux-gnu' --label 'org.cross-rs.workspace_root=/home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test' --tag localhost/cross-rs/cross-custom-cargo_cross_flake_test:x86_64-pc-windows-gnu-1d63a-pre-build --build-arg 'CROSS_CMD=apt-get update' --file /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test/target/x86_64-pc-windows-gnu/Dockerfile.x86_64-pc-windows-gnu-custom --output 'type=docker' /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test
[+] Building 0.5s (6/6) FINISHED                                                                                                                                docker:default
 => [internal] load build definition from Dockerfile.x86_64-pc-windows-gnu-custom                                                                                         0.0s
 => => transferring dockerfile: 239B                                                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                         0.0s
 => => transferring context: 2B                                                                                                                                           0.0s
 => [internal] load metadata for ghcr.io/cross-rs/x86_64-pc-windows-gnu:main                                                                                              0.5s
 => [1/2] FROM ghcr.io/cross-rs/x86_64-pc-windows-gnu:main@sha256:a46f97bb305d0fcabc04c3bd2d59b953f17b039d353af3e2138a785e4fd11e0c                                        0.0s
 => CACHED [2/2] RUN eval "apt-get update"                                                                                                                                0.0s
 => exporting to image                                                                                                                                                    0.0s
 => => exporting layers                                                                                                                                                   0.0s
 => => writing image sha256:3f6265cc4fe7d3bb913aedb0806b95a3822a4a0130b5e1c5329e95f03461cfdf                                                                              0.0s
 => => naming to localhost/cross-rs/cross-custom-cargo_cross_flake_test:x86_64-pc-windows-gnu-1d63a-pre-build                                                             0.0s
+ /run/current-system/sw/bin/docker run --userns host -e 'PKG_CONFIG_ALLOW_CROSS=1' -e 'XARGO_HOME=/home/cryomyst/.xargo' -e 'CARGO_HOME=/home/cryomyst/.cargo' -e 'CROSS_RUST_SYSROOT=/nix/store/mwm5ny2zxah1cqd0z12p79vc2dyq4v2l-rust-complete-1.75.0-nightly-2023-11-11' -e 'CARGO_TARGET_DIR=/target' -e 'CROSS_RUNNER=' -e CROSS_CUSTOM_TOOLCHAIN -e CROSS_CUSTOM_TOOLCHAIN_COMPAT -e TERM -e 'USER=cryomyst' -e 'CROSS_RUSTC_MAJOR_VERSION=1' -e 'CROSS_RUSTC_MINOR_VERSION=0' -e 'CROSS_RUSTC_PATCH_VERSION=0' --name cross-mwm5ny2zxah1cqd0z12p79vc2dyq4v2l-rust-complete-1.75.0-nightly-2023-11-11-97c53-edf0b1db0-x86_64-pc-windows-gnu-1d63a-1699714618646 --rm --user 1000:100 -v /home/cryomyst/.xargo:/home/cryomyst/.xargo:z -v /home/cryomyst/.cargo:/home/cryomyst/.cargo:z -v /home/cryomyst/.cargo/bin -v /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test:/home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test:z -v /nix/store/mwm5ny2zxah1cqd0z12p79vc2dyq4v2l-rust-complete-1.75.0-nightly-2023-11-11:/nix/store/mwm5ny2zxah1cqd0z12p79vc2dyq4v2l-rust-complete-1.75.0-nightly-2023-11-11:z,ro -v /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test/target:/target:z -w /home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test -v /nix/store:/nix/store:z -t localhost/cross-rs/cross-custom-cargo_cross_flake_test:x86_64-pc-windows-gnu-1d63a-pre-build sh -c 'PATH="$PATH":"/nix/store/mwm5ny2zxah1cqd0z12p79vc2dyq4v2l-rust-complete-1.75.0-nightly-2023-11-11/bin" cargo build -vv --target x86_64-pc-windows-gnu --release'
       Fresh windows_x86_64_gnu v0.48.5
       Fresh windows-targets v0.48.5
       Fresh windows v0.48.0
warning: variable does not need to be mutable
  --> /home/cryomyst/.cargo/registry/src/index.crates.io-6f17d22bba15001f/windows-0.48.0/src/core/strings/hstring.rs:69:13
   |
69 |         let mut ptr = Header::alloc(len)?;
   |             ----^^^
   |             |
   |             help: remove this `mut`
   |
   = note: `#[warn(unused_mut)]` on by default

warning: `windows` (lib) generated 1 warning
       Fresh flake_overlay v0.1.0 (/home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test)
    Finished release [optimized] target(s) in 0.00s

[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ ls /nix/store/mwm5ny2zxah1cqd0z12p79vc2dyq4v2l-rust-complete-1.75.0-nightly-2023-11-11/bin
cargo  cargo-clippy  cargo-fmt  cargo-miri  clippy-driver  miri  rls  rust-analyzer  rustc  rustdoc  rustfmt  rust-gdb  rust-gdbgui  rust-lldb
CryoMyst commented 6 months ago

The devenv does sh -c 'PATH="$PATH":"/nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11/bin"

[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ ls /nix/store/wy8b0x74ny71jvnidysdzgqll5kgms5i-rust-nightly-latest-with-std-2023-11-11/bin
rustc  rustdoc  rust-gdb  rust-gdbgui  rust-lldb
(devenv) 
[cryomyst@cryo-desktop:~/Projects/Personal/Other/cargo_cross_flake_test]$ ls /nix/store/4wklwyfpkqxvwhg6y0kzcmczl0yd3vis-cargo-nightly-latest-2023-11-11/bin
cargo
(devenv)
sandydoo commented 6 months ago

You've lost me! Too many things are changing at once.

I've put both shells into a single flake and minimized the differences between them. Both versions now successfully cross-compile for me on x86. https://github.com/sandydoo/cargo_cross_flake_test/blob/13415314a9e83b313e3786bf466b83c2bd214811/flake.nix

CryoMyst commented 6 months ago

I just tried your wip branch (had to replace a hash), am I missing something here?

➜  Other git clone https://github.com/sandydoo/cargo_cross_flake_test cargo_cross_flake_test_sandydoo
Cloning into 'cargo_cross_flake_test_sandydoo'...
remote: Enumerating objects: 34, done.
remote: Counting objects: 100% (34/34), done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 34 (delta 12), reused 28 (delta 6), pack-reused 0
Receiving objects: 100% (34/34), 11.01 KiB | 704.00 KiB/s, done.
Resolving deltas: 100% (12/12), done.
➜  Other cd cargo_cross_flake_test_sandydoo
➜  cargo_cross_flake_test_sandydoo git:(master) git switch wip
branch 'wip' set up to track 'origin/wip'.
Switched to a new branch 'wip'
➜  cargo_cross_flake_test_sandydoo git:(wip) ./build-flake.sh
error:
       … while calling the 'derivationStrict' builtin

         at /builtin/derivation.nix:9:12: (source not available)

       … while evaluating derivation 'devenv-shell'
         whose name attribute is located at /nix/store/v3dzkqmafmjcx98rhaf7zqf34zgv3zyd-source/src/modules/mkNakedShell.nix:63:12

       … while evaluating attribute 'args' of derivation 'devenv-shell'

         at /nix/store/v3dzkqmafmjcx98rhaf7zqf34zgv3zyd-source/src/modules/mkNakedShell.nix:70:5:

           69|     # Bring in the dependencies on `nix-build`
           70|     args = [ "-ec" "${coreutils}/bin/ln -s ${profile} $out; exit 0" ];
             |     ^
           71|

       (stack trace truncated; use '--show-trace' to show the full trace)

       error: hash mismatch in fixed-output derivation '/nix/store/ls4bx6lyhskgygc9yakn7miac056dna9-channel-rust-nightly.toml.drv':
         specified: sha256-0d/UxN6sekF+iQtebQl6jj/AQiT18Uag3CKbsCxc1E0=
            got:    sha256-iO9RjucunishecHEk6gifAyaP8nFlrFIBfIhh0RBLvc=
➜  cargo_cross_flake_test_sandydoo git:(wip) nvim flake/flake.nix
➜  cargo_cross_flake_test_sandydoo git:(wip) nvim flake.nix
➜  cargo_cross_flake_test_sandydoo git:(wip) ✗ ./build-flake.sh
warning: Git tree '/home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test_sandydoo' is dirty
Error:
   0: `rustc --print target-list` failed with exit status: 1

Stderr:
   error: command failed: 'rustc'

   Caused by:
       No such file or directory (os error 2)

  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ BACKTRACE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                                ⋮ 2 frames hidden ⋮
   3: cross::errors::CommandError::to_section_report::haf6db90edbbc2fa1
      at <unknown source file>:<unknown line>
   4: <std::process::Command as cross::extensions::CommandExt>::run_and_get_stdout::h41183c33031a72dc
      at <unknown source file>:<unknown line>
   5: cross::rustc::target_list::hb77019062f2d86b9
      at <unknown source file>:<unknown line>
   6: cross::main::h78080d144cfea61c
      at <unknown source file>:<unknown line>
   7: std::sys_common::backtrace::__rust_begin_short_backtrace::hbdb628ab08aea082
      at <unknown source file>:<unknown line>
   8: main<unknown>
      at <unknown source file>:<unknown line>
   9: __libc_start_call_main<unknown>
      at <unknown source file>:<unknown line>
  10: __libc_start_main_impl<unknown>
      at <unknown source file>:<unknown line>
  11: _start<unknown>
      at <unknown source file>:<unknown line>
sandydoo commented 6 months ago

Weird stuff. What do which rustc and which cross return when inside nix develop -L .#devenv --impure? They should point to the devenv profile. The devenv profile should also be in your path

sandydoo commented 6 months ago

I've run my fixes on GitHub Actions and it all works. It'd be great to figure out what's going wrong with your setup.

As far as devenv is concerned, I would propose exposing the following options:

The targets option is a bit tricky to implement. rust-std would need to be fetched from targets.<target-triple>.<channel>.rust-std.

CryoMyst commented 6 months ago

Thanks @sandydoo , I will try and look deeper into what is causing my builds to fail locally.

ulrikstrid commented 5 months ago

@sandydoo does #900 fix this? I've tested with wasm target.

CryoMyst commented 4 months ago

Figured I would give an update and come back to this. For some reason it now works using the same commands I did in the previous attempt? Not sure what we can really determine about why it was failing before. /shrug

➜  Other git clone https://github.com/sandydoo/cargo_cross_flake_test cargo_cross_flake_test_sandydoo
Cloning into 'cargo_cross_flake_test_sandydoo'...
remote: Enumerating objects: 50, done.
remote: Counting objects: 100% (50/50), done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 50 (delta 18), reused 41 (delta 9), pack-reused 0
Receiving objects: 100% (50/50), 15.49 KiB | 1.41 MiB/s, done.
Resolving deltas: 100% (18/18), done.
➜  Other cd cargo_cross_flake_test_sandydoo
➜  cargo_cross_flake_test_sandydoo git:(master) git switch wip
branch 'wip' set up to track 'origin/wip'.
Switched to a new branch 'wip'
➜  cargo_cross_flake_test_sandydoo git:(wip) ./build-flake.sh
[+] Building 0.3s (6/6) FINISHED                                                                        docker:default
 => [internal] load .dockerignore                                                                                 0.0s
 => => transferring context: 2B                                                                                   0.0s
 => [internal] load build definition from Dockerfile.x86_64-pc-windows-gnu-custom                                 0.0s
 => => transferring dockerfile: 240B                                                                              0.0s
 => [internal] load metadata for ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5                                     0.3s
 => [1/2] FROM ghcr.io/cross-rs/x86_64-pc-windows-gnu:0.2.5@sha256:8ba72a5491168af78e52f453f09d204cee330ff09a032  0.0s
 => CACHED [2/2] RUN eval "apt-get update"                                                                        0.0s
 => exporting to image                                                                                            0.0s
 => => exporting layers                                                                                           0.0s
 => => writing image sha256:c4e9d11a6d9ee47e9548cf7bde6c9d27e1d5c7f6790e16a9b17dcaa51bb561bb                      0.0s
 => => naming to localhost/cross-rs/cross-custom-cargo_cross_flake_test_sandydoo:x86_64-pc-windows-gnu-7fd0b-pre  0.0s
   Compiling windows_x86_64_gnu v0.48.5
   Compiling windows-targets v0.48.5
   Compiling windows v0.48.0
   Compiling flake_overlay v0.1.0 (/home/cryomyst/Projects/Personal/Other/cargo_cross_flake_test_sandydoo)
    Finished release [optimized] target(s) in 2.30s
domenkozar commented 1 month ago

You can now specify targets, does this address the issue?

CryoMyst commented 1 month ago

This seems to work at commit 02196df5a23e511d9fe7b9e80147cb198eceb450 however there were still some extra steps required for cargo-cross (Putting it here for future adventurers).

Something uses rustc --print sysroot to determine the toolchain triple so you will get the following:

 cross build --target "aarch64-unknown-linux-gnu" --verbose
+ cargo metadata --format-version 1 --filter-platform aarch64-unknown-linux-gnu
+ rustc --print sysroot
Error:
   0: could not determine os in target triplet
   1: unsupported os in target, abi: "mixed", system: "rust"
rustc --print sysroot
/nix/store/8bfii2p5pjdqapng1wxksa116aahacl6-rust-mixed

To fix this I had to use the following to specify it manually.

env.CROSS_CUSTOM_TOOLCHAIN = "1";
env.CROSS_CUSTOM_TOOLCHAIN_COMPAT = "x86_64-pc-windows-gnu";

Other than that it was fine and I was able to run ./build-flake.sh in my updated test repo https://github.com/CryoMyst/cargo_cross_flake_test without any issues.

ulrikstrid commented 1 month ago

This seems to work at commit 02196df5a23e511d9fe7b9e80147cb198eceb450 however there were still some extra steps required for cargo-cross (Putting it here for future adventurers).

Something uses rustc --print sysroot to determine the toolchain triple so you will get the following:

 cross build --target "aarch64-unknown-linux-gnu" --verbose
+ cargo metadata --format-version 1 --filter-platform aarch64-unknown-linux-gnu
+ rustc --print sysroot
Error:
   0: could not determine os in target triplet
   1: unsupported os in target, abi: "mixed", system: "rust"
rustc --print sysroot
/nix/store/8bfii2p5pjdqapng1wxksa116aahacl6-rust-mixed

To fix this I had to use the following to specify it manually.

env.CROSS_CUSTOM_TOOLCHAIN = "1";
env.CROSS_CUSTOM_TOOLCHAIN_COMPAT = "x86_64-pc-windows-gnu";

Other than that it was fine and I was able to run ./build-flake.sh in my updated test repo https://github.com/CryoMyst/cargo_cross_flake_test without any issues.

Can we set these flags automatically in some cases?

CryoMyst commented 1 month ago

These environment variables are specific to this tool so I'm not sure this is devenvs responsibility. It might also be changed per build in case of cross compiling to multiple targets.