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 <clone>/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 <noreply@anthropic.com>
43 lines
2 KiB
C++
43 lines
2 KiB
C++
// SPDX-License-Identifier: LGPL-3.0-only
|
|
// SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
|
|
|
|
// The build helper consumers load through
|
|
// #pragma crafter dependency "https://forgejo.catcrafts.net/Catcrafts/Crafter.Debug.git" project "tooling/project.cpp"
|
|
// A separate project file because a pragma dependency is built for the host
|
|
// and gets none of the consumer's args, so the root project.cpp could not
|
|
// tell this load from the one that builds the library for the target.
|
|
//
|
|
// No dependency on Crafter.Build, as in Crafter.LintRules: this module only
|
|
// ever runs inside a crafter-build process, which provides the symbols, and
|
|
// the host build already sees the Crafter.Build modules through the PCM cache
|
|
// crafter-build keeps for project files. Nor on anything else: whatever this
|
|
// imported would be built on every load of every consumer.
|
|
import std;
|
|
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<const std::string_view> args) {
|
|
Configuration cfg;
|
|
cfg.path = Here();
|
|
cfg.name = "Crafter.Debug.Build";
|
|
cfg.outputName = "Crafter.Debug.Build";
|
|
cfg.type = ConfigurationType::LibraryStatic;
|
|
ApplyStandardArgs(cfg, args);
|
|
std::array<fs::path, 1> interfaces = { Here() / "interfaces" / "Crafter.Debug.Build" };
|
|
std::array<fs::path, 0> implementations = {};
|
|
cfg.GetInterfacesAndImplementations(interfaces, implementations);
|
|
return cfg;
|
|
}
|