import std; import Crafter.Build; namespace fs = std::filesystem; using namespace Crafter; extern "C" Configuration CrafterBuildProject(std::span args) { constexpr std::array networkInterfaces = { "interfaces/Crafter.Network", "interfaces/Crafter.Network-ClientTCP", "interfaces/Crafter.Network-ListenerTCP", "interfaces/Crafter.Network-ClientHTTP", "interfaces/Crafter.Network-ListenerHTTP", "interfaces/Crafter.Network-HTTP", "interfaces/Crafter.Network-HTTP3", "interfaces/Crafter.Network-ClientQUIC", "interfaces/Crafter.Network-ListenerQUIC", }; constexpr std::array networkImplementations = { "implementations/Crafter.Network-ClientTCP", "implementations/Crafter.Network-ListenerTCP", "implementations/Crafter.Network-ClientHTTP", "implementations/Crafter.Network-ListenerHTTP", "implementations/Crafter.Network-ClientQUIC", "implementations/Crafter.Network-ListenerQUIC", }; std::vector depArgs(args.begin(), args.end()); Configuration* thread = GitProject({ .source = { .url = "https://forgejo.catcrafts.net/Catcrafts/Crafter.Thread.git" }, .args = depArgs, }); Configuration cfg; cfg.path = "./"; cfg.name = "crafter-network"; cfg.outputName = "crafter-network"; cfg.type = ConfigurationType::LibraryStatic; ApplyStandardArgs(cfg, args); cfg.dependencies = { thread }; // msquic — provides the QUIC transport used by ClientQUIC / ListenerQUIC. // Cloned + built via CMake into the per-project external cache; no system // package required. Submodules (quictls / clog / etc.) come via the // recursive clone Crafter.Build performs. We disable msquic's own tests, // tools and perf binaries since we only need the library. ExternalDependency& msquic = cfg.externalDependencies.emplace_back(); msquic.name = "msquic"; msquic.source.url = "https://github.com/microsoft/msquic.git"; msquic.source.branch = "main"; msquic.builder = ExternalBuilder::CMake; msquic.options = { "-DQUIC_TLS_LIB=quictls", "-DQUIC_BUILD_TEST=OFF", "-DQUIC_BUILD_TOOLS=OFF", "-DQUIC_BUILD_PERF=OFF", "-DQUIC_BUILD_SHARED=ON", }; msquic.includeDirs = { "src/inc" }; // msquic's CMakeLists overrides CMAKE_LIBRARY_OUTPUT_DIRECTORY with // QUIC_OUTPUT_DIR (defaults to bin/$), so libmsquic.so lands in // a subdir of the cmake build dir rather than at its root. Point the // linker at the actual output location. msquic.libDirs = { "bin/Release" }; msquic.libs = { "msquic" }; std::array ifaces; std::ranges::copy(networkInterfaces, ifaces.begin()); std::array impls; std::ranges::copy(networkImplementations, impls.begin()); cfg.GetInterfacesAndImplementations(ifaces, impls); return cfg; }