diff options
author | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-08-28 18:59:29 +0200 |
---|---|---|
committer | Bent Bisballe Nyeng <deva@aasimon.org> | 2021-08-28 18:59:29 +0200 |
commit | 5da56616cccf4e595ec6a556cf1aef40b37746e3 (patch) | |
tree | 8142e294a251ca2ab1697f7541fe67dfd31622e0 /task_cc.cc | |
parent | 0597cb9854d66d918762ff167148516b69c02e9a (diff) |
Move sources to ... well, src ;)
Diffstat (limited to 'task_cc.cc')
-rw-r--r-- | task_cc.cc | 339 |
1 files changed, 0 insertions, 339 deletions
diff --git a/task_cc.cc b/task_cc.cc deleted file mode 100644 index af9cf7a..0000000 --- a/task_cc.cc +++ /dev/null @@ -1,339 +0,0 @@ -#include "task_cc.h" - -#include <iostream> -#include <fstream> - -#include "libcppbuild.h" -#include "settings.h" -#include "execute.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 :: - -TaskCC::TaskCC(const BuildConfiguration& config, const Settings& settings, - const std::string& sourceDir, const std::string& source) - : Task(config) - , config(config) - , settings(settings) - , sourceDir(sourceDir) -{ - sourceFile = sourceDir; - sourceFile /= source; - - std::filesystem::path base = settings.builddir; - base /= config.target; - base += "-"; - base += sourceFile.stem(); - - if(sourceFile.extension().string() == ".c") - { - base += "_c"; - } - else - { - base += "_cc"; - } - - targetFile = base; - targetFile += ".o"; - depsFile = base; - depsFile += ".d"; - flagsFile = base; - flagsFile += ".flags"; - - target_type = TargetType::Object; - if(sourceFile.extension().string() == ".c") - { - source_language = Language::C; - } - else - { - source_language = Language::Cpp; - } -} - -std::string TaskCC::name() const -{ - return target(); -} - -bool TaskCC::dirtyInner() -{ - 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::exists(flagsFile)) - { - //std::cout << "Missing flagsFile\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 lastFlags = readFile(flagsFile.string()); - if(flagsString() != lastFlags) - { - //std::cout << "The compiler flags changed\n"; - return true; - } - } - - auto depList = readDeps(depsFile.string()); - 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 TaskCC::runInner() -{ - if(!std::filesystem::exists(sourceFile)) - { - std::cout << "Missing source file: " << sourceFile.string() << "\n"; - return 1; - } - - auto args = getCompilerArgs(); - - { // Write flags to file. - std::ofstream flagsStream(flagsFile.string()); - flagsStream << flagsString(); - } - - if(settings.verbose == 0) - { - std::cout << compiler() << " " << - sourceFile.lexically_normal().string() << " => " << - targetFile.lexically_normal().string() << "\n"; - } - - return execute(compiler(), args, settings.verbose > 0); -} - -int TaskCC::clean() -{ - if(std::filesystem::exists(targetFile)) - { - std::cout << "Removing " << targetFile.string() << "\n"; - std::filesystem::remove(targetFile); - } - - if(std::filesystem::exists(depsFile)) - { - std::cout << "Removing " << depsFile.string() << "\n"; - std::filesystem::remove(depsFile); - } - - if(std::filesystem::exists(flagsFile)) - { - std::cout << "Removing " << flagsFile.string() << "\n"; - std::filesystem::remove(flagsFile); - } - - return 0; -} - -std::vector<std::string> TaskCC::depends() const -{ - return {}; -} - -std::string TaskCC::target() const -{ - return targetFile.string(); -} - -std::string TaskCC::toJSON() const -{ - std::string json; - json += "\t{\n"; - json += "\t\t\"directory\": \"" + sourceDir.string() + "\",\n"; - json += "\t\t\"file\": \"" + sourceFile.lexically_normal().string() + "\",\n"; - json += "\t\t\"output\": \"" + targetFile.string() + "\",\n"; - json += "\t\t\"arguments\": [ \"" + compiler() + "\""; - auto args = getCompilerArgs(); - for(const auto& arg : args) - { - json += ", \"" + arg + "\""; - } - json += " ]\n"; - json += "\t}"; - return json; -} - -std::vector<std::string> TaskCC::flags() const -{ - switch(sourceLanguage()) - { - case Language::C: - return config.cflags; - case Language::Cpp: - return config.cxxflags; - default: - std::cerr << "Unknown CC target type\n"; - exit(1); - break; - } -} - -std::string TaskCC::flagsString() const -{ - std::string flagsStr = compiler(); - for(const auto& flag : flags()) - { - flagsStr += " " + flag; - } - return flagsStr; -} - -std::vector<std::string> TaskCC::getCompilerArgs() const -{ - auto compiler_flags = flags(); - - std::vector<std::string> args; - args.push_back("-MMD"); - - if(std::filesystem::path(config.target).extension() == ".so") - { - // Add -fPIC arg to all contained object files - args.push_back("-fPIC"); - } - - args.push_back("-c"); - args.push_back(sourceFile.string()); - args.push_back("-o"); - args.push_back(targetFile.string()); - - for(const auto& flag : compiler_flags) - { - // Is arg an added include path? - if(flag.substr(0, 2) == "-I") - { - std::string include_path = flag.substr(2); - include_path.erase(0, include_path.find_first_not_of(' ')); - std::filesystem::path path(include_path); - - // Is it relative? - if(path.is_relative()) - { - path = (sourceDir / path).lexically_normal(); - std::string new_include_path = "-I" + path.string(); - args.push_back(new_include_path); - continue; - } - } - - args.push_back(flag); - } - - return args; -} |