From e3078ba61db873e77eef9f948f809edef7e32935 Mon Sep 17 00:00:00 2001 From: Edward Langley Date: Mon, 30 Mar 2026 22:22:11 -0700 Subject: [PATCH] fix: make nix flake and cargo config portable across Linux and macOS musl tooling is Linux-only, so guard it behind an isLinux check in flake.nix and remove the hardcoded musl build target from .cargo/config.toml (the nix devShell already sets CARGO_BUILD_TARGET on Linux). Co-Authored-By: Claude Sonnet 4.6 --- .cargo/config.toml | 8 +++----- flake.nix | 47 ++++++++++++++++++++++++++++------------------ 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/.cargo/config.toml b/.cargo/config.toml index d684ec8..ca10c34 100644 --- a/.cargo/config.toml +++ b/.cargo/config.toml @@ -1,8 +1,6 @@ -[build] -# Always build a fully-static musl binary by default. -# The devShell sets CARGO_BUILD_TARGET and CARGO_TARGET_*_LINKER, -# so the linker is resolved automatically via the environment. -target = "x86_64-unknown-linux-musl" +# The nix devShell sets CARGO_BUILD_TARGET=x86_64-unknown-linux-musl +# and the matching linker env vars, so no [build] target is needed here. +# This keeps the config portable across Linux and macOS. [target.x86_64-unknown-linux-gnu] # Use gcc (not rust-lld) for host-target build scripts on NixOS. diff --git a/flake.nix b/flake.nix index a598066..d2e93e8 100644 --- a/flake.nix +++ b/flake.nix @@ -15,48 +15,59 @@ let overlays = [ (import rust-overlay) ]; pkgs = import nixpkgs { inherit system overlays; }; + isLinux = pkgs.lib.hasInfix "linux" system; rustToolchain = pkgs.rust-bin.stable.latest.default.override { extensions = [ "rust-src" "clippy" "rustfmt" ]; - targets = [ "x86_64-unknown-linux-musl" ]; + targets = pkgs.lib.optionals isLinux [ "x86_64-unknown-linux-musl" ]; }; - - muslCC = pkgs.pkgsMusl.stdenv.cc; in { - devShells.default = pkgs.mkShell { + devShells.default = pkgs.mkShell ({ nativeBuildInputs = [ rustToolchain pkgs.pkg-config + ] ++ pkgs.lib.optionals isLinux [ # Provide cc (gcc) for building proc-macro / build-script crates # that target the host (x86_64-unknown-linux-gnu). pkgs.gcc # musl-gcc wrapper for the static musl target. - muslCC + pkgs.pkgsMusl.stdenv.cc ]; + RUST_BACKTRACE = "1"; + } // pkgs.lib.optionalAttrs isLinux { # Tell Cargo which linker to use for each target so it never # falls back to rust-lld (which can't find glibc on NixOS). CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER = "${pkgs.gcc}/bin/gcc"; CARGO_TARGET_X86_64_UNKNOWN_LINUX_MUSL_LINKER = - "${muslCC}/bin/cc"; + "${pkgs.pkgsMusl.stdenv.cc}/bin/cc"; # Default build target: static musl binary. CARGO_BUILD_TARGET = "x86_64-unknown-linux-musl"; - - RUST_BACKTRACE = "1"; - }; + }); packages.default = - (pkgs.pkgsMusl.makeRustPlatform { - cargo = rustToolchain; - rustc = rustToolchain; - }).buildRustPackage { - pname = "improvise"; - version = "0.1.0"; - src = ./.; - cargoLock.lockFile = ./Cargo.lock; - }; + if isLinux then + (pkgs.pkgsMusl.makeRustPlatform { + cargo = rustToolchain; + rustc = rustToolchain; + }).buildRustPackage { + pname = "improvise"; + version = "0.1.0"; + src = ./.; + cargoLock.lockFile = ./Cargo.lock; + } + else + (pkgs.makeRustPlatform { + cargo = rustToolchain; + rustc = rustToolchain; + }).buildRustPackage { + pname = "improvise"; + version = "0.1.0"; + src = ./.; + cargoLock.lockFile = ./Cargo.lock; + }; }); }