Skip to content

Commit

Permalink
rust: use mold
Browse files Browse the repository at this point in the history
  • Loading branch information
domenkozar committed Apr 21, 2024
1 parent 11e7d3e commit dd6f8b5
Showing 1 changed file with 23 additions and 11 deletions.
34 changes: 23 additions & 11 deletions src/modules/languages/rust.nix
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ in
description = "The rustup toolchain to install.";
};

mold.enable = lib.mkOption {
type = lib.types.bool;
default = pkgs.stdenv.isLinux && stdenv.isx86_64 && cfg.targets == [ ];
description = "Enable mold as the linker.";
};

toolchain = lib.mkOption {
type = lib.types.submodule ({
freeformType = lib.types.attrsOf lib.types.package;
Expand Down Expand Up @@ -95,23 +101,29 @@ in
# enable compiler tooling by default to expose things like cc
languages.c.enable = lib.mkDefault true;

# RUST_SRC_PATH is necessary when rust-src is not at the same location as
# as rustc. This is the case with the rust toolchain from nixpkgs.
env.RUST_SRC_PATH =
if cfg.toolchain ? rust-src
then "${cfg.toolchain.rust-src}/lib/rustlib/src/rust/library"
else pkgs.rustPlatform.rustLibSrc;

env =
let
darwinFlags = lib.optionalString pkgs.stdenv.isDarwin "-L framework=${config.devenv.profile}/Library/Frameworks";
moldFlags = lib.optionalString cfg.mold.enable "-C link-arg=-fuse-ld=${pkgs.mold-wrapped}/bin/ld.mold";
in
{
# RUST_SRC_PATH is necessary when rust-src is not at the same location as
# as rustc. This is the case with the rust toolchain from nixpkgs.
RUST_SRC_PATH =
if cfg.toolchain ? rust-src
then "${cfg.toolchain.rust-src}/lib/rustlib/src/rust/library"
else pkgs.rustPlatform.rustLibSrc;
RUSTFLAGS = "${darwinFlags} ${moldFlags}";
RUSTDOCFLAGS = "${darwinFlags} ${moldFlags}";
CFLAGS = "${darwinFlags}";
};

pre-commit.tools.cargo = mkOverrideTools cfg.toolchain.cargo or null;
pre-commit.tools.rustfmt = mkOverrideTools cfg.toolchain.rustfmt or null;
pre-commit.tools.clippy = mkOverrideTools cfg.toolchain.clippy or null;
}
))
(lib.mkIf (cfg.enable && pkgs.stdenv.isDarwin) {
env.RUSTFLAGS = "-L framework=${config.devenv.profile}/Library/Frameworks";
env.RUSTDOCFLAGS = "-L framework=${config.devenv.profile}/Library/Frameworks";
env.CFLAGS = "-iframework ${config.devenv.profile}/Library/Frameworks";
})
(lib.mkIf (cfg.channel != "nixpkgs") (
let
rustPackages = fenix.packages.${pkgs.stdenv.system};
Expand Down

0 comments on commit dd6f8b5

Please sign in to comment.