I recently set up crate2nix for the first time, and it’s giving me a fair bit of trouble. I figured out how to make it cross compile to x86_64-linux-musl. Here’s my flake.nix:
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
fenix.url = "github:nix-community/fenix";
fenix.inputs.nixpkgs.follows="nixpkgs";
};
outputs = { self, nixpkgs, flake-utils, fenix }: flake-utils.lib.eachDefaultSystem (system:
let
rustToolchain = fenix.packages.${system}.fromToolchainFile {
file = ./rust-toolchain.toml;
sha256 = "sha256-X/4ZBHO3iW0fOenQ3foEvscgAPJYl2abspaBThDOukI=";
};
pkgs = import nixpkgs {
inherit system;
};
in rec {
packages = (import ./default.nix {inherit pkgs rustToolchain;}) // {inherit rustToolchain crossPackages;};
crossPackages.x86_64 = import ./default.nix {inherit pkgs; pkgsTarget = import nixpkgs {inherit system; crossSystem.config = "x86_64-unknown-linux-musl";}; kernel=pkgs.linuxPackages_latest.kernel;};
# ...other irrelevant stuff...
});
}
And here’s my default.nix
(also edited for brevity):
{pkgs?import <nixpkgs> {},
pkgsTarget?pkgs,
rustToolchain ? null,
}: rec {
initScriptCargoNix = import ./init_script/Cargo.nix {
pkgs = pkgsTarget;
buildRustCrateForPkgs = (pkgs:
if isNull rustToolchain then
pkgs.buildRustCrate
else
pkgs.buildRustCrate.override {cargo = rustToolchain; rustc = rustToolchain;}
);
targetFeatures = ["+crt-static"];
};
initScript = initScriptCargoNix.rootCrate.build;
}
What comes out is something I have never seen a Rust compiler produce before: a binary that is dynamically linked against musl.
$ nix build .#crossPackages.x86_64.initScript
$ $ file result/bin/init_script
result/bin/init_script: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /nix/store/h9ajqvighl86v5pqlchihkbn09wwv7rg-musl-x86_64-unknown-linux-musl-1.2.5/lib/ld-musl-x86_64.so.1, not stripped
Building this exact same crate with cargo build --release --target x86_64-linux-musl
produces a statically linked binary as expected.
Why is crate2nix doing this, and how can I get it to not do it?