diff --git a/Crafter.Build-Configuration.cpp b/Crafter.Build-Configuration.cpp index 96dae3c..5837406 100644 --- a/Crafter.Build-Configuration.cpp +++ b/Crafter.Build-Configuration.cpp @@ -81,7 +81,7 @@ Configuration::Configuration(nlohmann::json& configs, nlohmann::json& config, fs if(config.contains("dependencies")) { nlohmann::json dependenciesJson = config["dependencies"]; for (nlohmann::json::iterator it = dependenciesJson.begin(); it != dependenciesJson.end(); ++it) { - dependencies.emplace_back((*it)["path"].get(), (*it)["configuration"].get(), (*it)["filename"].get()); + dependencies.emplace_back((*it)["path"].get(), (*it)["configuration"].get()); } } if(config.contains("extends")){ diff --git a/Crafter.Build-Dependency.cpp b/Crafter.Build-Dependency.cpp index 5e4a7c9..b33baef 100644 --- a/Crafter.Build-Dependency.cpp +++ b/Crafter.Build-Dependency.cpp @@ -24,6 +24,6 @@ module Crafter.Build:DependencyImpl; import :Dependency; using namespace Crafter::Build; -Dependency::Dependency(std::string path, std::string configuration, std::string filename): path(path), configuration(configuration), filename(filename) { +Dependency::Dependency(std::string path, std::string configuration): path(path), configuration(configuration) { } diff --git a/Crafter.Build-Dependency.cppm b/Crafter.Build-Dependency.cppm index 278f97d..4bdba8b 100644 --- a/Crafter.Build-Dependency.cppm +++ b/Crafter.Build-Dependency.cppm @@ -26,8 +26,7 @@ export namespace Crafter::Build { class Dependency { public: std::string path; - std::string filename; std::string configuration; - Dependency(std::string path, std::string configuration, std::string filename); + Dependency(std::string path, std::string configuration); }; } diff --git a/Crafter.Build-Project.cpp b/Crafter.Build-Project.cpp index 3190ff8..1b2fdd8 100644 --- a/Crafter.Build-Project.cpp +++ b/Crafter.Build-Project.cpp @@ -38,7 +38,7 @@ Project::Project(std::string name, fs::path path, std::vector con } -void Project::Build(std::string configuration) { +void Project::Build(std::string configuration) const { for(const Configuration& config : configurations) { if(config.name == configuration){ Build(config, config.outputDir); @@ -48,7 +48,7 @@ void Project::Build(std::string configuration) { throw std::runtime_error("Configuration: " + configuration + " not found."); } -void Project::Build(std::string configuration, fs::path outputDir) { +void Project::Build(std::string configuration, fs::path outputDir) const { for(const Configuration& config : configurations) { if(config.name == configuration){ Build(config, outputDir); @@ -58,11 +58,11 @@ void Project::Build(std::string configuration, fs::path outputDir) { throw std::runtime_error("Configuration: " + configuration + " not found."); } -void Project::Build(Configuration configuration) { +void Project::Build(Configuration configuration) const { Build(configuration, configuration.outputDir); } -void Project::Build(Configuration config, fs::path outputDir) { +void Project::Build(Configuration config, fs::path outputDir) const { if (!fs::exists(config.buildDir)) { fs::create_directory(config.buildDir); } else { @@ -89,6 +89,24 @@ void Project::Build(Configuration config, fs::path outputDir) { pcmDir = config.buildDir; } + std::string libs; + + std::vector depThreads = std::vector(config.dependencies.size()); + + if(config.dependencies.size() > 0){ + libs += std::format(" -L{}", pcmDir.generic_string()); + } + + for(std::int_fast32_t i = 0; i < depThreads.size(); i++) { + Project project = Project::LoadFromJSON(config.dependencies[i].path); + libs+=std::format(" -l{}", project.name); + depThreads[i] = std::thread([i, pcmDir, config, project]() { + project.Build(config.dependencies[i].configuration, pcmDir); + }); + } + + std::string name = this->name; + std::string clangDir; if(config.target == "wasm32-unknown-wasi" || config.target == "wasm64-unknown-wasi"){ clangDir = "${WASI_SDK_PATH}/bin/clang++ --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -Wno-unused-command-line-argument"; @@ -100,6 +118,10 @@ void Project::Build(Configuration config, fs::path outputDir) { clangDir = "clang++ -Wno-unused-command-line-argument"; } + for(std::thread& thread : depThreads){ + thread.join(); + } + //clangDir+= std::format(" -I {} ", pcmDir); for(const fs::path& moduleFile : config.moduleFiles){ @@ -123,11 +145,11 @@ void Project::Build(Configuration config, fs::path outputDir) { thread.join(); } if(config.type == "executable"){ - system(std::format("{} {}-O{} -o {} {}", clangDir, files, config.optimizationLevel, (outputDir/name).generic_string(), target).c_str()); + system(std::format("{} {}-O{} -o {} {} {}", clangDir, files, config.optimizationLevel, (outputDir/name).generic_string(), target, libs).c_str()); } else if(config.type == "library"){ - system(std::format("ar r {}.a {}", (outputDir/name).generic_string(), files).c_str()); + system(std::format("ar r {}.a {}", (outputDir/fs::path("lib"+name)).generic_string(), files).c_str()); } else if(config.type == "shared-library"){ - system(std::format("ar r {}.so {} -shared", (outputDir/name).generic_string(), files).c_str()); + system(std::format("ar r {}.so {} -shared", (outputDir/fs::path("lib"+name)).generic_string(), files).c_str()); } } diff --git a/Crafter.Build-Project.cppm b/Crafter.Build-Project.cppm index a9d1a7e..b69d26a 100644 --- a/Crafter.Build-Project.cppm +++ b/Crafter.Build-Project.cppm @@ -33,11 +33,11 @@ export namespace Crafter::Build { fs::path path; std::vector configurations; Project(std::string name, fs::path path, std::vector configurations); - void Build(std::string configuration); - void Build(std::string configuration, fs::path outputDir); - void Build(Configuration configuration); - void Build(Configuration configuration, fs::path outputDir); - void SaveToJSON(fs::path path); + void Build(std::string configuration) const; + void Build(std::string configuration, fs::path outputDir) const; + void Build(Configuration configuration) const; + void Build(Configuration configuration, fs::path outputDir) const; + void SaveToJSON(fs::path path) const; static Project LoadFromJSON(fs::path path); }; }