| use crate::sdk::{ |
| clang_base_path, clang_resource_dir, shared_libraries_path, sysroot_path, TargetOptions, |
| }; |
| use crate::X64; |
| use crate::{get_target_triple, get_triple_cpu}; |
| |
| use failure::Error; |
| use std::fs::create_dir_all; |
| use std::fs::File; |
| use std::io::Write; |
| use std::path::Path; |
| use std::process::Command; |
| |
| pub fn build_rustc(rust_root: &Path, target_options: &TargetOptions<'_, '_>) -> Result<(), Error> { |
| let target_triple = get_target_triple(target_options); |
| let triple_cpu = get_triple_cpu(target_options); |
| let targets_name = if target_options.config.fuchsia_arch == X64 { "X86" } else { "AArch64" }; |
| let clang_base_path = clang_base_path()?; |
| let clang_bin_path = clang_base_path.join("bin"); |
| let staging = rust_root.join("fuchsia_staging"); |
| create_dir_all(&staging)?; |
| let build = staging.join("build"); |
| create_dir_all(&build)?; |
| let config_path = staging.join("config.toml"); |
| |
| let mut config = File::create(&config_path)?; |
| writeln!( |
| config, |
| r#" |
| [llvm] |
| optimize = true |
| static-libstdcpp = true |
| ninja = true |
| targets = "{targets}" |
| |
| [build] |
| target = ["{target}-fuchsia"] |
| docs = false |
| extended = true |
| cargo-native-static = true |
| |
| [install] |
| prefix = "{prefix}" |
| sysconfdir = "etc" |
| |
| [rust] |
| optimize = true |
| channel = "nightly" |
| lld = true |
| |
| [target.{target}-fuchsia] |
| cc = "{cc}" |
| cxx = "{cxx}" |
| ar = "{ar}" |
| linker = "{linker}" |
| |
| [dist] |
| "#, |
| prefix = staging.to_string_lossy(), |
| cc = clang_bin_path.join("clang").to_string_lossy(), |
| cxx = clang_bin_path.join("clang++").to_string_lossy(), |
| ar = clang_bin_path.join("llvm-ar").to_string_lossy(), |
| linker = clang_bin_path.join("ld.lld").to_string_lossy(), |
| target = triple_cpu, |
| targets = targets_name, |
| )?; |
| |
| let sysroot_path = sysroot_path(target_options)?; |
| let sysroot_lib_path = sysroot_path.join("lib"); |
| let clang_resource_lib = clang_resource_dir(&target_triple)?.join(&target_triple).join("lib"); |
| |
| let cargo_dir = staging.join(".cargo"); |
| create_dir_all(&cargo_dir)?; |
| let cargo_config_path = cargo_dir.join("config"); |
| |
| let mut cargo_config = File::create(&cargo_config_path)?; |
| writeln!( |
| cargo_config, |
| r#" |
| [target.{target}-fuchsia] |
| ar = "{ar}" |
| rustflags = [ |
| "-C", "link-arg=--sysroot={sysroot}", |
| "-C", "link-arg=-L{sysroot}/lib", |
| "-C", "link-arg=-L{target_lib}", |
| "-C", "link-arg=-L{clang_resource_lib}", |
| ] |
| "#, |
| target = triple_cpu, |
| sysroot = sysroot_path.to_string_lossy(), |
| ar = clang_bin_path.join("llvm-ar").to_string_lossy(), |
| target_lib = shared_libraries_path(target_options)?.to_string_lossy(), |
| clang_resource_lib = clang_resource_lib.to_string_lossy(), |
| )?; |
| let x_py = rust_root.join("x.py"); |
| let common_c_flags = |
| format!("--sysroot={} --target={}-fuchsia", sysroot_path.to_string_lossy(), triple_cpu); |
| let ld_flags = format!( |
| "--sysroot={} --target={}-fuchsia -L{}", |
| sysroot_path.to_string_lossy(), |
| triple_cpu, |
| sysroot_lib_path.to_string_lossy() |
| ); |
| let mut cmd = Command::new(x_py); |
| cmd.current_dir(build) |
| .env(format!("CFLAGS_{}-fuchsia", triple_cpu), &common_c_flags) |
| .env(format!("LDFLAGS_{}-fuchsia", triple_cpu), &ld_flags) |
| .arg("build") |
| .arg("--config") |
| .arg(&config_path) |
| .arg("--target") |
| .arg(format!("{}-fuchsia", triple_cpu)); |
| |
| println!("cmd = {:#?}", cmd); |
| cmd.status().expect("x_py command failed to start"); |
| Ok(()) |
| } |