// -*- c++ -*- // Distributed under the BSD 2-Clause License. // See accompanying file LICENSE for details. #include "task.h" #include #include Task::Task(const ctor::build_configuration& config, const ctor::settings& settings, const std::string& sourceDir) : config(config) , output_system(config.system) , settings(settings) , sourceDir(sourceDir) { } int Task::registerDepTasks(const std::set>& tasks) { for(const auto& depStr : depends()) { bool found{false}; for(const auto& task : tasks) { if(*task == depStr) { dependsTasks.insert(task); found = true; } } if(!found) { std::cerr << "Could not find dependency " << depStr << " needed by " << target() << " target\n"; return 1; } } return registerDepTasksInner(tasks); } bool Task::operator==(const std::string& depStr) { return name() == depStr || target() == depStr || sourceDir + "/" + target() == depStr || targetFile().string() == depStr ; } std::string Task::name() const { return config.name; } bool Task::dirty() { for(const auto& task : dependsTasks) { if(task->dirty()) { return true; } } return dirtyInner(); } bool Task::ready() { for(const auto& task : dependsTasks) { if(task->dirty() || task->state() == State::Running) { return false; } } task_state.store(State::Ready); return true; } int Task::run() { if(task_state.load() == State::Done) { return 0; } task_state.store(State::Running); auto ret = runInner(); if(ret == 0) { task_state.store(State::Done); } else { task_state.store(State::Error); } return ret; } State Task::state() const { return task_state.load(); } const ctor::build_configuration& Task::buildConfig() const { return config; } ctor::target_type Task::targetType() const { return target_type; } ctor::language Task::sourceLanguage() const { return source_language; } ctor::output_system Task::outputSystem() const { return output_system; } std::string Task::compiler() const { const auto& c = ctor::get_configuration(); switch(sourceLanguage()) { case ctor::language::c: switch(outputSystem()) { case ctor::output_system::host: return c.get(ctor::cfg::host_cc, "/usr/bin/gcc"); case ctor::output_system::build: return c.get(ctor::cfg::build_cc, "/usr/bin/gcc"); } case ctor::language::cpp: switch(outputSystem()) { case ctor::output_system::host: return c.get(ctor::cfg::host_cxx, "/usr/bin/g++"); case ctor::output_system::build: return c.get(ctor::cfg::build_cxx, "/usr/bin/g++"); } default: std::cerr << "Unknown CC target type\n"; exit(1); break; } } std::set> Task::getDependsTasks() { return dependsTasks; }