#![warn( unsafe_code, unused_crate_dependencies, variant_size_differences, clippy::pedantic, clippy::cargo, clippy::nursery, clippy::missing_docs_in_private_items, clippy::str_to_string, clippy::unwrap_used, clippy::integer_arithmetic, clippy::panic, clippy::unimplemented, clippy::todo, clippy::unwrap_in_result, clippy::clone_on_ref_ptr, clippy::todo )] #![allow(clippy::non_ascii_literal)] #![allow(clippy::missing_docs_in_private_items)] use std::env::current_dir; use std::fs::metadata; use std::io::stdin; use std::path::PathBuf; use eyre::{bail, Result}; mod args; mod makefile; use args::Args; use makefile::Makefile; fn main() -> Result<()> { jane_eyre::install()?; let mut args = Args::from_env_and_args(); // If no makefile is specified, try some options. if args.makefile.is_empty() { args.makefile = vec![if metadata("./makefile").is_ok() { "./makefile".into() } else if metadata("./Makefile").is_ok() { "./Makefile".into() } else { bail!( "no makefile specified and neither {} nor {} was found.", current_dir().map_or_else( |_| "./makefile".to_owned(), |path| path.join("makefile").display().to_string() ), current_dir().map_or_else( |_| "./Makefile".to_owned(), |path| path.join("Makefile").display().to_string() ), ); }]; } // Read in the makefile(s) specified. // TODO dump command-line args into MAKEFLAGS // TODO dump command-line macros into environment // TODO add SHELL macro let mut makefile = Makefile::new(&args); for filename in &args.makefile { if filename == &PathBuf::from("-") { makefile.and_read(stdin().lock())?; } else { makefile.and_read_file(filename)?; }; } if args.print_everything { println!("{}", &makefile); } let targets = if args.targets().count() == 0 { let first_target = makefile.first_non_special_target.clone(); match first_target { Some(x) => vec![x], None => bail!("no targets given on command line or found in makefile."), } } else { args.targets().cloned().collect() }; for target in targets { makefile.update_target(&target)?; } Ok(()) }