// use std::{
//     fs,
//     path::PathBuf,
//     process::{Command, Stdio},
// };
//
// use crate::{
//     env::BuildEnv,
//     error::{CommandExt, Error},
//     util,
// };

// pub const LLVM_URL: &str = "https://git.alnyan.me/yggdrasil/llvm-project.git";
//
// pub struct Llvm {
//     root: PathBuf,
// }
//
// impl Llvm {
//     pub fn c_clang(&self, env: &BuildEnv) -> Command {
//         let mut command = Command::new(self.root.join("bin/clang"));
//         command.arg(format!("--target={}-unknown-yggdrasil", env.arch.name()));
//         command.arg(format!("--sysroot={}", env.llvm_sysroot.display()));
//         command
//     }
//
//     pub fn c_clangpp(&self, env: &BuildEnv) -> Command {
//         let mut command = Command::new(self.root.join("bin/clang++"));
//         command.arg(format!("--target={}-unknown-yggdrasil", env.arch.name()));
//         command.arg(format!("--sysroot={}", env.llvm_sysroot.display()));
//         // TODO: Not yet implemented features:
//         command.arg("-fno-exceptions");
//         command.arg("-fno-rtti");
//         command
//     }
//
//     pub fn clang(&self) -> PathBuf {
//         self.root.join("bin/clang")
//     }
// }
//
// pub fn install_compiler_rt(env: &BuildEnv, llvm: &Llvm) -> Result<(), Error> {
// }
//
// pub fn install_llvm_cxx_runtime(env: &BuildEnv, llvm: &Llvm) -> Result<(), Error> {
// }
//
// pub fn install_llvm_compiler(env: &BuildEnv) -> Result<Llvm, Error> {
//     let root = env.workspace_root.join("toolchain-c/prefix/host");
//     let src_dir = env.workspace_root.join("toolchain-c/llvm-project");
//     let build_dir = src_dir.join("build");
//     let makefile = build_dir.join("build.ninja");
//
//     util::git_clone(&src_dir, LLVM_URL, "alnyan/yggdrasil", true)?;
//
//     fs::create_dir_all(&build_dir)?;
//
//     // Configure LLVM
//     // TODO option to force reconfig
//     if !makefile.exists() {
//         log::info!("Configure LLVM");
//
//         let have_host_ccache = which::which("ccache").is_ok();
//
//         let mut command = Command::new("cmake");
//         command.current_dir(&build_dir);
//         command
//             .arg("-DCMAKE_BUILD_TYPE=Release")
//             .arg("-DCMAKE_C_COMPILER=/usr/bin/clang")
//             .arg("-DCMAKE_CXX_COMPILER=/usr/bin/clang++")
//             .arg("-DBUILD_SHARED_LIBS=false")
//             .arg("-DLLVM_ENABLE_PROJECTS=clang;lld;compiler-rt")
//             .arg("-DLLVM_USE_LINKER=lld")
//             .arg("-DLLVM_BUILD_TOOLS=false");
//
//         if have_host_ccache {
//             command.arg("-DLLVM_CCACHE_BUILD=true");
//         }
//
//         command
//             .arg("-DLLVM_TARGETS_TO_BUILD=X86;AArch64;RISCV")
//             .arg(&format!("-DCMAKE_INSTALL_PREFIX={}", root.display()))
//             .arg("-GNinja")
//             .arg("../llvm");
//
//         command.success().map_err(Error::LlvmConfigFailed)?;
//     }
//
//     // Build and install LLVM
//     log::info!("Build LLVM");
//     let mut command = Command::new("cmake");
//     if !env.verbose {
//         command.stdout(Stdio::null());
//     }
//     command.current_dir(&build_dir);
//     command
//         .args(["--build", "."])
//         .args(["-t install"])
//         .arg("-j");
//
//     command.success().map_err(Error::LlvmBuildFailed)?;
//
//     Ok(Llvm { root })
// }
