#include "tasks.h" #include #include #include #include "settings.h" #include "libcppbuild.h" #include "task.h" #include "task_cc.h" #include "task_ld.h" #include "task_ar.h" #include "task_so.h" #include "rebuild.h" std::list> taskFactory(const BuildConfiguration& config, const Settings& settings, const std::string& sourceDir) { std::filesystem::path targetFile(config.target); TargetType target_type{config.type}; if(target_type == TargetType::Auto) { if(targetFile.extension() == ".a") { target_type = TargetType::StaticLibrary; } else if(targetFile.extension() == ".so") { target_type = TargetType::DynamicLibrary; } else if(targetFile.extension() == "") { target_type = TargetType::Executable; } else { std::cerr << "Could not deduce target type from target " << targetFile.string() << " please specify.\n"; exit(1); } } std::vector objects; std::list> tasks; for(const auto& file : config.sources) { tasks.emplace_back(std::make_shared(config, settings, sourceDir, file)); objects.push_back(tasks.back()->target()); } switch(target_type) { case TargetType::StaticLibrary: tasks.emplace_back(std::make_shared(config, settings, config.target, objects)); break; case TargetType::DynamicLibrary: if(targetFile.stem().string().substr(0, 3) != "lib") { std::cerr << "Dynamic library target must have 'lib' prefix\n"; exit(1); } tasks.emplace_back(std::make_shared(config, settings, config.target, objects)); break; case TargetType::Executable: tasks.emplace_back(std::make_shared(config, settings, config.target, objects)); break; } return tasks; } std::shared_ptr getNextTask(const std::list>& allTasks, std::list>& dirtyTasks) { for(auto dirtyTask = dirtyTasks.begin(); dirtyTask != dirtyTasks.end(); ++dirtyTask) { //std::cout << "Examining target " << (*dirtyTask)->target() << "\n"; if((*dirtyTask)->ready()) { dirtyTasks.erase(dirtyTask); return *dirtyTask; } } //std::cout << "No task ready ... \n"; return nullptr; } std::list> getTasks(const Settings& settings) { static std::deque build_configs; std::list> tasks; for(std::size_t i = 0; i < numConfigFiles; ++i) { std::string path = std::filesystem::path(configFiles[i].file).parent_path(); if(settings.verbose > 1) { std::cout << configFiles[i].file << " in path " << path << "\n"; } auto configs = configFiles[i].cb(); for(const auto& config : configs) { build_configs.push_back(config); const auto& build_config = build_configs.back(); std::vector objects; auto t = taskFactory(build_config, settings, path); tasks.insert(tasks.end(), t.begin(), t.end()); } } return tasks; }