From 87aad8c76eb2371720c9aceef7516ecb0859ecdf Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Sun, 10 Oct 2021 19:02:54 +0200 Subject: Improve initial bootstrap speed. --- bootstrap.sh | 6 ++-- src/bootstrap.cc | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/tasks.cc | 6 +++- 3 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 src/bootstrap.cc diff --git a/bootstrap.sh b/bootstrap.sh index 815c12f..fd9b605 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -1,4 +1,6 @@ #!/bin/sh echo "Bootstrapping..." -g++ -std=c++17 -O3 -Isrc -pthread src/*.cc ctor.cc test/ctor.cc -o ctor && \ -echo "Done. Now run ./ctor to build." +g++ -std=c++17 -O3 -Isrc -pthread src/bootstrap.cc ctor.cc test/ctor.cc -o ctor && \ +./ctor && \ +g++ -std=c++17 -O3 -Isrc -pthread ctor.cc test/ctor.cc -Lbuild -lctor -o ctor && \ +echo "Done. Now run ./ctor to (re)build." diff --git a/src/bootstrap.cc b/src/bootstrap.cc new file mode 100644 index 0000000..9b8e029 --- /dev/null +++ b/src/bootstrap.cc @@ -0,0 +1,83 @@ +// -*- c++ -*- +// Distributed under the BSD 2-Clause License. +// See accompanying file LICENSE for details. +#include +#include + +#define BOOTSTRAP + +#include "libctor.h" +#include "settings.h" + +#include "util.cc" +#include "rebuild.cc" +#include "task.cc" +#include "task_cc.cc" +#include "task_ar.cc" +#include "execute.cc" +#include "tasks.cc" +#include "build.cc" + + +std::filesystem::path configurationFile("configuration.cc"); +std::filesystem::path configHeaderFile("config.h"); + +const std::map default_configuration{}; +const std::map& configuration() +{ + return default_configuration; +} + +bool hasConfiguration(const std::string& key) +{ + return false; +} + +const std::string& getConfiguration(const std::string& key, + const std::string& defaultValue) +{ + return defaultValue; +} + +int main(int argc, char* argv[]) +{ + if(argc > 1) + { + std::cerr << "This is a minimal bootstrap version of " << argv[0] << + " which doesn't support any arguments\n"; + return 1; + } + + Settings settings{}; + + settings.builddir = getConfiguration(cfg::builddir, "build"); + settings.parallel_processes = + std::max(1u, std::thread::hardware_concurrency() * 2 - 1); + settings.verbose = 0; + auto all_tasks = getTasks(settings); + for(auto task : all_tasks) + { + if(task->registerDepTasks(all_tasks)) + { + return 1; + } + } + + std::vector non_unittest_targets; + auto& targets = getTargets(settings); + for(const auto& target : targets) + { + if(target.config.type != TargetType::UnitTest) + { + non_unittest_targets.push_back(target); + } + } + + auto ret = build(settings, "all", non_unittest_targets, all_tasks); + if(ret != 0) + { + return ret; + } + + return 0; +} diff --git a/src/tasks.cc b/src/tasks.cc index 254404e..c280fb2 100644 --- a/src/tasks.cc +++ b/src/tasks.cc @@ -93,7 +93,7 @@ std::list> taskFactory(const BuildConfiguration& config, tasks.emplace_back(std::make_shared(config, settings, config.target, objects, sourceDir)); break; - +#ifndef BOOTSTRAP case TargetType::DynamicLibrary: // TODO: Use C++20 starts_with if(targetFile.stem().string().substr(0, 3) != "lib") @@ -113,6 +113,10 @@ std::list> taskFactory(const BuildConfiguration& config, case TargetType::Object: break; +#else + default: + break; +#endif } return tasks; -- cgit v1.2.3