#include "ymake.h" #include "file.h" #include "Builder.h" #include "MakefileReader.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace fs = std::filesystem; namespace bp = boost::process; namespace pt = boost::property_tree; using namespace std::string_literals; namespace { void usage() { std::cout << "Usage: ymake []" << std::endl; std::cout << " with one of:" << std::endl; std::cout << " build (same as no action specified)" << std::endl; std::cout << " clean" << std::endl; std::cout << " test" << std::endl; } } int ymake(int argc, char* argv[]) { try { pt::ptree ptree{MakefileReader{}.read(".")}; std::string action{"default"}; if (argc == 1) { // default action } else if (argc == 2) { action = argv[1]; } else { std::cerr << "Invalid arguments." << std::endl; usage(); exit(1); } if (action == "default" || action == "build") { // build Builder builder(ptree, "build"); builder.build(); } else if (action == "clean") { Builder builder(ptree, "*"); builder.clean(); } else if (action == "test") { Builder builder(ptree, "test"); builder.build(); builder.run_tests(); } else if (action == "install") { throw std::runtime_error("unimplemented"); } else if (action == "rebuild") { throw std::runtime_error("unimplemented"); } else if (action == "run") { throw std::runtime_error("unimplemented"); } else { std::cerr << "Invalid action: " << action << std::endl; usage(); exit(1); } } catch (const std::exception& ex) { std::cerr << "ymake: " << ex.what() << std::endl; return 1; } return 0; }