From 6bcbf18a6a67707c13d66b96770c8b210a45b9f4 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sat, 12 Jun 2021 16:16:41 +0200 Subject: Skip non-dirty tasks. --- libcppbuild.cc | 8 ++++- task.cc | 95 +++++++++++++++++++++++++++++----------------------------- task.h | 7 ++++- 3 files changed, 61 insertions(+), 49 deletions(-) diff --git a/libcppbuild.cc b/libcppbuild.cc index 3cba49f..82a70d1 100644 --- a/libcppbuild.cc +++ b/libcppbuild.cc @@ -38,7 +38,7 @@ int main(int argc, const char* argv[]) for(const auto& file : files) { tasks.emplace_back(config, settings, file); - objects.push_back(tasks.back().targetFile); + objects.push_back(tasks.back().target()); } if(argc == 2 && std::string(argv[1]) == "clean") @@ -69,6 +69,12 @@ int main(int argc, const char* argv[]) while(processes.size() < settings.parallel_processes && task != tasks.end()) { + if(!task->dirty()) + { + ++task; + continue; + } + processes.emplace_back( std::async(std::launch::async, [task]() diff --git a/task.cc b/task.cc index 4728a1c..29e18cb 100644 --- a/task.cc +++ b/task.cc @@ -94,84 +94,80 @@ Task::Task(const BuildConfiguration& config, const Settings& settings, depsFile += ".d"; } -int Task::run() +bool Task::dirty() { if(!std::filesystem::exists(sourceFile)) { - std::cout << "Missing source file: " << std::string(sourceFile) << "\n"; - return 1; + //std::cout << "Missing source file: " << std::string(sourceFile) << "\n"; + return true; } - bool recompile{false}; - - if(!recompile && - !std::filesystem::exists(targetFile)) + if(!std::filesystem::exists(targetFile)) { - recompile = true; //std::cout << "Missing targetFile\n"; + return true; } - if(!recompile && - !std::filesystem::exists(depsFile)) + if(!std::filesystem::exists(depsFile)) { - recompile = true; //std::cout << "Missing depsFile\n"; + return true; } - if(!recompile && - std::filesystem::last_write_time(sourceFile) > + if(std::filesystem::last_write_time(sourceFile) > std::filesystem::last_write_time(depsFile)) { - recompile = true; //std::cout << "The sourceFile newer than depsFile\n"; + return true; } - if(!recompile) + auto depList = readDeps(depsFile); + for(const auto& dep : depList) { - auto depList = readDeps(depsFile); - for(const auto& dep : depList) + if(!std::filesystem::exists(dep) || + std::filesystem::last_write_time(targetFile) < + std::filesystem::last_write_time(dep)) { - if(!std::filesystem::exists(dep) || - std::filesystem::last_write_time(targetFile) < - std::filesystem::last_write_time(dep)) - { - recompile = true; - //std::cout << "The targetFile older than dep\n"; - break; - } + //std::cout << "The targetFile older than " << std::string(dep) << "\n"; + return true; } } - if(!recompile && - std::filesystem::last_write_time(sourceFile) > + if(std::filesystem::last_write_time(sourceFile) > std::filesystem::last_write_time(targetFile)) { - recompile = true; //std::cout << "The targetFile older than sourceFile\n"; + return true; } - if(recompile) + return false; +} + +int Task::run() +{ + if(!std::filesystem::exists(sourceFile)) { - std::string comp = "g++"; - std::string flags = config.cxxflags; - if(std::string(sourceFile.extension()) == ".c") - { - comp = "gcc"; - flags = config.cflags; - } - std::string cmd = comp + - " -MMD -c " + std::string(sourceFile) + " " + - flags + " " + - "-o " + std::string(targetFile); - std::cout << cmd << "\n"; + std::cout << "Missing source file: " << std::string(sourceFile) << "\n"; + return 1; + } - if(system(cmd.data())) - { - return 1; - } - return 0; + std::string comp = "g++"; + std::string flags = config.cxxflags; + if(std::string(sourceFile.extension()) == ".c") + { + comp = "gcc"; + flags = config.cflags; } + std::string cmd = comp + + " -MMD -c " + std::string(sourceFile) + " " + + flags + " " + + "-o " + std::string(targetFile); + std::cout << cmd << "\n"; + if(system(cmd.data())) + { + return 1; + } return 0; } @@ -192,7 +188,12 @@ int Task::clean() return 0; } -std::vector Task::depends() +std::vector Task::depends() const { return {}; } + +std::string Task::target() const +{ + return targetFile; +} diff --git a/task.h b/task.h index ee67b5c..bdd881b 100644 --- a/task.h +++ b/task.h @@ -16,11 +16,16 @@ public: const Settings& settings, const std::string& source); + bool dirty(); + int run(); int clean(); - std::vector depends(); + std::vector depends() const; + + std::string target() const; +private: std::filesystem::path sourceFile; std::filesystem::path targetFile; std::filesystem::path depsFile; -- cgit v1.2.3