diff options
Diffstat (limited to 'src/task_fn.cc')
| -rw-r--r-- | src/task_fn.cc | 140 |
1 files changed, 123 insertions, 17 deletions
diff --git a/src/task_fn.cc b/src/task_fn.cc index b6b50ea..a984ef8 100644 --- a/src/task_fn.cc +++ b/src/task_fn.cc @@ -20,6 +20,12 @@ TaskFn::TaskFn(const ctor::build_configuration& config_, const ctor::settings& s { sourceFile /= source.file; + for(const auto& src : config.sources) + { + auto _src = sourceFile / src.file; + sources.push_back(_src.string()); + } + std::filesystem::create_directories(std::filesystem::path(settings.builddir) / sourceFile.parent_path()); target_type = config.type; @@ -27,29 +33,90 @@ TaskFn::TaskFn(const ctor::build_configuration& config_, const ctor::settings& s if(source.output.empty()) { - std::cerr << "Missing output file for functional target\n"; - exit(1); + std::filesystem::path base = sourceFile.parent_path(); + _targetFile = + //std::filesystem::path(settings.builddir) / + base / config.target; + } + else + { + _targetFile = source.output; } - _targetFile = source.output; + sourceListFile = targetFile().parent_path() / targetFile().filename(); + sourceListFile += ".sources"; } bool TaskFn::dirtyInner() { - if(!std::filesystem::exists(sourceFile)) + if(!std::filesystem::exists(targetFile())) { - //std::cout << "Missing source file: " << std::string(sourceFile) << "\n"; + //std::cout << "Missing targetFile\n"; return true; } - if(!std::filesystem::exists(targetFile())) + if(!std::filesystem::exists(sourceListFile)) { - //std::cout << "Missing targetFile\n"; + //std::cout << "Missing sourceListFile\n"; return true; } - if(std::filesystem::last_write_time(sourceFile) > - std::filesystem::last_write_time(targetFile())) + { + auto lastSourceList = readFile(sourceListFile.string()); + if(sourceListString() != lastSourceList) + { + //std::cout << "The compiler sourceList changed\n"; + return true; + } + } + + std::filesystem::file_time_type last_changed{}; + bool missing{false}; + const auto visitor = overloaded + { + [](std::monostate) {}, + [&](ctor::GeneratorCb) + { + if(!std::filesystem::exists(sourceFile)) + { + missing = true; + } + last_changed = std::filesystem::last_write_time(sourceFile); + }, + [&](ctor::GeneratorCb2) + { + bool first{true}; + for(const auto& source : sources) + { + if(!std::filesystem::exists(source)) + { + missing |= true; + } + else + { + if(first) + { + last_changed = std::filesystem::last_write_time(source); + } + else + { + last_changed = + std::max(last_changed, + std::filesystem::last_write_time(source)); + } + } + first = false; + } + }, + }; + std::visit(visitor, config.function); + + if(missing) + { + return true; + } + + if(last_changed > std::filesystem::last_write_time(targetFile())) { //std::cout << "The targetFile older than sourceFile\n"; return true; @@ -60,10 +127,17 @@ bool TaskFn::dirtyInner() int TaskFn::runInner() { - if(!std::filesystem::exists(sourceFile)) - { - std::cout << "Missing source file: " << sourceFile.string() << "\n"; - return 1; +// if(!std::filesystem::exists(sourceFile)) +// { +// std::cout << "Missing source file: " << sourceFile.string() << "\n"; +// return 1; +// } + + { // Write sourceList to file. + std::ofstream sourceListStream(sourceListFile.string()); + std::cout << "Write to sources file: " << sourceListFile.string() << '\n'; + sourceListStream << sourceListString(); + std::cout << "Content: " << sourceListString() << '\n'; } if(settings.verbose >= 0) @@ -74,10 +148,26 @@ int TaskFn::runInner() std::cout << output << std::flush; } - auto res = config.function(sourceFile.string(), - targetFile().string(), - config, - settings); + int res{}; + const auto visitor = overloaded + { + [](std::monostate) {}, + [&](ctor::GeneratorCb cb) + { + res = cb(sourceFile.string(), + targetFile().string(), + config, + settings); + }, + [&](ctor::GeneratorCb2 cb) + { + res = cb(sources, + targetFile().string(), + config, + settings); + }, + }; + std::visit(visitor, config.function); if(res != 0) { std::filesystem::remove(targetFile()); @@ -94,6 +184,12 @@ int TaskFn::clean() std::filesystem::remove(targetFile()); } + if(std::filesystem::exists(sourceListFile)) + { + std::cout << "Removing " << sourceListFile.string() << "\n"; + std::filesystem::remove(sourceListFile); + } + return 0; } @@ -112,6 +208,16 @@ std::filesystem::path TaskFn::targetFile() const return std::filesystem::path(settings.builddir) / sourceDir / _targetFile; } +std::string TaskFn::sourceListString() const +{ + std::string sourceListStr; + for(const auto& source : config.sources) + { + sourceListStr += " " + source.file; + } + return sourceListStr; +} + bool TaskFn::derived() const { return false; |
