summaryrefslogtreecommitdiff
path: root/src/task_fn.cc
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2025-12-20 15:43:47 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2025-12-20 15:43:47 +0100
commitf6bcdf67b1b981592825d6a6a1c4d3ff122de553 (patch)
tree174c30fb550768ec017b209b5215c66828358279 /src/task_fn.cc
parent7b6b7df83870c81a3f45107701ddbe52b83f91ab (diff)
Diffstat (limited to 'src/task_fn.cc')
-rw-r--r--src/task_fn.cc140
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;