Skip to content

ToolPaths

Collection of paths to MSVC tool executables.

Definition

rust
pub struct ToolPaths {
    /// Path to cl.exe (C/C++ compiler)
    pub cl: Option<PathBuf>,
    
    /// Path to link.exe (linker)
    pub link: Option<PathBuf>,
    
    /// Path to lib.exe (static library manager)
    pub lib: Option<PathBuf>,
    
    /// Path to ml64.exe (MASM assembler)
    pub ml64: Option<PathBuf>,
    
    /// Path to nmake.exe (make utility)
    pub nmake: Option<PathBuf>,
    
    /// Path to rc.exe (resource compiler)
    pub rc: Option<PathBuf>,
}

Usage

rust
use msvc_kit::{download_msvc, download_sdk, setup_environment, DownloadOptions};

let options = DownloadOptions::default();
let msvc = download_msvc(&options).await?;
let sdk = download_sdk(&options).await?;
let env = setup_environment(&msvc, Some(&sdk))?;

// Get all tool paths
let tools = env.tool_paths();

Tool Descriptions

cl.exe - C/C++ Compiler

The main compiler executable.

rust
if let Some(cl) = tools.cl {
    std::process::Command::new(&cl)
        .args(["/c", "main.cpp"])
        .status()?;
}

Links object files into executables or DLLs.

rust
if let Some(link) = tools.link {
    std::process::Command::new(&link)
        .args(["main.obj", "/OUT:main.exe"])
        .status()?;
}

lib.exe - Library Manager

Creates and manages static libraries (.lib files).

rust
if let Some(lib) = tools.lib {
    std::process::Command::new(&lib)
        .args(["/OUT:mylib.lib", "a.obj", "b.obj"])
        .status()?;
}

ml64.exe - MASM Assembler

Microsoft Macro Assembler for x64.

rust
if let Some(ml64) = tools.ml64 {
    std::process::Command::new(&ml64)
        .args(["/c", "asm.asm"])
        .status()?;
}

nmake.exe - Make Utility

Microsoft's make utility for building projects.

rust
if let Some(nmake) = tools.nmake {
    std::process::Command::new(&nmake)
        .args(["/f", "Makefile"])
        .status()?;
}

rc.exe - Resource Compiler

Compiles Windows resource files (.rc).

rust
if let Some(rc) = tools.rc {
    std::process::Command::new(&rc)
        .args(["resources.rc"])
        .status()?;
}

Complete Build Example

rust
use msvc_kit::{download_msvc, download_sdk, setup_environment, DownloadOptions};
use std::process::Command;

async fn build_project() -> msvc_kit::Result<()> {
    // Setup environment
    let options = DownloadOptions::default();
    let msvc = download_msvc(&options).await?;
    let sdk = download_sdk(&options).await?;
    let env = setup_environment(&msvc, Some(&sdk))?;
    let tools = env.tool_paths();
    
    // Set environment variables
    std::env::set_var("INCLUDE", env.include_path_string());
    std::env::set_var("LIB", env.lib_path_string());
    
    let cl = tools.cl.expect("cl.exe not found");
    let link = tools.link.expect("link.exe not found");
    
    // Compile
    Command::new(&cl)
        .args(["/c", "/O2", "main.cpp"])
        .status()?;
    
    // Link
    Command::new(&link)
        .args(["main.obj", "/OUT:main.exe"])
        .status()?;
    
    println!("Build complete!");
    Ok(())
}

Serialization

ToolPaths implements Serialize and Deserialize:

rust
let tools = env.tool_paths();
let json = serde_json::to_string_pretty(&tools)?;
println!("{}", json);

Output:

json
{
  "cl": "C:\\msvc-kit\\VC\\Tools\\MSVC\\14.44.34823\\bin\\Hostx64\\x64\\cl.exe",
  "link": "C:\\msvc-kit\\VC\\Tools\\MSVC\\14.44.34823\\bin\\Hostx64\\x64\\link.exe",
  "lib": "C:\\msvc-kit\\VC\\Tools\\MSVC\\14.44.34823\\bin\\Hostx64\\x64\\lib.exe",
  "ml64": "C:\\msvc-kit\\VC\\Tools\\MSVC\\14.44.34823\\bin\\Hostx64\\x64\\ml64.exe",
  "nmake": "C:\\msvc-kit\\VC\\Tools\\MSVC\\14.44.34823\\bin\\Hostx64\\x64\\nmake.exe",
  "rc": "C:\\msvc-kit\\Windows Kits\\10\\bin\\10.0.26100.0\\x64\\rc.exe"
}

Released under the MIT License.