From be39501c5ba3ee839872a4b9303702bda429f8d2 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Sun, 29 Dec 2024 01:38:25 +0100 Subject: [PATCH] added libraries --- Crafter.Build-Configuration.cpp | 2 +- Crafter.Build-Configuration.cppm | 4 ++- Crafter.Build-Project.cpp | 46 +++++++++++++++++++++++++++----- README.md | 2 +- main.cpp | 2 +- project.json | 2 +- 6 files changed, 46 insertions(+), 12 deletions(-) diff --git a/Crafter.Build-Configuration.cpp b/Crafter.Build-Configuration.cpp index 4d2192b..06e6914 100644 --- a/Crafter.Build-Configuration.cpp +++ b/Crafter.Build-Configuration.cpp @@ -27,6 +27,6 @@ module Crafter.Build:ConfigurationImpl; import :Configuration; using namespace Crafter::Build; -Configuration::Configuration(std::string name, std::string standard, std::vector sourceFiles, std::vector moduleFiles, std::string optimizationLevel, std::string buildDir, std::string outputDir): name(name), standard(standard), sourceFiles(sourceFiles), moduleFiles(moduleFiles), optimizationLevel(optimizationLevel), buildDir(buildDir), outputDir(outputDir){ +Configuration::Configuration(std::string name, std::string standard, std::vector sourceFiles, std::vector moduleFiles, std::string optimizationLevel, std::string buildDir, std::string outputDir, std::string type, std::string target): name(name), standard(standard), sourceFiles(sourceFiles), moduleFiles(moduleFiles), optimizationLevel(optimizationLevel), buildDir(buildDir), outputDir(outputDir), type(type), target(target){ } diff --git a/Crafter.Build-Configuration.cppm b/Crafter.Build-Configuration.cppm index 2ab326e..3e57f17 100644 --- a/Crafter.Build-Configuration.cppm +++ b/Crafter.Build-Configuration.cppm @@ -34,6 +34,8 @@ export namespace Crafter::Build { std::string optimizationLevel; std::string buildDir; std::string outputDir; - Configuration(std::string name, std::string standard, std::vector sourceFiles, std::vector moduleFiles, std::string optimizationLevel, std::string buildDir, std::string outputDir); + std::string type; + std::string target; + Configuration(std::string name, std::string standard, std::vector sourceFiles, std::vector moduleFiles, std::string optimizationLevel, std::string buildDir, std::string outputDir, std::string type, std::string target); }; } diff --git a/Crafter.Build-Project.cpp b/Crafter.Build-Project.cpp index b01a6ef..496b498 100644 --- a/Crafter.Build-Project.cpp +++ b/Crafter.Build-Project.cpp @@ -42,6 +42,8 @@ struct ConfigData { std::string optimizationLevel; std::string buildDir; std::string outputDir; + std::string type; + std::string target; }; ConfigData CollapseConfig(nlohmann::json& configs,nlohmann::json& config) { @@ -49,6 +51,12 @@ ConfigData CollapseConfig(nlohmann::json& configs,nlohmann::json& config) { if(config.contains("standard")) { data.standard = config["standard"].get(); } + if(config.contains("target")) { + data.target = config["target"].get(); + } + if(config.contains("type")) { + data.type = config["type"].get(); + } if(config.contains("source_files")) { data.sourceFiles = config["source_files"].get>(); } @@ -88,6 +96,12 @@ ConfigData CollapseConfig(nlohmann::json& configs,nlohmann::json& config) { if(!extendData.outputDir.empty() && data.outputDir.empty()) { data.outputDir = extendData.outputDir; } + if(!extendData.target.empty() && data.target.empty()) { + data.target = extendData.target; + } + if(!extendData.type.empty() && data.type.empty()) { + data.type = extendData.type; + } break; } } @@ -135,27 +149,45 @@ void Project::Build(Configuration config, std::string outputDir) { std::filesystem::remove_all(entry.path()); } } + + std::string target; + if(!config.target.empty()){ + target = std::format("-target {}", config.target); + } + std::string pcmDir; + if(config.type == "library" || config.type == "shared-library"){ + pcmDir = outputDir; + }else{ + pcmDir = config.buildDir; + } + for(const std::string& moduleFile : config.moduleFiles){ - system(std::format("clang++ -std={} {}.cppm --precompile -fprebuilt-module-path={} -o {}/{}.pcm", config.standard, moduleFile, config.buildDir, config.buildDir, moduleFile).c_str()); + system(std::format("clang++ -std={} {}.cppm --precompile -fprebuilt-module-path={} -o {}/{}.pcm", config.standard, moduleFile, pcmDir, pcmDir, moduleFile).c_str()); } std::vector threads = std::vector(config.moduleFiles.size() + config.sourceFiles.size()); std::string files; for(std::int_fast32_t i = 0; i < config.moduleFiles.size(); i++) { files+=std::format("{}/{}.o ",config.buildDir, config.moduleFiles[i]); - threads[i] = std::thread([i, config](){ - system(std::format("clang++ -std={} {}/{}.pcm -fprebuilt-module-path={} -c -O{} -o {}/{}.o", config.standard, config.buildDir, config.moduleFiles[i], config.buildDir, config.optimizationLevel, config.buildDir, config.moduleFiles[i]).c_str()); + threads[i] = std::thread([i, config, pcmDir, target](){ + system(std::format("clang++ -std={} {}/{}.pcm -fprebuilt-module-path={} -c -O{} -o {}/{}.o {}", config.standard, pcmDir, config.moduleFiles[i], pcmDir, config.optimizationLevel, config.buildDir, config.moduleFiles[i], target).c_str()); }); } for(std::int_fast32_t i = 0; i < config.sourceFiles.size(); i++) { files+=std::format("{}/{}_source.o ",config.buildDir, config.sourceFiles[i]); - threads[config.moduleFiles.size()+i] = std::thread([i, config](){ - system(std::format("clang++ -std={} {}.cpp -fprebuilt-module-path={} -c -O{} -o {}/{}_source.o", config.standard, config.sourceFiles[i], config.buildDir, config.optimizationLevel, config.buildDir, config.sourceFiles[i]).c_str()); + threads[config.moduleFiles.size()+i] = std::thread([i, config, pcmDir, target](){ + system(std::format("clang++ -std={} {}.cpp -fprebuilt-module-path={} -c -O{} -o {}/{}_source.o {}", config.standard, config.sourceFiles[i], pcmDir, config.optimizationLevel, config.buildDir, config.sourceFiles[i], target).c_str()); }); } for(std::thread& thread : threads){ thread.join(); } - system(std::format("clang++ {}-O{} -o {}/{}", files, config.optimizationLevel, outputDir, name).c_str()); + if(config.type == "executable"){ + system(std::format("clang++ {}-O{} -o {}/{} {}", files, config.optimizationLevel, outputDir, name, target).c_str()); + } else if(config.type == "library"){ + system(std::format("ar r {}/{}.a {}", outputDir, name, files, target).c_str()); + } else if(config.type == "shared-library"){ + system(std::format("ar r {}/{}.so {} -shared", outputDir, name, files, target).c_str()); + } } @@ -170,7 +202,7 @@ Project Project::LoadFromJSON(std::string file) { nlohmann::json configs = data["configurations"]; for (nlohmann::json::iterator it = configs.begin(); it != configs.end(); ++it) { ConfigData configData = CollapseConfig(configs, (*it)); - configurations.emplace_back((*it)["name"].get(), configData.standard, configData.sourceFiles, configData.moduleFiles, configData.optimizationLevel, configData.buildDir, configData.outputDir); + configurations.emplace_back((*it)["name"].get(), configData.standard, configData.sourceFiles, configData.moduleFiles, configData.optimizationLevel, configData.buildDir, configData.outputDir,configData.type, configData.target); } return Project(name,configurations); } diff --git a/README.md b/README.md index fc8563c..faa27ed 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ int main() { std::println("Hello World!"); } ``` -Save and close, then run ``crafter-build debug``. Now you can run the ``hello-world`` executable that has appeared in the ``bin`` folder +Save and close, then run ``crafter-build -c debug``. Now you can run the ``hello-world`` executable that has appeared in the ``bin`` folder ## CLI arguments diff --git a/main.cpp b/main.cpp index dd7090a..22e8040 100644 --- a/main.cpp +++ b/main.cpp @@ -9,7 +9,7 @@ version 2.1 of the License, or (at your option) any later version. 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 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public diff --git a/project.json b/project.json index c136bf6..ea52250 100644 --- a/project.json +++ b/project.json @@ -17,7 +17,7 @@ { "name": "lib", "extends": ["base"], - "type":"lib" + "type":"library" }, { "name": "debug",