#![deny(rust_2018_idioms)]
#![allow(
clippy::type_complexity,
clippy::new_without_default,
clippy::blocks_in_conditions
)]
#![recursion_limit = "256"]
#[macro_use]
extern crate log;
#[cfg(feature = "rouille")]
#[macro_use(router)]
extern crate rouille;
#[cfg(test)]
#[macro_use]
mod test;
#[macro_use]
pub mod errors;
pub mod cache;
mod client;
mod cmdline;
mod commands;
mod compiler;
pub mod config;
pub mod dist;
mod jobserver;
pub mod lru_disk_cache;
mod mock_command;
mod net;
mod protocol;
pub mod server;
#[doc(hidden)]
pub mod util;
use std::env;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
pub const LOGGING_ENV: &str = "SCCACHE_LOG";
pub fn main() {
init_logging();
let command = match cmdline::try_parse() {
Ok(cmd) => cmd,
Err(e) => match e.downcast::<clap::error::Error>() {
Ok(clap_err) => clap_err.exit(),
Err(some_other_err) => {
println!("sccache: {some_other_err}");
for source in some_other_err.chain().skip(1) {
println!("sccache: caused by: {source}");
}
std::process::exit(1);
}
},
};
std::process::exit(match commands::run_command(command) {
Ok(s) => s,
Err(e) => {
eprintln!("sccache: error: {}", e);
for e in e.chain().skip(1) {
eprintln!("sccache: caused by: {}", e);
}
2
}
});
}
fn init_logging() {
if env::var(LOGGING_ENV).is_ok() {
let mut builder = env_logger::Builder::from_env(LOGGING_ENV);
if env::var("SCCACHE_LOG_MILLIS").is_ok() {
builder.format_timestamp_millis();
}
match builder.try_init() {
Ok(_) => (),
Err(e) => panic!("Failed to initialize logging: {:?}", e),
}
}
}