From d98738fe689fa363996a2a303905d29c6a4ba83d Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Mon, 2 Mar 2026 17:29:03 +0100 Subject: [PATCH] BLAZINGLY FAST BUILD --- build.ps1 | 110 +++++++++------------- implementations/Crafter.Build-Module.cpp | 42 ++++++--- implementations/Crafter.Build-Project.cpp | 64 +------------ interfaces/Crafter.Build-Module.cppm | 2 + 4 files changed, 80 insertions(+), 138 deletions(-) diff --git a/build.ps1 b/build.ps1 index 2b1fc2c..cc12bc7 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,77 +1,59 @@ mkdir build mkdir bin -mkdir bin/executable +mkdir bin\executable-windows-msvc -# Get the path of Visual Studio Installer -$vsPath = & "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -property installationPath +git clone https:\\github.com\KhronosGroup\glslang.git .\build\glslang -# Set the directory path for MSVC tools -$directoryPath = Join-Path -Path $vsPath -ChildPath "VC\Tools\MSVC" +cd .\build\glslang -$directoryPath2 = Join-Path -Path $vsPath -ChildPath "VC\Redist\MSVC" +$buildDir = "$($PWD.Path)\build" +cmake -B build ` + -DCMAKE_C_COMPILER=clang ` + -DCMAKE_CXX_COMPILER=clang++ ` + -DCMAKE_CXX_FLAGS="-stdlib=libc++" ` + -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" ` + -DCMAKE_SHARED_LINKER_FLAGS="-stdlib=libc++" ` + -DCMAKE_BUILD_TYPE=Release ` + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY="$buildDir" ` + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY="$buildDir" ` + -DENABLE_OPT=OFF -# Get all folders (assumes version format like 14.50.35717) -$folders = Get-ChildItem -Path $directoryPath -Directory +cmake --build build --config Release +cd ..\..\ -# Sort the folders by version and select the latest one -$latestVersionFolder = $folders | Sort-Object { [Version]$_.Name } -Descending | Select-Object -First 1 +$common_options = @( + "-stdlib=libc++" + "-I.\build" + "-std=c++26" + "-O3" + "-march=native" + "-mtune=native" + "-fprebuilt-module-path=.\build" + "-DCRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu" + "-DCRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE" + "-c" +) +clang++ -std=c++26 -stdlib=libc++ -Wno-reserved-identifier -Wno-reserved-module-identifier --precompile \usr\share\libc++\v1\std.cppm -o .\build\std.pcm -# Store the latest version folder name -$msvcVersion = $latestVersionFolder.Name +clang++ @common_options -fmodule-output interfaces\Crafter.Build-CompileStatus.cppm -o .\build\Crafter.Build-CompileStatus.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build-Command.cppm -o .\build\Crafter.Build-Command.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build-Shader.cppm -o .\build\Crafter.Build-Shader.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build-Module.cppm -o .\build\Crafter.Build-Module.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build-Implementation.cppm -o .\build\Crafter.Build-Implementation.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build-Configuration.cppm -o .\build\Crafter.Build-Configuration.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build-Test.cppm -o .\build\Crafter.Build-Test.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build-Project.cppm -o .\build\Crafter.Build-Project.o +clang++ @common_options -fmodule-output interfaces\Crafter.Build.cppm -o .\build\Crafter.Build.o -# Copy std.ixx to the build directory -$sourceFilePath = Join-Path -Path $directoryPath -ChildPath "$msvcVersion\modules\std.ixx" -$destinationFilePath = ".\build\std.cppm" -Copy-Item -Path $sourceFilePath -Destination $destinationFilePath +clang++ @common_options .\implementations\Crafter.Build-Command.cpp -o .\build\Crafter.Build-Command_impl.o +clang++ @common_options .\implementations\Crafter.Build-Test.cpp -o .\build\Crafter.Build-Test_impl.o +clang++ @common_options .\implementations\Crafter.Build-Implementation.cpp -o .\build\Crafter.Build-Implementation_impl.o +clang++ @common_options .\implementations\Crafter.Build-Shader.cpp -o .\build\Crafter.Build-Shader_impl.o +clang++ @common_options .\implementations\Crafter.Build-Module.cpp -o .\build\Crafter.Build-Module_impl.o +clang++ @common_options .\implementations\Crafter.Build-Configuration.cpp -o .\build\Crafter.Build-Configuration_impl.o +clang++ @common_options .\implementations\Crafter.Build-Project.cpp -o .\build\Crafter.Build -$msvcRtPath = Join-Path -Path $directoryPath2 -ChildPath "$msvcVersion\x64\Microsoft.VC145.CRT" - -$vulkanBasePath = "C:\VulkanSDK" - -# Get all folders (assumes version format like 14.50.35717) -$folders = Get-ChildItem -Path $vulkanBasePath -Directory - -# Sort the folders by version and select the latest one -$latestVulkanVersion = $folders | Sort-Object { [Version]$_.Name } -Descending | Select-Object -First 1 - -# Store the latest version folder name and combine it with the base path to get the full path to Include -$vulkanSDKPath = Join-Path -Path $vulkanBasePath -ChildPath (Join-Path -Path $latestVulkanVersion.Name -ChildPath "Include") -$vulkanSDKPathLib = Join-Path -Path $vulkanBasePath -ChildPath (Join-Path -Path $latestVulkanVersion.Name -ChildPath "Lib") - -cd build -cl /std:c++latest /EHsc /nologo /W4 /MD /c "$sourceFilePath" -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -Wno-include-angled-in-module-purview -Wno-reserved-identifier -Wno-reserved-module-identifier --precompile .\std.cppm -o .\std.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-CompileStatus.cppm -o Crafter.Build-CompileStatus.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-Command.cppm -o Crafter.Build-Command.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-Shader.cppm -o Crafter.Build-Shader.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-Module.cppm -o Crafter.Build-Module.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-Implementation.cppm -o Crafter.Build-Implementation.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-Configuration.cppm -o Crafter.Build-Configuration.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-Test.cppm -o Crafter.Build-Test.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build-Project.cppm -o Crafter.Build-Project.pcm -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -I"$vulkanSDKPath" --precompile -fprebuilt-module-path=".\" ..\interfaces\Crafter.Build.cppm -o Crafter.Build.pcm -cd .. - -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-Command.pcm -o .\build\Crafter.Build-Command.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-Shader.pcm -o .\build\Crafter.Build-Shader.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-Module.pcm -o .\build\Crafter.Build-Module.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-Implementation.pcm -o .\build\Crafter.Build-Implementation.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-Configuration.pcm -o .\build\Crafter.Build-Configuration.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-Project.pcm -o .\build\Crafter.Build-Project.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-Test.pcm -o .\build\Crafter.Build-Test.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build-CompileStatus.pcm -o .\build\Crafter.Build-CompileStatus.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD -march=native -mtune=native /Ot -fprebuilt-module-path=".\build" -c .\build\Crafter.Build.pcm -o .\build\Crafter.Build.obj - -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\Crafter.Build-Command.cpp -o .\build\Crafter.Build-Command_impl.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\Crafter.Build-Test.cpp -o .\build\Crafter.Build-Test_impl.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\Crafter.Build-Implementation.cpp -o .\build\Crafter.Build-Implementation_impl.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\Crafter.Build-Shader.cpp -o .\build\Crafter.Build-Shader_impl.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\Crafter.Build-Module.cpp -o .\build\Crafter.Build-Module_impl.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\Crafter.Build-Configuration.cpp -o .\build\Crafter.Build-Configuration_impl.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\Crafter.Build-Project.cpp -o .\build\Crafter.Build-Project_impl.obj -clang-cl --target=x86_64-pc-windows-msvc /std:c++latest /EHsc /MD /D CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE -march=native -mtune=native -I"$vulkanSDKPath" /Ot -fprebuilt-module-path=".\build" -c .\implementations\main.cpp -o .\build\main.obj - -link /LIBPATH:"$vulkanSDKPathLib" msvcrt.lib kernel32.lib user32.lib SPIRV-Tools.lib SPIRV-Tools-opt.lib vulkan-1.lib MachineIndependent.lib OSDependent.lib GenericCodeGen.lib glslang.lib glslang-default-resource-limits.lib SPIRV.lib .\build\Crafter.Build-Command.obj .\build\Crafter.Build-CompileStatus.obj .\build\Crafter.Build-Shader.obj .\build\Crafter.Build-Module.obj .\build\Crafter.Build-Configuration.obj .\build\Crafter.Build-Project.obj .\build\Crafter.Build.obj .\build\Crafter.Build-Command_impl.obj .\build\Crafter.Build-Shader_impl.obj .\build\Crafter.Build-Module_impl.obj .\build\Crafter.Build-Configuration_impl.obj .\build\Crafter.Build-Project_impl.obj .\build\Crafter.Build-Implementation.obj .\build\Crafter.Build-Implementation_impl.obj .\build\Crafter.Build-Test_impl.obj .\build\Crafter.Build-Test.obj .\build\main.obj .\build\std.obj /OUT:.\bin\executable\Crafter-build.exe +clang++ -std=c++26 -stdlib=libc++ -O3 -march=native -mtune=native -L.\build -fuse-ld=lld -lSPIRV -GenericCodeGen -lglslang -lOSDependent -lMachineIndependent -lglslang-default-resource-limits .\build\Crafter.Build-Command.o .\build\Crafter.Build-CompileStatus.o .\build\Crafter.Build-Shader.o .\build\Crafter.Build-Module.o .\build\Crafter.Build-Configuration.o .\build\Crafter.Build-Project.o .\build\Crafter.Build.o .\build\Crafter.Build-Command_impl.o .\build\Crafter.Build-Shader_impl.o .\build\Crafter.Build-Module_impl.o .\build\Crafter.Build-Configuration_impl.o .\build\Crafter.Build-Project_impl.o .\build\Crafter.Build-Implementation.o .\build\Crafter.Build-Implementation_impl.o .\build\Crafter.Build-Test_impl.o .\build\Crafter.Build-Test.o .\build\main.o -o .\bin\executable-linux-gnu\crafter-build Copy-Item -Path "binlib\*" -Destination "bin\" -Recurse Remove-Item -Path "build" -Recurse -Force \ No newline at end of file diff --git a/implementations/Crafter.Build-Module.cpp b/implementations/Crafter.Build-Module.cpp index a227fae..53bbcb5 100644 --- a/implementations/Crafter.Build-Module.cpp +++ b/implementations/Crafter.Build-Module.cpp @@ -67,14 +67,7 @@ namespace Crafter { } } - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu result += RunClang(std::format("{} {}.cppm --precompile -o {}.pcm", clang, path.string(), (pcmDir/path.filename()).string())); - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - result += RunClang(std::format("cd {} && {} {}.cppm --precompile -o {}.pcm", pcmDir.string(), clang, path.string(), path.filename().string())); - #endif - - result += RunClang(std::format("{} -Wno-unused-command-line-argument {}.pcm -c -o {}.o", clang, (pcmDir/path.filename()).string(), (buildDir/path.filename()).string())); if(result.empty()) { compiled.store(CRAFTER_COMPILE_STATUS_COMPLETED); compiled.notify_all(); @@ -84,6 +77,13 @@ namespace Crafter { } } + void ModulePartition::CompileSource(const std::string_view clang, const fs::path& pcmDir, const fs::path& buildDir, std::string& result) { + this->compiled.wait(CRAFTER_COMPILE_STATUS_WAITING); + if(this->compiled.load() != CRAFTER_COMPILE_STATUS_ERROR) { + result += RunClang(std::format("{} -Wno-unused-command-line-argument {}.pcm -c -o {}.o", clang, (pcmDir/path.filename()).string(), (buildDir/path.filename()).string())); + } + } + Module::Module(std::string&& name, fs::path&& path, std::vector>&& partitions) : name(std::move(name)), path(std::move(path)), partitions(std::move(partitions)), compiled(CRAFTER_COMPILE_STATUS_WAITING), checked(false) {} Module::Module(std::string&& name, fs::path&& path) : name(std::move(name)), path(std::move(path)), compiled(CRAFTER_COMPILE_STATUS_WAITING), checked(false) {} @@ -151,13 +151,7 @@ namespace Crafter { } if(result.empty()) { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu result += RunClang(std::format("{} {}.cppm --precompile -o {}.pcm", clang, path.string(), (pcmDir/path.filename()).string())); - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - result += RunClang(std::format("cd {} && {} {}.cppm --precompile -o {}.pcm", pcmDir.string(), clang, path.string(), path.filename().string())); - #endif - result += RunClang(std::format("{} -Wno-unused-command-line-argument {}.pcm -c -o {}.o", clang, (pcmDir/path.filename()).string(), (buildDir/path.filename()).string())); if(result.empty()) { compiled.store(CRAFTER_COMPILE_STATUS_COMPLETED); compiled.notify_all(); @@ -170,4 +164,26 @@ namespace Crafter { compiled.notify_all(); } } + + void Module::CompileSource(const std::string_view clang, const fs::path& pcmDir, const fs::path& buildDir, std::string& result) { + this->compiled.wait(CRAFTER_COMPILE_STATUS_WAITING); + if(this->compiled.load() != CRAFTER_COMPILE_STATUS_ERROR) { + result += RunClang(std::format("{} -Wno-unused-command-line-argument {}.pcm -c -o {}.o", clang, (pcmDir/path.filename()).string(), (buildDir/path.filename()).string())); + std::vector threads; + std::vector results(partitions.size()); + for(std::uint_fast32_t i = 0; i < partitions.size(); i++) { + if( partitions[i]->needsRecompiling) { + threads.emplace_back(&ModulePartition::CompileSource, partitions[i].get(), clang, pcmDir, buildDir, std::ref(results[i])); + } + } + + for(std::thread& thread : threads){ + thread.join(); + } + + for(const std::string& result2 : results) { + result += result2; + } + } + } } diff --git a/implementations/Crafter.Build-Project.cpp b/implementations/Crafter.Build-Project.cpp index 7b28cb8..f639de8 100644 --- a/implementations/Crafter.Build-Project.cpp +++ b/implementations/Crafter.Build-Project.cpp @@ -245,32 +245,18 @@ namespace Crafter { std::string editedTarget = config.target; std::replace(editedTarget.begin(), editedTarget.end(), '-', '_'); - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu std::string command = std::format("clang++ -stdlib=libc++ --target={} -march={} -mtune={} -std={} -D CRAFTER_BUILD_CONFIGURATION_TARGET_{} -fprebuilt-module-path={} -I{} -I{}", config.target, config.march, config.march, config.standard, editedTarget, (exeDir/config.target).string(), buildDir.string(), (exeDir/"cloneCache").string()); - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - std::string command = std::format("clang-cl.exe /EHsc --target={} -march={} -mtune={} /std:{} /D CRAFTER_BUILD_CONFIGURATION_TARGET_{} -fprebuilt-module-path={} -Wno-unused-command-line-argument", config.target, config.march, config.march, config.standard, editedTarget, (exeDir/config.target).string()); - #endif if(config.target == "wasm32-wasi") { command += std::format(" --sysroot={} -fno-exceptions -fno-c++-static-destructors", (exeDir/"wasi-sysroot-28.0").string()); } for(const Define& define : config.defines) { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu if(define.value.empty()) { command += std::format(" -D {}", define.name); } else { command += std::format(" -D {}={}", define.name, define.value); } - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - if(define.value.empty()) { - command += std::format(" /D {}", define.name); - } else { - command += std::format(" /D {}={}", define.name, define.value); - } - #endif } fs::path pcmDir; @@ -280,24 +266,14 @@ namespace Crafter { command += " -fPIC -D CRAFTER_BUILD_CONFIGURATION_TYPE_SHARED_LIBRARY"; #endif #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - command += " /D CRAFTER_BUILD_CONFIGURATION_TYPE_SHARED_LIBRARY"; + command += " -D CRAFTER_BUILD_CONFIGURATION_TYPE_SHARED_LIBRARY"; #endif pcmDir = binDir; } else if(config.type == CRAFTER_CONFIGURATION_TYPE_LIBRARY) { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu command += " -D CRAFTER_BUILD_CONFIGURATION_TYPE_LIBRARY"; - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - command += " /D CRAFTER_BUILD_CONFIGURATION_TYPE_LIBRARY"; - #endif pcmDir = binDir; } else { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu command += " -D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE"; - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - command += " /D CRAFTER_BUILD_CONFIGURATION_TYPE_EXECUTABLE"; - #endif pcmDir = buildDir; } @@ -307,20 +283,10 @@ namespace Crafter { if(config.debug) { cmakeBuildType = "Debug"; - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu command += " -g -D CRAFTER_BUILD_CONFIGURATION_DEBUG"; - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - command += " -g /MDd /D CRAFTER_BUILD_CONFIGURATION_DEBUG"; - #endif } else { cmakeBuildType = "Release"; - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu command += " -O3"; - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - command += " /Ot"; - #endif } for(const std::string& dir : config.includeDirs) { @@ -380,12 +346,7 @@ namespace Crafter { for(const fs::path& cFile: config.c_files) { files+=std::format(" {}_source.o ",(buildDir/cFile.filename()).string()); if(!fs::exists((buildDir/cFile.filename()).string()+"_source.o") || fs::last_write_time(cFile.string()+".c") > fs::last_write_time((buildDir/cFile.filename()).string()+"_source.o")) { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu threads.emplace_back(&RunClang, std::format("clang {}.c -c -o {}_source.o", cFile.string(), (buildDir/cFile.filename()).string())); - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - threads.emplace_back(&RunClang, std::format("{} {}.c -c -o {}_source.o", command, cFile.string(), (buildDir/cFile.filename()).string())); - #endif } } @@ -396,11 +357,12 @@ namespace Crafter { } } - std::vector resultInterfaces(config.interfaces.size()); + std::vector resultInterfaces(config.interfaces.size()*2); for(uint_fast32_t i = 0; i < config.interfaces.size(); i++) { if(config.interfaces[i]->Check(pcmDir)) { threads.emplace_back(&Module::Compile, config.interfaces[i].get(), command, pcmDir, buildDir, std::ref(resultInterfaces[i])); + threads.emplace_back(&Module::CompileSource, config.interfaces[i].get(), command, pcmDir, buildDir, std::ref(resultInterfaces[config.interfaces.size()+i])); buildResult.repack = true; } files += std::format(" {}/{}.o", buildDir.string(), config.interfaces[i]->path.filename().string()); @@ -441,15 +403,9 @@ namespace Crafter { command += std::format(" -L{}", buildDir.string()); if(config.type != CRAFTER_CONFIGURATION_TYPE_LIBRARY) { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu command += libsString; - #endif - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - files += libsString; - #endif } - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu for(const std::string& lib : config.libs) { depLibSet.insert(lib); command += std::format(" -l{}", lib); @@ -458,7 +414,6 @@ namespace Crafter { for(const std::string& dir : config.libDirs) { command += std::format(" -L{}", dir); } - #endif fileThread.join(); @@ -468,21 +423,10 @@ namespace Crafter { if(buildResult.repack) { if(config.type == CRAFTER_CONFIGURATION_TYPE_EXECUTABLE) { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu if(config.target == "wasm32-wasi") { outputName += ".wasm"; } buildResult.errors = RunClang(std::format("{}{} -o {} -fuse-ld=lld ", command, files, (binDir/outputName).string())); - #endif - - #if defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_windows_msvc) || defined(CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_w64_mingw32) - std::string libPath = ""; - for(const std::string_view lib : config.libDirs) { - libPath += std::format(" /LIBPATH:{}", lib); - } - - buildResult.errors = RunClang(std::format("{} && link.exe /NODEFAULTLIB:libcmt.lib {} {} {}\\{}\\std.obj msvcrt.lib kernel32.lib user32.lib /OUT:{}.exe", vsVars, libPath, files, exeDir.string(), config.target, (binDir/outputName).string())); - #endif } else if(config.type == CRAFTER_CONFIGURATION_TYPE_LIBRARY) { #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu RunClang(std::format("ar r {}.a {}", (binDir/fs::path(std::string("lib")+outputName)).string(), files)); @@ -492,9 +436,7 @@ namespace Crafter { RunClang(std::format("{} && lib.exe {} /OUT:{}.lib", vsVars, files, (binDir/fs::path(outputName)).string())); #endif } else { - #ifdef CRAFTER_BUILD_CONFIGURATION_TARGET_x86_64_pc_linux_gnu buildResult.errors = RunClang(std::format("{}{} -shared -o {}.so -Wl,-rpath,'$ORIGIN' -fuse-ld=lld", command, files, (binDir/(std::string("lib")+outputName)).string())); - #endif } } diff --git a/interfaces/Crafter.Build-Module.cppm b/interfaces/Crafter.Build-Module.cppm index a6648f9..f5f2331 100644 --- a/interfaces/Crafter.Build-Module.cppm +++ b/interfaces/Crafter.Build-Module.cppm @@ -36,6 +36,7 @@ namespace Crafter { ModulePartition(std::string&& name, fs::path&& path); bool Check(const fs::path& pcmDir); void Compile(const std::string_view clang, const fs::path& pcmDir, const fs::path& buildDir, std::string& result); + void CompileSource(const std::string_view clang, const fs::path& pcmDir, const fs::path& buildDir, std::string& result); }; export class Module { @@ -51,5 +52,6 @@ namespace Crafter { Module(std::string&& name, fs::path&& path, std::vector>&& partitions); bool Check(const fs::path& pcmDir); void Compile(const std::string_view clang, const fs::path& pcmDir, const fs::path& buildDir, std::string& result); + void CompileSource(const std::string_view clang, const fs::path& pcmDir, const fs::path& buildDir, std::string& result); }; }