diff --git a/boulder/src/build/job/phase.rs b/boulder/src/build/job/phase.rs index e8508544..535535aa 100644 --- a/boulder/src/build/job/phase.rs +++ b/boulder/src/build/job/phase.rs @@ -178,7 +178,6 @@ impl Phase { parser.add_definition("compiler_objcxxcpp", "clang++ -E"); parser.add_definition("compiler_d", "ldc2"); parser.add_definition("compiler_ar", "llvm-ar"); - parser.add_definition("compiler_ld", "ld.lld"); parser.add_definition("compiler_objcopy", "llvm-objcopy"); parser.add_definition("compiler_nm", "llvm-nm"); parser.add_definition("compiler_ranlib", "llvm-ranlib"); @@ -194,7 +193,6 @@ impl Phase { parser.add_definition("compiler_objcxxcpp", "g++ -E"); parser.add_definition("compiler_d", "ldc2"); // FIXME: GDC parser.add_definition("compiler_ar", "gcc-ar"); - parser.add_definition("compiler_ld", "ld.bfd"); parser.add_definition("compiler_objcopy", "objcopy"); parser.add_definition("compiler_nm", "gcc-nm"); parser.add_definition("compiler_ranlib", "gcc-ranlib"); @@ -202,6 +200,14 @@ impl Phase { parser.add_definition("compiler_path", path); } + if recipe.parsed.mold { + parser.add_definition("compiler_ld", "ld.mold"); + } else if matches!(recipe.parsed.options.toolchain, Toolchain::Llvm) { + parser.add_definition("compiler_ld", "ld.lld"); + } else { + parser.add_definition("compiler_ld", "ld.bfd"); + } + /* Allow packagers to do stage specific actions in a pgo build */ if matches!(pgo_stage, Some(pgo::Stage::One)) { parser.add_definition("pgo_stage", "ONE"); @@ -346,12 +352,12 @@ fn add_tuning( let toolchain = recipe.parsed.options.toolchain; let flags = tuning.build()?; - let cflags = fmt_flags( + let mut cflags = fmt_flags( flags .iter() .filter_map(|flag| flag.get(tuning::CompilerFlag::C, toolchain)), ); - let cxxflags = fmt_flags( + let mut cxxflags = fmt_flags( flags .iter() .filter_map(|flag| flag.get(tuning::CompilerFlag::Cxx, toolchain)), @@ -366,12 +372,18 @@ fn add_tuning( .iter() .filter_map(|flag| flag.get(tuning::CompilerFlag::D, toolchain)), ); - let rustflags = fmt_flags( + let mut rustflags = fmt_flags( flags .iter() .filter_map(|flag| flag.get(tuning::CompilerFlag::Rust, toolchain)), ); + if recipe.parsed.mold { + cflags.push_str(" -fuse-ld=mold"); + cxxflags.push_str(" -fuse-ld=mold"); + rustflags.push_str(" -Clink-arg=-fuse-ld=mold"); + } + parser.add_definition("cflags", cflags); parser.add_definition("cxxflags", cxxflags); parser.add_definition("ldflags", ldflags); diff --git a/boulder/src/build/root.rs b/boulder/src/build/root.rs index 2b43c964..956a363a 100644 --- a/boulder/src/build/root.rs +++ b/boulder/src/build/root.rs @@ -103,6 +103,10 @@ fn packages(builder: &Builder) -> Vec<&str> { } } + if builder.recipe.parsed.mold { + packages.extend(MOLD_PACKAGES); + } + if builder.ccache { packages.extend(CCACHE_PACKAGES); } @@ -203,6 +207,8 @@ const GNU32_PACKAGES: &[&str] = &["gcc-32bit", "g++-32bit"]; const LLVM_PACKAGES: &[&str] = &["clang"]; const LLVM32_PACKAGES: &[&str] = &["clang-32bit", "libcxx-32bit-devel"]; +const MOLD_PACKAGES: &[&str] = &["binary(mold)"]; + const CCACHE_PACKAGES: &[&str] = &["binary(ccache)", "binary(sccache)"]; #[derive(Debug, Error)] diff --git a/crates/stone_recipe/src/lib.rs b/crates/stone_recipe/src/lib.rs index b0565b60..d3df2b3d 100644 --- a/crates/stone_recipe/src/lib.rs +++ b/crates/stone_recipe/src/lib.rs @@ -48,6 +48,8 @@ pub struct Recipe { pub tuning: Vec>, #[serde(default, deserialize_with = "stringy_bool")] pub emul32: bool, + #[serde(default, deserialize_with = "stringy_bool")] + pub mold: bool, } #[derive(Debug, Clone)]