conditional compiling and multithreading
Some checks failed
Main / build (push) Has been cancelled

This commit is contained in:
Jorijn van der Graaf 2025-05-03 01:20:31 +02:00
commit 52436399e8
9 changed files with 386 additions and 156 deletions

View file

@ -8,7 +8,7 @@ modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3.0 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
@ -23,23 +23,45 @@ module;
#include <filesystem>
#include <mutex>
#include <unordered_map>
#include <vector>
#include <atomic>
#include <thread>
#include <condition_variable>
export module Crafter.Build:ModuleFile;
import :Configuration;
namespace fs = std::filesystem;
export namespace Crafter::Build {
class ModuleFile {
public:
inline static std::mutex allFilesMutex;
std::mutex fileMutex;
inline static std::unordered_map<fs::path, ModuleFile*> allFiles;
bool needsRecompiling;
bool recompiled = false;
class Module;
class ModulePartition {
public:
bool needsRecompilingDependency = false;
bool needsRecompiling = false;
fs::path path;
std::vector<ModuleFile*> dependencies;
static ModuleFile* CompileModuleFile(fs::path path, std::string clangDir, const Configuration& config, fs::path pcmDir, std::string target);
private:
ModuleFile(fs::path path, std::string clangDir, const Configuration& config, fs::path pcmDir, std::string target);
void Compile(std::string clangDir, const Configuration& config, fs::path pcmDir, std::string target);
Module* parent;
std::vector<std::string> moduleDependencies;
std::vector<ModulePartition*> partitionDependants;
std::vector<std::string> partitionDependencies;
std::vector<ModulePartition*> partitionDependenciesP;
const std::string name;
std::atomic<bool>* compiled = new std::atomic<bool>(false);
ModulePartition(const std::string& name, const fs::path& path, Module* parent, const std::string& fileContent, const fs::path& pcmDir);
void AddDependants();
void Check();
void Compile(std::string clangDir, const Configuration& config, fs::path pcmDir, std::string target, const std::string& march, const std::string& flags);
void CompileSource(std::string clangDir, const Configuration& config, fs::path pcmDir, std::string target, const std::string& march, const std::string& flags, const fs::path& buildDir);
};
class Module {
public:
bool needsRecompiling = false;
std::unordered_map<std::string, ModulePartition> partitions;
const std::string name;
const fs::path path;
Module(const std::string& name, const fs::path& path, const Configuration& config, const fs::path& pcmDir, std::string& files, const fs::path& buildDir);
void Check();
void Compile(std::string clangDir, const Configuration& config, fs::path pcmDir, std::string target, const std::string& march, const std::string& flags, const fs::path& buildDir);
static std::vector<Module> GetModules(std::string clangDir, const Configuration& config, fs::path pcmDir, std::string target, const std::string& march, const std::string& flags, std::string& files, const fs::path& buildDir);
};
}