import std; import Crafter.Build; namespace fs = std::filesystem; using namespace Crafter; namespace { std::unique_ptr MakeLib(std::string_view dir, std::string_view modName, std::string_view target, std::span deps) { auto lib = std::make_unique(); lib->path = std::format("tests/Diamond/{}/", dir); lib->name = std::format("{}-Diamond-{}", modName, target); lib->outputName = std::string(modName); lib->target = std::string(target); lib->type = ConfigurationType::LibraryStatic; lib->dependencies.assign(deps.begin(), deps.end()); std::array ifaces = { fs::path(modName) }; std::array impls = {}; lib->GetInterfacesAndImplementations(ifaces, impls); return lib; } } extern "C" Configuration CrafterBuildProject(std::span args) { std::string target = "x86_64-pc-linux-gnu"; for (auto a : args) { if (a.starts_with("--target=")) target = std::string(a.substr(9)); } static std::unique_ptr X, B, C; X = MakeLib("X", "X", target, {}); Configuration* xDeps[] = { X.get() }; B = MakeLib("B", "B", target, xDeps); C = MakeLib("C", "C", target, xDeps); Configuration* mainDeps[] = { B.get(), C.get() }; Configuration cfg; cfg.path = "tests/Diamond/"; cfg.name = "Diamond"; cfg.outputName = "diamond-app"; cfg.target = target; cfg.type = ConfigurationType::Executable; cfg.dependencies.assign(mainDeps, mainDeps + 2); std::array ifaces = {}; std::array impls = { "main" }; cfg.GetInterfacesAndImplementations(ifaces, impls); return cfg; }