cargo-ohos 0.1.0

Cargo subcommand to cross-compile Rust for OpenHarmony
use std::path::{Path, PathBuf};

use crate::build_env::Error;
use crate::sdk::Sdk;

#[derive(Debug, Clone, serde::Serialize)]
pub struct Toolchain {
    pub clang: PathBuf,
    pub clangxx: PathBuf,
    pub ar: PathBuf,
    pub ranlib: PathBuf,
    pub strip: PathBuf,
    pub objcopy: PathBuf,
    pub readelf: PathBuf,
    pub libclang_dir: PathBuf,
}

impl Toolchain {
    pub fn resolve(sdk: &Sdk) -> Result<Self, Error> {
        let bin = &sdk.llvm_bin;
        Ok(Self {
            clang: tool(bin, "clang")?,
            clangxx: tool(bin, "clang++")?,
            ar: tool(bin, "llvm-ar")?,
            ranlib: tool(bin, "llvm-ranlib")?,
            strip: tool(bin, "llvm-strip")?,
            objcopy: tool(bin, "llvm-objcopy")?,
            readelf: tool(bin, "llvm-readelf")?,
            libclang_dir: sdk.llvm_root.join("lib"),
        })
    }
}

fn tool(bin_dir: &Path, name: &str) -> Result<PathBuf, Error> {
    let mut path = bin_dir.join(name);
    if cfg!(windows) {
        path.set_extension("exe");
    }
    if !path.is_file() {
        return Err(Error::MissingTool { path });
    }
    Ok(path)
}