#include #include #include #include #include #include "libcppbuild.h" #include "task.h" #include "settings.h" int main(int argc, const char* argv[]) { Settings settings; settings.builddir = "build/foo"; std::filesystem::path builddir(settings.builddir); std::filesystem::create_directories(builddir); auto project = configs(); std::string output = builddir / project.target; const auto& files = project.sources; std::vector objects; std::vector tasks; for(const auto& file : files) { tasks.emplace_back(project, settings, file); objects.push_back(tasks.back().targetFile); } if(argc == 2 && std::string(argv[1]) == "clean") { std::cout << "Cleaning\n"; //std::filesystem::remove_all(builddir); for(auto& task : tasks) { if(task.clean() != 0) { return 1; } } std::filesystem::remove(output); return 0; } std::cout << "Building\n"; // Start all tasks for(auto& task : tasks) { task.start(); } // Wait for all tasks for(auto& task : tasks) { if(task.wait() != 0) { return 1; } } std::cout << "Linking\n"; bool dolink{false}; if(!std::filesystem::exists(output)) { dolink = true; } else { for(const auto& object : objects) { if(std::filesystem::last_write_time(output) <= std::filesystem::last_write_time(object)) { dolink = true; break; } } } if(!dolink) { std::cout << "No linking needed\n"; return 0; } std::string objectlist; for(const auto& object : objects) { objectlist += object + " "; } std::string compiler = "g++ " + objectlist + " -o " + output; std::cout << compiler << "\n"; if(system(compiler.data())) { return 1; } return 0; }