diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/configure.cc | 6 | ||||
| -rw-r--r-- | src/ctor.h | 4 | ||||
| -rw-r--r-- | src/task.cc | 7 | ||||
| -rw-r--r-- | src/task.h | 4 | ||||
| -rw-r--r-- | src/task_ar.cc | 8 | ||||
| -rw-r--r-- | src/task_ar.h | 3 | ||||
| -rw-r--r-- | src/task_cc.cc | 11 | ||||
| -rw-r--r-- | src/task_cc.h | 3 | ||||
| -rw-r--r-- | src/task_fn.cc | 6 | ||||
| -rw-r--r-- | src/task_fn.h | 3 | ||||
| -rw-r--r-- | src/task_ld.cc | 15 | ||||
| -rw-r--r-- | src/task_ld.h | 3 | ||||
| -rw-r--r-- | src/task_so.cc | 8 | ||||
| -rw-r--r-- | src/task_so.h | 3 | ||||
| -rw-r--r-- | src/tasks.cc | 41 | ||||
| -rw-r--r-- | src/tools.cc | 14 |
16 files changed, 81 insertions, 58 deletions
diff --git a/src/configure.cc b/src/configure.cc index 64b2476..a8b50e0 100644 --- a/src/configure.cc +++ b/src/configure.cc @@ -492,7 +492,8 @@ int regenerateCache(ctor::settings& settings, { case ctor::target_type::executable: case ctor::target_type::unit_test: - case ctor::target_type::dynamic_library: + case ctor::target_type::shared_library: + case ctor::target_type::module: needs_build_ld = true; break; case ctor::target_type::static_library: @@ -529,7 +530,8 @@ int regenerateCache(ctor::settings& settings, { case ctor::target_type::executable: case ctor::target_type::unit_test: - case ctor::target_type::dynamic_library: + case ctor::target_type::shared_library: + case ctor::target_type::module: needs_host_ld = true; break; case ctor::target_type::static_library: @@ -21,7 +21,9 @@ enum class target_type executable, static_library, - dynamic_library, + shared_library, + dynamic_library = shared_library, + module, object, unit_test, unit_test_library, diff --git a/src/task.cc b/src/task.cc index 17559bf..3a7b895 100644 --- a/src/task.cc +++ b/src/task.cc @@ -7,13 +7,18 @@ #include <algorithm> #include <utility> -Task::Task(const ctor::build_configuration& config_, const ctor::settings& settings_, +Task::Task(ctor::target_type resolved_target_type, + const ctor::build_configuration& config_, + const ctor::settings& settings_, std::string sourceDir_) : config(config_) , output_system(config.system) , settings(settings_) , sourceDir(sourceDir_) { + assert(resolved_target_type != ctor::target_type::automatic); + target_type = resolved_target_type; + output_system = config.system; } int Task::registerDepTasks(const std::vector<std::shared_ptr<Task>>& tasks) @@ -23,7 +23,9 @@ enum class State class Task { public: - Task(const ctor::build_configuration& config, const ctor::settings& settings, + Task(ctor::target_type resolved_target_type, + const ctor::build_configuration& config, + const ctor::settings& settings, std::string sourceDir); virtual ~Task() = default; diff --git a/src/task_ar.cc b/src/task_ar.cc index 16e0ce8..4123a81 100644 --- a/src/task_ar.cc +++ b/src/task_ar.cc @@ -11,20 +11,18 @@ #include "util.h" #include "tools.h" -TaskAR::TaskAR(const ctor::build_configuration& config_, +TaskAR::TaskAR(ctor::target_type resolved_target_type, + const ctor::build_configuration& config_, const ctor::settings& settings_, const std::string& target, const std::vector<std::string>& objects, const std::string& sourceDir_) - : Task(config_, settings_, sourceDir_) + : Task(resolved_target_type, config_, settings_, sourceDir_) , _targetFile(target) , config(config_) , settings(settings_) , sourceDir(sourceDir_) { - target_type = ctor::target_type::static_library; - output_system = config.system; - auto toolchain = getToolChain(config.system); _targetFile = extension(toolchain, target_type, config.system, _targetFile); for(const auto& object : objects) diff --git a/src/task_ar.h b/src/task_ar.h index 69cc088..2bb7735 100644 --- a/src/task_ar.h +++ b/src/task_ar.h @@ -14,7 +14,8 @@ class TaskAR : public Task { public: - TaskAR(const ctor::build_configuration& config, + TaskAR(ctor::target_type resolved_target_type, + const ctor::build_configuration& config, const ctor::settings& settings, const std::string& target, const std::vector<std::string>& objects, diff --git a/src/task_cc.cc b/src/task_cc.cc index f81023f..479a453 100644 --- a/src/task_cc.cc +++ b/src/task_cc.cc @@ -14,9 +14,12 @@ #include "tools.h" #include "deps.h" -TaskCC::TaskCC(const ctor::build_configuration& config_, const ctor::settings& settings_, - const std::string& sourceDir_, const ctor::source& source) - : Task(config_, settings_, sourceDir_) +TaskCC::TaskCC(ctor::target_type resolved_target_type, + const ctor::build_configuration& config_, + const ctor::settings& settings_, + const std::string& sourceDir_, + const ctor::source& source) + : Task(resolved_target_type, config_, settings_, sourceDir_) , sourceFile(sourceDir_) , config(config_) , settings(settings_) @@ -35,8 +38,6 @@ TaskCC::TaskCC(const ctor::build_configuration& config_, const ctor::settings& s base += "-"; base += sourceFile.stem(); - target_type = ctor::target_type::object; - output_system = config.system; source_language = source.language; if(source_language == ctor::language::automatic) { diff --git a/src/task_cc.h b/src/task_cc.h index 2299fcd..1312417 100644 --- a/src/task_cc.h +++ b/src/task_cc.h @@ -14,7 +14,8 @@ class TaskCC : public Task { public: - TaskCC(const ctor::build_configuration& config, + TaskCC(ctor::target_type resolved_target_type, + const ctor::build_configuration& config, const ctor::settings& settings, const std::string& sourceDir, const ctor::source& source); virtual ~TaskCC() = default; diff --git a/src/task_fn.cc b/src/task_fn.cc index 69e36ac..b712e70 100644 --- a/src/task_fn.cc +++ b/src/task_fn.cc @@ -11,17 +11,17 @@ #include "execute.h" #include "util.h" -TaskFn::TaskFn(const ctor::build_configuration& config_, +TaskFn::TaskFn(ctor::target_type resolved_target_type, + const ctor::build_configuration& config_, const ctor::settings& settings_, const std::string& sourceDir_, const ctor::source& source) - : Task(config_, settings_, sourceDir_) + : Task(resolved_target_type, config_, settings_, sourceDir_) , config(config_) , settings(settings_) { std::filesystem::create_directories(std::filesystem::path(settings.builddir) / sourceDir.parent_path()); - target_type = config.type; source_language = source.language; if(std::holds_alternative<ctor::GeneratorOneToOne>(config.function)) diff --git a/src/task_fn.h b/src/task_fn.h index 84b4c2a..e8cc5ce 100644 --- a/src/task_fn.h +++ b/src/task_fn.h @@ -14,7 +14,8 @@ class TaskFn : public Task { public: - TaskFn(const ctor::build_configuration& config, + TaskFn(ctor::target_type resolved_target_type, + const ctor::build_configuration& config, const ctor::settings& settings, const std::string& sourceDir, const ctor::source& source); virtual ~TaskFn() = default; diff --git a/src/task_ld.cc b/src/task_ld.cc index a1cff34..2dceb59 100644 --- a/src/task_ld.cc +++ b/src/task_ld.cc @@ -11,25 +11,18 @@ #include "util.h" #include "tools.h" -TaskLD::TaskLD(const ctor::build_configuration& config_, +TaskLD::TaskLD(ctor::target_type resolved_target_type, + const ctor::build_configuration& config_, const ctor::settings& settings_, const std::string& target, const std::vector<std::string>& objects, const std::string& sourceDir_, bool is_self_) - : Task(config_, settings_, sourceDir_) + : Task(resolved_target_type, config_, settings_, sourceDir_) , config(config_) , settings(settings_) , is_self(is_self_) { - target_type = config.type; - output_system = config.system; - - if(target_type == ctor::target_type::automatic) - { - target_type = ctor::target_type::executable; - } - _targetFile = target; auto toolchain = getToolChain(config.system); _targetFile = extension(toolchain, target_type, config.system, _targetFile); @@ -98,7 +91,7 @@ int TaskLD::runInner() { auto depFile = dep->targetFile(); auto dep_type = target_type_from_extension(toolchain, depFile); - if(dep_type == ctor::target_type::dynamic_library) + if(dep_type == ctor::target_type::shared_library) { append(args, ld_option(toolchain, ctor::ld_opt::library_path, targetFile().parent_path().string())); diff --git a/src/task_ld.h b/src/task_ld.h index 9dce4b4..d9156b2 100644 --- a/src/task_ld.h +++ b/src/task_ld.h @@ -14,7 +14,8 @@ class TaskLD : public Task { public: - TaskLD(const ctor::build_configuration& config, + TaskLD(ctor::target_type resolved_target_type, + const ctor::build_configuration& config, const ctor::settings& settings, const std::string& target, const std::vector<std::string>& objects, diff --git a/src/task_so.cc b/src/task_so.cc index 090105a..c8926eb 100644 --- a/src/task_so.cc +++ b/src/task_so.cc @@ -11,21 +11,19 @@ #include "util.h" #include "tools.h" -TaskSO::TaskSO(const ctor::build_configuration& config_, +TaskSO::TaskSO(ctor::target_type resolved_target_type, + const ctor::build_configuration& config_, const ctor::settings& settings_, const std::string& target, const std::vector<std::string>& objects, const std::string& sourceDir_) - : Task(config_, settings_, sourceDir_) + : Task(resolved_target_type, config_, settings_, sourceDir_) , config(config_) , settings(settings_) , sourceDir(sourceDir_) { std::filesystem::path base = sourceDir; - target_type = ctor::target_type::dynamic_library; - output_system = config.system; - _targetFile = base / target; auto toolchain = getToolChain(config.system); _targetFile = extension(toolchain, target_type, config.system, _targetFile); diff --git a/src/task_so.h b/src/task_so.h index 3fc2e2f..c4283c1 100644 --- a/src/task_so.h +++ b/src/task_so.h @@ -14,7 +14,8 @@ class TaskSO : public Task { public: - TaskSO(const ctor::build_configuration& config, + TaskSO(ctor::target_type resolved_target_type, + const ctor::build_configuration& config, const ctor::settings& settings, const std::string& target, const std::vector<std::string>& objects, diff --git a/src/tasks.cc b/src/tasks.cc index fb7d72b..f520772 100644 --- a/src/tasks.cc +++ b/src/tasks.cc @@ -82,22 +82,23 @@ std::vector<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& std::filesystem::path targetFile(config.target); - ctor::target_type target_type{config.type}; - if(target_type == ctor::target_type::automatic) + ctor::target_type resolved_target_type{config.type}; + if(resolved_target_type == ctor::target_type::automatic) { if(!std::holds_alternative<std::monostate>(config.function)) { - target_type = ctor::target_type::function; + resolved_target_type = ctor::target_type::function; } else { - target_type = target_type_from_extension(ctor::toolchain::any, targetFile); + resolved_target_type = + target_type_from_extension(ctor::toolchain::any, targetFile); } } const auto& c = ctor::get_configuration(); std::vector<std::string> objects; - if(target_type != ctor::target_type::function) + if(resolved_target_type != ctor::target_type::function) { for(const auto& source : config.sources) { @@ -105,7 +106,8 @@ std::vector<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& (config.system == ctor::output_system::build && source.toolchain == c.build_toolchain) || (config.system == ctor::output_system::host && source.toolchain == c.host_toolchain)) { - auto task = std::make_shared<TaskCC>(config, settings, sourceDir, source); + auto task = + std::make_shared<TaskCC>(ctor::target_type::object, config, settings, sourceDir, source); tasks.push_back(task); objects.push_back(task->targetFile().string()); } @@ -117,7 +119,8 @@ std::vector<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& bool multi{std::holds_alternative<ctor::GeneratorManyToOne>(config.function)}; if(multi) { - auto task = std::make_shared<TaskFn>(config, settings, sourceDir, ""); + auto task = + std::make_shared<TaskFn>(resolved_target_type, config, settings, sourceDir, ""); tasks.push_back(task); objects.push_back(task->target()); } @@ -125,7 +128,8 @@ std::vector<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& { for(const auto& source : config.sources) { - auto task = std::make_shared<TaskFn>(config, settings, sourceDir, source); + auto task = + std::make_shared<TaskFn>(resolved_target_type, config, settings, sourceDir, source); tasks.push_back(task); objects.push_back(task->target()); } @@ -133,7 +137,7 @@ std::vector<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& } #endif - switch(target_type) + switch(resolved_target_type) { case ctor::target_type::automatic: // The target_type cannot be Auto @@ -147,25 +151,30 @@ std::vector<std::shared_ptr<Task>> taskFactory(const ctor::build_configuration& case ctor::target_type::static_library: case ctor::target_type::unit_test_library: - tasks.push_back(std::make_shared<TaskAR>(config, settings, config.target, - objects, sourceDir)); + tasks.push_back(std::make_shared<TaskAR>(resolved_target_type, config, settings, + config.target, objects, sourceDir)); break; #ifndef BOOTSTRAP - case ctor::target_type::dynamic_library: + case ctor::target_type::shared_library: // TODO: Use C++20 starts_with if(targetFile.stem().string().substr(0, 3) != "lib") { std::cerr << "Dynamic library target must have 'lib' prefix\n"; exit(1); } - tasks.push_back(std::make_shared<TaskSO>(config, settings, config.target, - objects, sourceDir)); + tasks.push_back(std::make_shared<TaskSO>(resolved_target_type, config, settings, + config.target, objects, sourceDir)); + break; + + case ctor::target_type::module: + tasks.push_back(std::make_shared<TaskSO>(resolved_target_type, config, settings, + config.target, objects, sourceDir)); break; case ctor::target_type::executable: case ctor::target_type::unit_test: - tasks.push_back(std::make_shared<TaskLD>(config, settings, config.target, - objects, sourceDir, is_self)); + tasks.push_back(std::make_shared<TaskLD>(resolved_target_type, config, settings, + config.target, objects, sourceDir, is_self)); break; case ctor::target_type::object: diff --git a/src/tools.cc b/src/tools.cc index f8662cc..e9c9b33 100644 --- a/src/tools.cc +++ b/src/tools.cc @@ -974,7 +974,14 @@ ctor::target_type target_type_from_extension(ctor::toolchain toolchain, if(ext == ".so" || ext == ".dylib") { - return ctor::target_type::dynamic_library; + if(file.filename().string().substr(0, 3) != "lib") + { + return ctor::target_type::module; + } + else + { + return ctor::target_type::shared_library; + } } if(ext == ".o") @@ -1003,7 +1010,7 @@ ctor::target_type target_type_from_extension(ctor::toolchain toolchain, if(ext == ".dll") { - return ctor::target_type::dynamic_library; + return ctor::target_type::shared_library; } if(ext == ".obj") @@ -1087,7 +1094,8 @@ std::filesystem::path extension(ctor::toolchain toolchain, break; } break; - case ctor::target_type::dynamic_library: + case ctor::target_type::shared_library: + case ctor::target_type::module: switch(arch) { case ctor::arch::unix: |
