mod check_portability;
mod check_shlibs;
mod checksum;
mod ctfconvert;
mod digest;
mod distinfo;
mod fetch;
mod symlinks;
const MKTOOL_DEFAULT_THREADS: usize = 4;
pub fn build_thread_pool(
jobs: Option<usize>,
) -> Result<rayon::ThreadPool, rayon::ThreadPoolBuildError> {
let nthreads = match jobs {
Some(n) => n,
None => match std::env::var("MKTOOL_JOBS") {
Ok(s) => match s.parse::<usize>() {
Ok(n) => n,
Err(e) => {
eprintln!(
"WARNING: invalid MKTOOL_JOBS '{s}': {e}, using default"
);
MKTOOL_DEFAULT_THREADS
}
},
Err(_) => MKTOOL_DEFAULT_THREADS,
},
};
rayon::ThreadPoolBuilder::new().num_threads(nthreads).build()
}
pub fn scrub_ctrl(s: &str) -> String {
s.chars()
.map(|c| if c.is_control() && c != '\t' { '?' } else { c })
.collect()
}
use clap::{Parser, Subcommand};
#[derive(Debug, Parser)]
#[command(author, version, about, long_about = None)]
pub struct Cli {
#[arg(short, long)]
verbose: bool,
#[command(subcommand)]
command: Commands,
}
#[derive(Debug, Subcommand)]
#[command(rename_all = "lower")]
enum Commands {
#[command(name = "check-portability")]
CheckPortability(check_portability::Cmd),
#[command(name = "check-shlibs")]
CheckShlibs(check_shlibs::CheckShlibs),
CheckSum(checksum::CheckSum),
CTFConvert(ctfconvert::CTFConvert),
Digest(digest::DigestCmd),
DistInfo(distinfo::DistInfo),
Fetch(fetch::Fetch),
Symlinks(symlinks::Symlinks),
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let cli = Cli::parse();
let rv = match &cli.command {
Commands::CheckPortability(cmd) => cmd.run()?,
Commands::CheckShlibs(cmd) => cmd.run()?,
Commands::CheckSum(cmd) => cmd.run()?,
Commands::CTFConvert(cmd) => cmd.run()?,
Commands::Digest(cmd) => cmd.run()?,
Commands::DistInfo(cmd) => cmd.run()?,
Commands::Fetch(cmd) => cmd.run()?,
Commands::Symlinks(cmd) => cmd.run()?,
};
std::process::exit(rv);
}