diff options
Diffstat (limited to 'src/task_ar.cc')
-rw-r--r-- | src/task_ar.cc | 102 |
1 files changed, 48 insertions, 54 deletions
diff --git a/src/task_ar.cc b/src/task_ar.cc index d4a4447..426a576 100644 --- a/src/task_ar.cc +++ b/src/task_ar.cc @@ -6,25 +6,24 @@ #include <iostream> #include <fstream> -#include "libctor.h" -#include "settings.h" +#include "ctor.h" #include "execute.h" #include "util.h" +#include "tools.h" -TaskAR::TaskAR(const BuildConfiguration& config, - const Settings& settings, +TaskAR::TaskAR(const ctor::build_configuration& config, + const ctor::settings& settings, const std::string& target, const std::vector<std::string>& objects, - const std::string& sourcePath) - : Task(config) + const std::string& sourceDir) + : Task(config, settings, sourceDir) , config(config) , settings(settings) + , sourceDir(sourceDir) { - std::filesystem::path base = settings.builddir; - base /= sourcePath; - std::filesystem::create_directories(base); + std::filesystem::create_directories(std::filesystem::path(settings.builddir) / sourceDir); - targetFile = base / target; + _targetFile = target; for(const auto& object : objects) { std::filesystem::path objectFile = object; @@ -34,30 +33,28 @@ TaskAR::TaskAR(const BuildConfiguration& config, for(const auto& dep : config.depends) { - std::filesystem::path depFile = settings.builddir; - depFile /= dep; - depFiles.push_back(depFile); + depFiles.push_back(dep); } - flagsFile = base / targetFile.stem(); + flagsFile = std::filesystem::path(settings.builddir) / cleanUp(sourceDir) / targetFile().stem(); flagsFile += ".flags"; - target_type = TargetType::StaticLibrary; - source_language = Language::C; + target_type = ctor::target_type::static_library; + source_language = ctor::language::c; for(const auto& source : config.sources) { std::filesystem::path sourceFile(source.file); // TODO: Use task languages instead if(sourceFile.extension().string() != ".c") { - source_language = Language::Cpp; + source_language = ctor::language::cpp; } } } bool TaskAR::dirtyInner() { - if(!std::filesystem::exists(targetFile)) + if(!std::filesystem::exists(targetFile())) { return true; } @@ -67,15 +64,6 @@ bool TaskAR::dirtyInner() return true; } - for(const auto& objectFile : objectFiles) - { - if(std::filesystem::last_write_time(targetFile) <= - std::filesystem::last_write_time(objectFile)) - { - return true; - } - } - { auto lastFlags = readFile(flagsFile.string()); if(flagsString() != lastFlags) @@ -90,22 +78,16 @@ bool TaskAR::dirtyInner() int TaskAR::runInner() { - std::string objectlist; - for(const auto& objectFile : objectFiles) - { - if(!objectlist.empty()) - { - objectlist += " "; - } - objectlist += objectFile.string(); - } + auto toolchain = getToolChain(config.system); std::vector<std::string> args; - args.push_back("rcs"); - args.push_back(targetFile.string()); - for(const auto& objectFile : objectFiles) + append(args, ar_option(toolchain, ctor::ar_opt::replace)); + append(args, ar_option(toolchain, ctor::ar_opt::add_index)); + append(args, ar_option(toolchain, ctor::ar_opt::create)); + append(args, ar_option(toolchain, ctor::ar_opt::output, targetFile().string())); + for(const auto& task : getDependsTasks()) { - args.push_back(objectFile.string()); + args.push_back(task->targetFile().string()); } { // Write flags to file. @@ -115,17 +97,18 @@ int TaskAR::runInner() if(settings.verbose == 0) { - std::cout << "AR => " << targetFile.string() << "\n"; + std::cout << "AR => " << targetFile().string() << std::endl; } + const auto& c = ctor::get_configuration(); std::string tool; switch(outputSystem()) { - case OutputSystem::Host: - tool = getConfiguration(cfg::host_ar, "/usr/bin/ar"); + case ctor::output_system::host: + tool = c.get(ctor::cfg::host_ar, "/usr/bin/ar"); break; - case OutputSystem::Build: - tool = getConfiguration(cfg::build_ar, "/usr/bin/ar"); + case ctor::output_system::build: + tool = c.get(ctor::cfg::build_ar, "/usr/bin/ar"); break; } @@ -134,10 +117,10 @@ int TaskAR::runInner() int TaskAR::clean() { - if(std::filesystem::exists(targetFile)) + if(std::filesystem::exists(targetFile())) { - std::cout << "Removing " << targetFile.string() << "\n"; - std::filesystem::remove(targetFile); + std::cout << "Removing " << targetFile().string() << "\n"; + std::filesystem::remove(targetFile()); } if(std::filesystem::exists(flagsFile)) @@ -157,9 +140,9 @@ std::vector<std::string> TaskAR::depends() const deps.push_back(objectFile.string()); } - for(const auto& depFile : depFiles) + for(const auto& dep : config.depends) { - deps.push_back(depFile.string()); + deps.push_back(dep); } return deps; @@ -167,7 +150,12 @@ std::vector<std::string> TaskAR::depends() const std::string TaskAR::target() const { - return targetFile.string(); + return _targetFile.string(); +} + +std::filesystem::path TaskAR::targetFile() const +{ + return std::filesystem::path(settings.builddir) / sourceDir / _targetFile; } bool TaskAR::derived() const @@ -177,14 +165,20 @@ bool TaskAR::derived() const std::string TaskAR::flagsString() const { + auto toolchain = getToolChain(config.system); std::string flagsStr; + bool first{true}; for(const auto& flag : config.flags.ldflags) { - if(flag != config.flags.ldflags[0]) + for(const auto& str : to_strings(toolchain, flag)) { - flagsStr += " "; + if(first) + { + flagsStr += " "; + first = false; + } + flagsStr += str; } - flagsStr += flag; } flagsStr += "\n"; |