From 4b37f872e7219ae5f7fcbefccd8c681b79715af4 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Sun, 1 Nov 2026 18:12:45 +0100 Subject: [PATCH] fix(tooling): find the build helper's sources when loaded from git A consumer's `#pragma crafter dependency "https://.../Crafter.Debug.git" project "tooling/project.cpp"`, the line the README gives, failed at load: "No module declaration found in /interfaces/Crafter.Debug. Build.cppm". crafter-build runs a git source's project file from the root of the clone, and a local path's from the file's own directory, so tooling/project.cpp's "./" and relative sources named the repository root. Every test so far loaded it through a local path, where they happened to be right. It now spells its path and sources from its own file, which names tooling/ either way. The notes need nothing: crafter-build reads them beside the project file. Co-Authored-By: Claude Opus 5.5 --- tooling/project.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tooling/project.cpp b/tooling/project.cpp index 1314403..b4db367 100644 --- a/tooling/project.cpp +++ b/tooling/project.cpp @@ -17,14 +17,26 @@ import Crafter.Build; namespace fs = std::filesystem; using namespace Crafter; +namespace { + // This file's directory. crafter-build runs a pragma's project file from + // the root of the clone for a git source, and from the file's own + // directory for a local path, so "./" and relative sources named the + // repository root for every consumer using the URL: "No module + // declaration found in .../interfaces/Crafter.Debug.Build.cppm". Spelled + // from the file itself, they mean this directory in both cases. + fs::path Here() { + return fs::path(std::source_location::current().file_name()).parent_path(); + } +} + extern "C" Configuration CrafterBuildProject(std::span args) { Configuration cfg; - cfg.path = "./"; + cfg.path = Here(); cfg.name = "Crafter.Debug.Build"; cfg.outputName = "Crafter.Debug.Build"; cfg.type = ConfigurationType::LibraryStatic; ApplyStandardArgs(cfg, args); - std::array interfaces = { "interfaces/Crafter.Debug.Build" }; + std::array interfaces = { Here() / "interfaces" / "Crafter.Debug.Build" }; std::array implementations = {}; cfg.GetInterfacesAndImplementations(interfaces, implementations); return cfg;