summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libcppbuild.cc8
-rw-r--r--task.cc95
-rw-r--r--task.h7
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<std::string> Task::depends()
+std::vector<std::string> 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<std::string> depends();
+ std::vector<std::string> depends() const;
+
+ std::string target() const;
+private:
std::filesystem::path sourceFile;
std::filesystem::path targetFile;
std::filesystem::path depsFile;