diff --git a/Crafter.Build-Configuration.cpp b/Crafter.Build-Configuration.cpp index 5797529..2fd8e51 100644 --- a/Crafter.Build-Configuration.cpp +++ b/Crafter.Build-Configuration.cpp @@ -24,7 +24,7 @@ module Crafter.Build; using namespace Crafter::Build; namespace fs = std::filesystem; -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, std::vector dependencies): name(name), standard(standard), sourceFiles(sourceFiles), moduleFiles(moduleFiles), optimizationLevel(optimizationLevel), buildDir(buildDir), outputDir(outputDir), type(type), target(target), dependencies(dependencies) { +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, std::vector dependencies, std::vector additionalFiles): name(name), standard(standard), sourceFiles(sourceFiles), moduleFiles(moduleFiles), optimizationLevel(optimizationLevel), buildDir(buildDir), outputDir(outputDir), type(type), target(target), dependencies(dependencies), additionalFiles(additionalFiles) { } @@ -54,6 +54,14 @@ Configuration::Configuration(const nlohmann::json& configs, const nlohmann::json const std::filesystem::path fullFilePath = workingDir / filePath; moduleFiles[i] = fullFilePath.generic_string(); } + } else if(key == "additional_files") { + const std::vector tempAdditionalFiles = val.get>(); + additionalFiles = std::vector(tempAdditionalFiles.size()); + for(std::int_fast32_t i = 0; i < additionalFiles.size(); i++){ + const std::filesystem::path filePath (tempAdditionalFiles[i]); + const std::filesystem::path fullFilePath = workingDir / filePath; + additionalFiles[i] = fullFilePath.generic_string(); + } } else if(key == "optimization_level") { optimizationLevel = val.get(); } else if(key == "build_dir") { @@ -89,6 +97,9 @@ Configuration::Configuration(const nlohmann::json& configs, const nlohmann::json if(!extendData.moduleFiles.empty()){ moduleFiles.insert(moduleFiles.end(), extendData.moduleFiles.begin(), extendData.moduleFiles.end()); } + if(!extendData.additionalFiles.empty()){ + additionalFiles.insert(additionalFiles.end(), extendData.additionalFiles.begin(), extendData.additionalFiles.end()); + } if(!extendData.optimizationLevel.empty() && optimizationLevel.empty()){ optimizationLevel = extendData.optimizationLevel; } diff --git a/Crafter.Build-Configuration.cppm b/Crafter.Build-Configuration.cppm index cfa5502..9d22644 100644 --- a/Crafter.Build-Configuration.cppm +++ b/Crafter.Build-Configuration.cppm @@ -35,6 +35,7 @@ export namespace Crafter::Build { std::string standard; std::vector sourceFiles; std::vector moduleFiles; + std::vector additionalFiles; std::string optimizationLevel; std::string buildDir; std::string outputDir; @@ -42,7 +43,7 @@ export namespace Crafter::Build { std::string target; std::vector dependencies; std::unordered_map additionalProperties; - 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, std::vector dependencies); + 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, std::vector dependencies, std::vector additionalFiles); Configuration(const nlohmann::json& configs, const nlohmann::json& config, fs::path workingDir); }; } diff --git a/Crafter.Build-Project.cpp b/Crafter.Build-Project.cpp index 93eb4ae..d6e68ec 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) const { for(const Configuration& config : configurations) { if(config.name == configuration){ - Build(config, config.outputDir); + Build(config); return; } } @@ -55,11 +55,25 @@ void Project::Build(std::string configuration, fs::path outputDir) const { throw std::runtime_error("Configuration: " + configuration + " not found."); } +void Project::Build(std::string configuration, fs::path outputDir, fs::path binDir) const { + for(const Configuration& config : configurations) { + if(config.name == configuration){ + Build(config, outputDir, binDir); + return; + } + } + throw std::runtime_error("Configuration: " + configuration + " not found."); +} + void Project::Build(Configuration configuration) const { Build(configuration, configuration.outputDir); } void Project::Build(Configuration config, fs::path outputDir) const { + Build(config, outputDir, outputDir); +} + +void Project::Build(Configuration config, fs::path outputDir, fs::path binDir) const { if (!fs::exists(config.buildDir)) { fs::create_directory(config.buildDir); } @@ -89,8 +103,8 @@ void Project::Build(Configuration config, fs::path outputDir) const { 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); + depThreads[i] = std::thread([i, pcmDir, config, project, binDir]() { + project.Build(config.dependencies[i].configuration, pcmDir, binDir); }); } @@ -98,11 +112,15 @@ void Project::Build(Configuration config, fs::path outputDir) const { 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"; - name+=".wasm"; + clangDir = "${WASI_SDK_PATH}/bin/clang++ --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot -Wno-unused-command-line-argument -Wl,--export-all -fno-exceptions"; + if(config.type != "library") { + name+=".wasm"; + } } else if(config.target == "wasm32" || config.target == "wasm64") { - clangDir = "${WASI_SDK_PATH}/bin/clang++ --no-standard-libraries -Wl,--no-entry -Wl,--export-all -Wno-unused-command-line-argument"; - name+=".wasm"; + clangDir = "${WASI_SDK_PATH}/bin/clang++ --no-standard-libraries -Wl,--no-entry -Wl,--export-all -Wno-unused-command-line-argument -fno-exceptions"; + if(config.type != "library") { + name+=".wasm"; + } } else { clangDir = "clang++ -Wno-unused-command-line-argument"; } @@ -145,6 +163,14 @@ void Project::Build(Configuration config, fs::path outputDir) const { system(std::format("ar r {}.so {} -shared", (outputDir/fs::path("lib"+name)).generic_string(), files).c_str()); } + for(const fs::path& additionalFile : config.additionalFiles){ + if(!fs::exists(binDir/additionalFile.filename())) { + fs::copy(additionalFile, binDir); + } else if (fs::last_write_time(additionalFile) > fs::last_write_time(binDir/additionalFile.filename())){ + fs::remove(binDir/additionalFile.filename()); + fs::copy(additionalFile, binDir); + } + } } Project Project::LoadFromJSON(fs::path path) { diff --git a/Crafter.Build-Project.cppm b/Crafter.Build-Project.cppm index 5609430..272ff53 100644 --- a/Crafter.Build-Project.cppm +++ b/Crafter.Build-Project.cppm @@ -35,8 +35,10 @@ export namespace Crafter::Build { Project(std::string name, fs::path path, std::vector configurations); void Build(std::string configuration) const; void Build(std::string configuration, fs::path outputDir) const; + void Build(std::string configuration, fs::path outputDir, fs::path binDir) const; void Build(Configuration configuration) const; void Build(Configuration configuration, fs::path outputDir) const; + void Build(Configuration configuration, fs::path outputDir, fs::path binDir) const; void SaveToJSON(fs::path path) const; static Project LoadFromJSON(fs::path path); }; diff --git a/README.md b/README.md index 3e187f8..dcfabb8 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,8 @@ Save and close, then run ``crafter-build -c debug``. Now you can run the ``hello ``module_files`` All C++ 20 module files of the project ``.cppm`` extension is assumed. +``additional_files`` Files that will be copied to the output_dir. + ``build_dir`` The directory where intermediate files are stored. ``output_dir`` The directory where the output files will be placed.