2023-05-09 17:44:54 +00:00
|
|
|
{ lib, stdenv, removeReferencesTo, pkgsBuildBuild, pkgsBuildHost, pkgsBuildTarget, targetPackages
|
2021-11-30 06:49:53 +00:00
|
|
|
, llvmShared, llvmSharedForBuild, llvmSharedForHost, llvmSharedForTarget, llvmPackages
|
2019-12-15 12:52:53 +00:00
|
|
|
, fetchurl, file, python3
|
2023-05-22 13:56:42 +00:00
|
|
|
, darwin, cargo, cmake, rust, rustc
|
2022-10-15 23:23:42 +00:00
|
|
|
, pkg-config, openssl, xz
|
2021-05-07 21:36:21 +00:00
|
|
|
, libiconv
|
2019-09-30 09:00:33 +00:00
|
|
|
, which, libffi
|
2018-10-30 13:56:23 +00:00
|
|
|
, withBundledLLVM ? false
|
2020-01-18 09:57:13 +00:00
|
|
|
, enableRustcDev ? true
|
2019-11-08 12:04:53 +00:00
|
|
|
, version
|
|
|
|
, sha256
|
2020-02-22 23:34:05 +00:00
|
|
|
, patches ? []
|
2022-08-23 01:10:09 +00:00
|
|
|
, fd
|
2023-02-18 15:08:57 +00:00
|
|
|
, ripgrep
|
|
|
|
, wezterm
|
2022-08-23 01:10:09 +00:00
|
|
|
, firefox
|
|
|
|
, thunderbird
|
2018-07-20 19:54:05 +00:00
|
|
|
}:
|
2015-10-03 14:23:00 +00:00
|
|
|
|
2016-05-31 19:16:18 +00:00
|
|
|
let
|
2021-01-22 11:25:31 +00:00
|
|
|
inherit (lib) optionals optional optionalString concatStringsSep;
|
2017-12-28 19:42:23 +00:00
|
|
|
inherit (darwin.apple_sdk.frameworks) Security;
|
2019-09-26 12:50:07 +00:00
|
|
|
in stdenv.mkDerivation rec {
|
2023-05-09 17:44:54 +00:00
|
|
|
pname = "${targetPackages.stdenv.cc.targetPrefix}rustc";
|
2019-11-08 12:04:53 +00:00
|
|
|
inherit version;
|
2015-10-03 14:23:00 +00:00
|
|
|
|
2018-11-21 01:47:45 +00:00
|
|
|
src = fetchurl {
|
|
|
|
url = "https://static.rust-lang.org/dist/rustc-${version}-src.tar.gz";
|
2019-11-08 12:04:53 +00:00
|
|
|
inherit sha256;
|
2018-11-21 01:47:45 +00:00
|
|
|
};
|
2017-05-30 13:48:06 +00:00
|
|
|
|
2017-10-31 06:37:15 +00:00
|
|
|
__darwinAllowLocalNetworking = true;
|
2015-10-03 14:23:00 +00:00
|
|
|
|
2018-08-14 07:40:47 +00:00
|
|
|
# rustc complains about modified source files otherwise
|
|
|
|
dontUpdateAutotoolsGnuConfigScripts = true;
|
2017-12-02 12:46:33 +00:00
|
|
|
|
2018-01-24 11:34:03 +00:00
|
|
|
# Running the default `strip -S` command on Darwin corrupts the
|
|
|
|
# .rlib files in "lib/".
|
|
|
|
#
|
|
|
|
# See https://github.com/NixOS/nixpkgs/pull/34227
|
2019-03-13 16:52:01 +00:00
|
|
|
#
|
|
|
|
# Running `strip -S` when cross compiling can harm the cross rlibs.
|
|
|
|
# See: https://github.com/NixOS/nixpkgs/pull/56540#issuecomment-471624656
|
|
|
|
stripDebugList = [ "bin" ];
|
2018-01-24 11:34:03 +00:00
|
|
|
|
2022-10-15 23:23:42 +00:00
|
|
|
# The Rust pkg-config crate does not support prefixed pkg-config executables[1],
|
|
|
|
# but it does support checking these idiosyncratic PKG_CONFIG_${TRIPLE}
|
|
|
|
# environment variables.
|
|
|
|
# [1]: https://github.com/rust-lang/pkg-config-rs/issues/53
|
|
|
|
"PKG_CONFIG_${builtins.replaceStrings ["-"] ["_"] (rust.toRustTarget stdenv.buildPlatform)}" =
|
|
|
|
"${pkgsBuildHost.stdenv.cc.targetPrefix}pkg-config";
|
|
|
|
|
2019-10-30 00:12:09 +00:00
|
|
|
NIX_LDFLAGS = toString (
|
2018-10-30 13:56:23 +00:00
|
|
|
# when linking stage1 libstd: cc: undefined reference to `__cxa_begin_catch'
|
|
|
|
optional (stdenv.isLinux && !withBundledLLVM) "--push-state --as-needed -lstdc++ --pop-state"
|
2018-11-08 11:58:56 +00:00
|
|
|
++ optional (stdenv.isDarwin && !withBundledLLVM) "-lc++"
|
2023-03-01 16:42:07 +00:00
|
|
|
++ optional stdenv.isDarwin "-rpath ${llvmSharedForHost}/lib");
|
2015-11-30 20:54:04 +00:00
|
|
|
|
2017-01-12 13:25:20 +00:00
|
|
|
# Increase codegen units to introduce parallelism within the compiler.
|
|
|
|
RUSTFLAGS = "-Ccodegen-units=10";
|
|
|
|
|
2016-05-31 19:16:18 +00:00
|
|
|
# We need rust to build rust. If we don't provide it, configure will try to download it.
|
2018-04-12 20:16:09 +00:00
|
|
|
# Reference: https://github.com/rust-lang/rust/blob/master/src/bootstrap/configure.py
|
2018-11-21 01:47:45 +00:00
|
|
|
configureFlags = let
|
2018-12-21 00:28:09 +00:00
|
|
|
setBuild = "--set=target.${rust.toRustTarget stdenv.buildPlatform}";
|
|
|
|
setHost = "--set=target.${rust.toRustTarget stdenv.hostPlatform}";
|
|
|
|
setTarget = "--set=target.${rust.toRustTarget stdenv.targetPlatform}";
|
2018-11-21 01:47:45 +00:00
|
|
|
ccForBuild = "${pkgsBuildBuild.targetPackages.stdenv.cc}/bin/${pkgsBuildBuild.targetPackages.stdenv.cc.targetPrefix}cc";
|
|
|
|
cxxForBuild = "${pkgsBuildBuild.targetPackages.stdenv.cc}/bin/${pkgsBuildBuild.targetPackages.stdenv.cc.targetPrefix}c++";
|
|
|
|
ccForHost = "${pkgsBuildHost.targetPackages.stdenv.cc}/bin/${pkgsBuildHost.targetPackages.stdenv.cc.targetPrefix}cc";
|
|
|
|
cxxForHost = "${pkgsBuildHost.targetPackages.stdenv.cc}/bin/${pkgsBuildHost.targetPackages.stdenv.cc.targetPrefix}c++";
|
|
|
|
ccForTarget = "${pkgsBuildTarget.targetPackages.stdenv.cc}/bin/${pkgsBuildTarget.targetPackages.stdenv.cc.targetPrefix}cc";
|
|
|
|
cxxForTarget = "${pkgsBuildTarget.targetPackages.stdenv.cc}/bin/${pkgsBuildTarget.targetPackages.stdenv.cc.targetPrefix}c++";
|
|
|
|
in [
|
|
|
|
"--release-channel=stable"
|
2023-05-12 14:17:16 +00:00
|
|
|
"--set=build.rustc=${rustc}/bin/rustc"
|
|
|
|
"--set=build.cargo=${cargo}/bin/cargo"
|
2018-11-21 01:47:45 +00:00
|
|
|
"--enable-rpath"
|
|
|
|
"--enable-vendor"
|
2020-10-14 03:37:29 +00:00
|
|
|
"--build=${rust.toRustTargetSpec stdenv.buildPlatform}"
|
|
|
|
"--host=${rust.toRustTargetSpec stdenv.hostPlatform}"
|
2023-04-17 05:21:21 +00:00
|
|
|
# std is built for all platforms in --target.
|
2020-12-12 20:18:30 +00:00
|
|
|
"--target=${concatStringsSep "," ([
|
|
|
|
(rust.toRustTargetSpec stdenv.targetPlatform)
|
2023-04-17 05:21:21 +00:00
|
|
|
|
|
|
|
# (build!=target): When cross-building a compiler we need to add
|
|
|
|
# the build platform as well so rustc can compile build.rs
|
|
|
|
# scripts.
|
|
|
|
] ++ optionals (stdenv.buildPlatform != stdenv.targetPlatform) [
|
|
|
|
(rust.toRustTargetSpec stdenv.buildPlatform)
|
|
|
|
|
|
|
|
# (host!=target): When building a cross-targeting compiler we
|
|
|
|
# need to add the host platform as well so rustc can compile
|
|
|
|
# build.rs scripts.
|
2020-12-12 20:18:30 +00:00
|
|
|
] ++ optionals (stdenv.hostPlatform != stdenv.targetPlatform) [
|
|
|
|
(rust.toRustTargetSpec stdenv.hostPlatform)
|
|
|
|
])}"
|
2018-11-21 01:47:45 +00:00
|
|
|
|
|
|
|
"${setBuild}.cc=${ccForBuild}"
|
|
|
|
"${setHost}.cc=${ccForHost}"
|
|
|
|
"${setTarget}.cc=${ccForTarget}"
|
|
|
|
|
|
|
|
"${setBuild}.linker=${ccForBuild}"
|
|
|
|
"${setHost}.linker=${ccForHost}"
|
|
|
|
"${setTarget}.linker=${ccForTarget}"
|
|
|
|
|
|
|
|
"${setBuild}.cxx=${cxxForBuild}"
|
|
|
|
"${setHost}.cxx=${cxxForHost}"
|
|
|
|
"${setTarget}.cxx=${cxxForTarget}"
|
2021-10-17 10:44:49 +00:00
|
|
|
|
|
|
|
"${setBuild}.crt-static=${lib.boolToString stdenv.buildPlatform.isStatic}"
|
|
|
|
"${setHost}.crt-static=${lib.boolToString stdenv.hostPlatform.isStatic}"
|
|
|
|
"${setTarget}.crt-static=${lib.boolToString stdenv.targetPlatform.isStatic}"
|
2019-11-13 13:17:33 +00:00
|
|
|
] ++ optionals (!withBundledLLVM) [
|
2018-11-21 01:47:45 +00:00
|
|
|
"--enable-llvm-link-shared"
|
2021-05-01 02:03:30 +00:00
|
|
|
"${setBuild}.llvm-config=${llvmSharedForBuild.dev}/bin/llvm-config"
|
|
|
|
"${setHost}.llvm-config=${llvmSharedForHost.dev}/bin/llvm-config"
|
|
|
|
"${setTarget}.llvm-config=${llvmSharedForTarget.dev}/bin/llvm-config"
|
2020-07-21 20:11:36 +00:00
|
|
|
] ++ optionals (stdenv.isLinux && !stdenv.targetPlatform.isRedox) [
|
2019-07-31 15:55:33 +00:00
|
|
|
"--enable-profiler" # build libprofiler_builtins
|
2020-11-29 17:47:51 +00:00
|
|
|
] ++ optionals stdenv.buildPlatform.isMusl [
|
|
|
|
"${setBuild}.musl-root=${pkgsBuildBuild.targetPackages.stdenv.cc.libc}"
|
|
|
|
] ++ optionals stdenv.hostPlatform.isMusl [
|
|
|
|
"${setHost}.musl-root=${pkgsBuildHost.targetPackages.stdenv.cc.libc}"
|
2020-11-29 00:32:43 +00:00
|
|
|
] ++ optionals stdenv.targetPlatform.isMusl [
|
2020-11-29 17:47:51 +00:00
|
|
|
"${setTarget}.musl-root=${pkgsBuildTarget.targetPackages.stdenv.cc.libc}"
|
2022-10-07 14:35:29 +00:00
|
|
|
] ++ optionals (rust.IsNoStdTarget stdenv.targetPlatform) [
|
|
|
|
"--disable-docs"
|
2022-09-24 02:27:21 +00:00
|
|
|
] ++ optionals (stdenv.isDarwin && stdenv.isx86_64) [
|
|
|
|
# https://github.com/rust-lang/rust/issues/92173
|
|
|
|
"--set rust.jemalloc"
|
2018-11-21 01:47:45 +00:00
|
|
|
];
|
2015-10-03 14:23:00 +00:00
|
|
|
|
2018-07-09 10:35:01 +00:00
|
|
|
# The bootstrap.py will generated a Makefile that then executes the build.
|
2018-04-12 20:16:09 +00:00
|
|
|
# The BOOTSTRAP_ARGS used by this Makefile must include all flags to pass
|
|
|
|
# to the bootstrap builder.
|
|
|
|
postConfigure = ''
|
2018-11-21 01:47:45 +00:00
|
|
|
substituteInPlace Makefile \
|
|
|
|
--replace 'BOOTSTRAP_ARGS :=' 'BOOTSTRAP_ARGS := --jobs $(NIX_BUILD_CORES)'
|
2018-04-12 20:16:09 +00:00
|
|
|
'';
|
|
|
|
|
2017-10-06 22:12:22 +00:00
|
|
|
# the rust build system complains that nix alters the checksums
|
|
|
|
dontFixLibtool = true;
|
|
|
|
|
2020-02-22 23:34:05 +00:00
|
|
|
inherit patches;
|
|
|
|
|
2015-10-03 14:23:00 +00:00
|
|
|
postPatch = ''
|
2018-02-20 09:59:26 +00:00
|
|
|
patchShebangs src/etc
|
|
|
|
|
2021-01-24 09:19:10 +00:00
|
|
|
${optionalString (!withBundledLLVM) "rm -rf src/llvm"}
|
2015-10-03 14:23:00 +00:00
|
|
|
|
|
|
|
# Fix the configure script to not require curl as we won't use it
|
|
|
|
sed -i configure \
|
2016-08-24 09:56:02 +00:00
|
|
|
-e '/probe_need CFG_CURL curl/d'
|
2015-10-03 14:23:00 +00:00
|
|
|
|
|
|
|
# Useful debugging parameter
|
2016-08-24 09:56:02 +00:00
|
|
|
# export VERBOSE=1
|
rust: fix overriding rust flags on musl
If RUSTFLAGS is set in the environment, Cargo will ignore rustflags
settings in its TOML configuration. So setting RUSTFLAGS=-g (like
separateDebugInfo does) to generate debug info breaks
dynamically-linked Rust packages on musl. This breakage is visible
for any packages that call into C dynamic libraries. If the binary is
linked directly to a C dynamic library, it will fail to build, and if
it depends on a Rust library which links a C dynamic library, it will
segfault at runtime when it tries to call a function from the C
library. I noticed this because pkgsMusl.crosvm is broken for this
reason, since it sets separateDebugInfo = true.
It shouldn't be possible to end up with broken binaries just by using
RUSTFLAGS to do something innocuous like enable debug info, so I think
that, even though we liked the approach of modiyfing .cargo/config
better at the time, it's become clear that it's too brittle, and we
should bite the bullet and patch the compiler instead when targetting
musl. It does not appear to be necessary to modify the compiler at
all when cross-compiling /from/ dynamically-linked Musl to another
target, so I'm only checking whether the target system is
dynamically-linked Musl when deciding whether to make the modification
to the compiler.
This reverts commit c2eaaae50d66a933e38256bdf5a3ae43430592a3
("cargoSetupHook: pass host config flags"), and implements the
compiler patching approach instead.
2023-03-16 00:09:35 +00:00
|
|
|
'' + lib.optionalString (stdenv.targetPlatform.isMusl && !stdenv.targetPlatform.isStatic) ''
|
|
|
|
# Upstream rustc still assumes that musl = static[1]. The fix for
|
|
|
|
# this is to disable crt-static by default for non-static musl
|
|
|
|
# targets.
|
|
|
|
#
|
|
|
|
# Even though Cargo will build build.rs files for the build platform,
|
|
|
|
# cross-compiling _from_ musl appears to work fine, so we only need
|
|
|
|
# to do this when rustc's target platform is dynamically linked musl.
|
|
|
|
#
|
|
|
|
# [1]: https://github.com/rust-lang/compiler-team/issues/422
|
|
|
|
substituteInPlace compiler/rustc_target/src/spec/linux_musl_base.rs \
|
|
|
|
--replace "base.crt_static_default = true" "base.crt_static_default = false"
|
2022-09-28 21:07:46 +00:00
|
|
|
'' + lib.optionalString (stdenv.isDarwin && stdenv.isx86_64) ''
|
|
|
|
# See https://github.com/jemalloc/jemalloc/issues/1997
|
|
|
|
# Using a value of 48 should work on both emulated and native x86_64-darwin.
|
|
|
|
export JEMALLOC_SYS_WITH_LG_VADDR=48
|
2015-10-03 14:23:00 +00:00
|
|
|
'';
|
|
|
|
|
2019-02-27 03:24:42 +00:00
|
|
|
# rustc unfortunately needs cmake to compile llvm-rt but doesn't
|
2016-08-24 09:56:02 +00:00
|
|
|
# use it for the normal build. This disables cmake in Nix.
|
|
|
|
dontUseCmakeConfigure = true;
|
2016-07-19 08:25:35 +00:00
|
|
|
|
2022-10-15 23:27:12 +00:00
|
|
|
depsBuildBuild = [ pkgsBuildHost.stdenv.cc pkg-config ];
|
2022-10-15 23:23:42 +00:00
|
|
|
|
2018-11-21 01:47:45 +00:00
|
|
|
nativeBuildInputs = [
|
2023-05-12 14:17:16 +00:00
|
|
|
file python3 rustc cmake
|
2022-10-15 23:23:42 +00:00
|
|
|
which libffi removeReferencesTo pkg-config xz
|
2019-09-30 09:00:33 +00:00
|
|
|
];
|
2016-07-19 08:25:35 +00:00
|
|
|
|
2019-09-26 12:51:12 +00:00
|
|
|
buildInputs = [ openssl ]
|
2022-12-15 23:38:33 +00:00
|
|
|
++ optionals stdenv.isDarwin [ libiconv Security ]
|
2018-10-30 13:56:23 +00:00
|
|
|
++ optional (!withBundledLLVM) llvmShared;
|
2015-10-03 14:23:00 +00:00
|
|
|
|
2017-07-11 09:14:14 +00:00
|
|
|
outputs = [ "out" "man" "doc" ];
|
2016-04-08 13:56:26 +00:00
|
|
|
setOutputFlags = false;
|
2015-10-03 14:23:00 +00:00
|
|
|
|
2021-01-22 11:25:31 +00:00
|
|
|
postInstall = lib.optionalString enableRustcDev ''
|
2020-01-11 12:00:00 +00:00
|
|
|
# install rustc-dev components. Necessary to build rls, clippy...
|
|
|
|
python x.py dist rustc-dev
|
|
|
|
tar xf build/dist/rustc-dev*tar.gz
|
|
|
|
cp -r rustc-dev*/rustc-dev*/lib/* $out/lib/
|
2020-12-07 21:27:42 +00:00
|
|
|
rm $out/lib/rustlib/install.log
|
|
|
|
for m in $out/lib/rustlib/manifest-rust*
|
|
|
|
do
|
|
|
|
sort --output=$m < $m
|
|
|
|
done
|
2020-01-11 12:00:00 +00:00
|
|
|
|
2020-01-18 09:57:13 +00:00
|
|
|
'' + ''
|
2020-01-11 12:00:00 +00:00
|
|
|
# remove references to llvm-config in lib/rustlib/x86_64-unknown-linux-gnu/codegen-backends/librustc_codegen_llvm-llvm.so
|
|
|
|
# and thus a transitive dependency on ncurses
|
2018-10-30 13:56:23 +00:00
|
|
|
find $out/lib -name "*.so" -type f -exec remove-references-to -t ${llvmShared} '{}' '+'
|
2020-12-26 20:33:37 +00:00
|
|
|
|
|
|
|
# remove uninstall script that doesn't really make sense for Nix.
|
|
|
|
rm $out/lib/rustlib/uninstall.sh
|
2018-10-30 13:56:23 +00:00
|
|
|
'';
|
|
|
|
|
2017-06-23 21:45:27 +00:00
|
|
|
configurePlatforms = [];
|
2017-01-12 13:25:20 +00:00
|
|
|
|
2023-02-25 19:40:40 +00:00
|
|
|
enableParallelBuilding = true;
|
2017-01-12 13:25:20 +00:00
|
|
|
|
2019-07-07 12:44:04 +00:00
|
|
|
setupHooks = ./setup-hook.sh;
|
|
|
|
|
2019-01-24 17:30:35 +00:00
|
|
|
requiredSystemFeatures = [ "big-parallel" ];
|
|
|
|
|
2021-11-02 16:34:05 +00:00
|
|
|
passthru = {
|
|
|
|
llvm = llvmShared;
|
2021-11-30 06:49:53 +00:00
|
|
|
inherit llvmPackages;
|
2023-02-18 15:08:57 +00:00
|
|
|
tests = {
|
|
|
|
inherit fd ripgrep wezterm;
|
|
|
|
} // lib.optionalAttrs stdenv.hostPlatform.isLinux { inherit firefox thunderbird; };
|
2021-11-02 16:34:05 +00:00
|
|
|
};
|
2020-02-18 01:58:48 +00:00
|
|
|
|
2021-01-22 11:25:31 +00:00
|
|
|
meta = with lib; {
|
2020-02-18 01:58:48 +00:00
|
|
|
homepage = "https://www.rust-lang.org/";
|
2017-01-12 13:25:20 +00:00
|
|
|
description = "A safe, concurrent, practical language";
|
2023-01-31 02:22:05 +00:00
|
|
|
maintainers = with maintainers; [ cstrahan globin havvy ] ++ teams.rust.members;
|
2017-01-12 13:25:20 +00:00
|
|
|
license = [ licenses.mit licenses.asl20 ];
|
2023-04-24 17:35:35 +00:00
|
|
|
platforms = [
|
|
|
|
# Platforms with host tools from
|
|
|
|
# https://doc.rust-lang.org/nightly/rustc/platform-support.html
|
|
|
|
"x86_64-darwin" "i686-darwin" "aarch64-darwin"
|
|
|
|
"i686-freebsd13" "x86_64-freebsd13"
|
|
|
|
"x86_64-solaris"
|
|
|
|
"aarch64-linux" "armv7l-linux" "i686-linux" "mipsel-linux"
|
|
|
|
"mips64el-linux" "powerpc64-linux" "powerpc64le-linux"
|
|
|
|
"riscv64-linux" "s390x-linux" "x86_64-linux"
|
|
|
|
"aarch64-netbsd" "armv7l-netbsd" "i686-netbsd" "powerpc-netbsd"
|
|
|
|
"x86_64-netbsd"
|
|
|
|
"i686-openbsd" "x86_64-openbsd"
|
|
|
|
"i686-windows" "x86_64-windows"
|
|
|
|
];
|
2017-01-12 13:25:20 +00:00
|
|
|
};
|
2015-10-03 14:23:00 +00:00
|
|
|
}
|