added libraries

This commit is contained in:
Jorijn van der Graaf 2024-12-29 01:38:25 +01:00
commit be39501c5b
6 changed files with 46 additions and 12 deletions

View file

@ -27,6 +27,6 @@ module Crafter.Build:ConfigurationImpl;
import :Configuration; import :Configuration;
using namespace Crafter::Build; using namespace Crafter::Build;
Configuration::Configuration(std::string name, std::string standard, std::vector<std::string> sourceFiles, std::vector<std::string> 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<std::string> sourceFiles, std::vector<std::string> 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){
} }

View file

@ -34,6 +34,8 @@ export namespace Crafter::Build {
std::string optimizationLevel; std::string optimizationLevel;
std::string buildDir; std::string buildDir;
std::string outputDir; std::string outputDir;
Configuration(std::string name, std::string standard, std::vector<std::string> sourceFiles, std::vector<std::string> 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<std::string> sourceFiles, std::vector<std::string> moduleFiles, std::string optimizationLevel, std::string buildDir, std::string outputDir, std::string type, std::string target);
}; };
} }

View file

@ -42,6 +42,8 @@ struct ConfigData {
std::string optimizationLevel; std::string optimizationLevel;
std::string buildDir; std::string buildDir;
std::string outputDir; std::string outputDir;
std::string type;
std::string target;
}; };
ConfigData CollapseConfig(nlohmann::json& configs,nlohmann::json& config) { ConfigData CollapseConfig(nlohmann::json& configs,nlohmann::json& config) {
@ -49,6 +51,12 @@ ConfigData CollapseConfig(nlohmann::json& configs,nlohmann::json& config) {
if(config.contains("standard")) { if(config.contains("standard")) {
data.standard = config["standard"].get<std::string>(); data.standard = config["standard"].get<std::string>();
} }
if(config.contains("target")) {
data.target = config["target"].get<std::string>();
}
if(config.contains("type")) {
data.type = config["type"].get<std::string>();
}
if(config.contains("source_files")) { if(config.contains("source_files")) {
data.sourceFiles = config["source_files"].get<std::vector<std::string>>(); data.sourceFiles = config["source_files"].get<std::vector<std::string>>();
} }
@ -88,6 +96,12 @@ ConfigData CollapseConfig(nlohmann::json& configs,nlohmann::json& config) {
if(!extendData.outputDir.empty() && data.outputDir.empty()) { if(!extendData.outputDir.empty() && data.outputDir.empty()) {
data.outputDir = extendData.outputDir; 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; break;
} }
} }
@ -135,27 +149,45 @@ void Project::Build(Configuration config, std::string outputDir) {
std::filesystem::remove_all(entry.path()); 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){ 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<std::thread> threads = std::vector<std::thread>(config.moduleFiles.size() + config.sourceFiles.size()); std::vector<std::thread> threads = std::vector<std::thread>(config.moduleFiles.size() + config.sourceFiles.size());
std::string files; std::string files;
for(std::int_fast32_t i = 0; i < config.moduleFiles.size(); i++) { for(std::int_fast32_t i = 0; i < config.moduleFiles.size(); i++) {
files+=std::format("{}/{}.o ",config.buildDir, config.moduleFiles[i]); files+=std::format("{}/{}.o ",config.buildDir, config.moduleFiles[i]);
threads[i] = std::thread([i, config](){ threads[i] = std::thread([i, config, pcmDir, target](){
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()); 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++) { for(std::int_fast32_t i = 0; i < config.sourceFiles.size(); i++) {
files+=std::format("{}/{}_source.o ",config.buildDir, config.sourceFiles[i]); files+=std::format("{}/{}_source.o ",config.buildDir, config.sourceFiles[i]);
threads[config.moduleFiles.size()+i] = std::thread([i, config](){ 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], config.buildDir, config.optimizationLevel, config.buildDir, config.sourceFiles[i]).c_str()); 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){ for(std::thread& thread : threads){
thread.join(); 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"]; nlohmann::json configs = data["configurations"];
for (nlohmann::json::iterator it = configs.begin(); it != configs.end(); ++it) { for (nlohmann::json::iterator it = configs.begin(); it != configs.end(); ++it) {
ConfigData configData = CollapseConfig(configs, (*it)); ConfigData configData = CollapseConfig(configs, (*it));
configurations.emplace_back((*it)["name"].get<std::string>(), configData.standard, configData.sourceFiles, configData.moduleFiles, configData.optimizationLevel, configData.buildDir, configData.outputDir); configurations.emplace_back((*it)["name"].get<std::string>(), configData.standard, configData.sourceFiles, configData.moduleFiles, configData.optimizationLevel, configData.buildDir, configData.outputDir,configData.type, configData.target);
} }
return Project(name,configurations); return Project(name,configurations);
} }

View file

@ -55,7 +55,7 @@ int main() {
std::println("Hello World!"); 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 ## CLI arguments

View file

@ -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, This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of 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. Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public You should have received a copy of the GNU Lesser General Public

View file

@ -17,7 +17,7 @@
{ {
"name": "lib", "name": "lib",
"extends": ["base"], "extends": ["base"],
"type":"lib" "type":"library"
}, },
{ {
"name": "debug", "name": "debug",