summaryrefslogtreecommitdiff
path: root/task.cc
diff options
context:
space:
mode:
Diffstat (limited to 'task.cc')
-rw-r--r--task.cc263
1 files changed, 0 insertions, 263 deletions
diff --git a/task.cc b/task.cc
index 030932e..e69de29 100644
--- a/task.cc
+++ b/task.cc
@@ -1,263 +0,0 @@
-#include "task.h"
-
-#include <iostream>
-#include <fstream>
-#include <unistd.h>
-#include <cstring>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <spawn.h>
-
-#include "libcppbuild.h"
-#include "settings.h"
-
-namespace
-{
-std::string readFile(const std::string &fileName)
-{
- std::ifstream ifs(fileName.c_str(), std::ios::in | std::ios::binary | std::ios::ate);
-
- std::ifstream::pos_type fileSize = ifs.tellg();
- ifs.seekg(0, std::ios::beg);
-
- std::vector<char> bytes(fileSize);
- ifs.read(bytes.data(), fileSize);
-
- return std::string(bytes.data(), fileSize);
-}
-
-std::vector<std::string> readDeps(const std::string& depFile)
-{
- if(!std::filesystem::exists(depFile))
- {
- return {};
- }
-
- auto str = readFile(depFile);
-
- std::vector<std::string> output;
- std::string tmp;
- bool start{false};
- bool in_whitespace{false};
- for(const auto& c : str)
- {
- if(c == '\\' || c == '\n')
- {
- continue;
- }
-
- if(c == ':')
- {
- start = true;
- continue;
- }
-
- if(!start)
- {
- continue;
- }
-
- if(c == ' ' || c == '\t')
- {
- if(in_whitespace)
- {
- continue;
- }
-
- if(!tmp.empty())
- {
- output.push_back(tmp);
- }
- tmp.clear();
- in_whitespace = true;
- }
- else
- {
- in_whitespace = false;
- tmp += c;
- }
- }
-
- if(!tmp.empty())
- {
- output.push_back(tmp);
- }
-
- return output;
-}
-} // namespace ::
-
-Task::Task(const BuildConfiguration& config, const Settings& settings,
- const std::string& source)
- : config(config)
- , settings(settings)
-{
- sourceFile = source;
- targetFile = settings.builddir / sourceFile.stem();
- targetFile += ".o";
- depsFile = settings.builddir / sourceFile.stem();
- depsFile += ".d";
-}
-
-bool Task::dirty()
-{
- if(!std::filesystem::exists(sourceFile))
- {
- //std::cout << "Missing source file: " << std::string(sourceFile) << "\n";
- return true;
- }
-
- if(!std::filesystem::exists(targetFile))
- {
- //std::cout << "Missing targetFile\n";
- return true;
- }
-
- if(!std::filesystem::exists(depsFile))
- {
- //std::cout << "Missing depsFile\n";
- return true;
- }
-
- if(std::filesystem::last_write_time(sourceFile) >
- std::filesystem::last_write_time(depsFile))
- {
- //std::cout << "The sourceFile newer than depsFile\n";
- return true;
- }
-
- 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))
- {
- //std::cout << "The targetFile older than " << std::string(dep) << "\n";
- return true;
- }
- }
-
- if(std::filesystem::last_write_time(sourceFile) >
- std::filesystem::last_write_time(targetFile))
- {
- //std::cout << "The targetFile older than sourceFile\n";
- return true;
- }
-
- return false;
-}
-
-int parent_waitpid(pid_t pid)
-{
- int status;
-
- if(waitpid(pid, &status, 0) != pid)
- {
- return 1;
- }
-
- return status;
-}
-int Task::run()
-{
- if(!std::filesystem::exists(sourceFile))
- {
- std::cout << "Missing source file: " << std::string(sourceFile) << "\n";
- return 1;
- }
-
- std::string comp = "/usr/bin/g++";
- auto flags = config.cxxflags;
- if(std::string(sourceFile.extension()) == ".c")
- {
- comp = "/usr/bin/gcc";
- flags = config.cflags;
- }
-
- char source[256];
- strcpy(source, std::string(sourceFile).data());
- char target[256];
- strcpy(target, std::string(targetFile).data());
- char pwd[256];
- strcpy(pwd, std::string(std::filesystem::current_path()).data());
- std::vector<const char*> argv;
- //args.push_back("/bin/echo");
- if(comp == "/usr/bin/gcc")
- {
- argv.push_back("/usr/bin/gcc");
- }
- else
- {
- argv.push_back("/usr/bin/g++");
- }
-
- argv.push_back("-MMD");
- argv.push_back("-c");
- argv.push_back(source);
- argv.push_back("-o");
- argv.push_back(target);
-
- for(const auto& flag : flags)
- {
- argv.push_back(flag.data());
- }
-
- std::string cmd;
- for(const auto& arg : argv)
- {
- if(arg == nullptr)
- {
- break;
- }
- if(!cmd.empty())
- {
- cmd += " ";
- }
- cmd += arg;
- }
- std::cout << cmd << "\n";
-
-#if 0
- auto pid = vfork();
- if(pid == 0)
- {
- execv(comp.data(), (char**)argv.data());
- }
-#else
- pid_t pid;
- if(posix_spawn(&pid, comp.data(), nullptr, nullptr, (char**)argv.data(), nullptr))
- {
- return 1;//exit(1);
- }
-#endif
-
- return parent_waitpid(pid);
-}
-
-int Task::clean()
-{
- if(std::filesystem::exists(targetFile))
- {
- std::cout << "Removing " << std::string(targetFile) << "\n";
- std::filesystem::remove(targetFile);
- }
-
- if(std::filesystem::exists(depsFile))
- {
- std::cout << "Removing " << std::string(depsFile) << "\n";
- std::filesystem::remove(depsFile);
- }
-
- return 0;
-}
-
-std::vector<std::string> Task::depends() const
-{
- return {};
-}
-
-std::string Task::target() const
-{
- return targetFile;
-}