// SPDX-License-Identifier: LGPL-3.0-only // SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts® import std; import Crafter.Build; namespace fs = std::filesystem; using namespace Crafter; extern "C" Configuration CrafterBuildProject(std::span args) { std::vector depArgs(args.begin(), args.end()); const bool useLocal = std::erase(depArgs, "--local") > 0; Configuration cfg; cfg.path = "./"; cfg.name = "Crafter.LintRules"; cfg.outputName = "Crafter.LintRules"; cfg.type = ConfigurationType::LibraryStatic; ApplyStandardArgs(cfg, args); // No dependency on Crafter.Build, on purpose. The rules only ever run // inside a crafter-build process, which provides the symbols, and a host // build already sees the Crafter.Build modules through the PCM cache // crafter-build keeps for its own project files — declaring the library // here would make every consumer clone and build all of crafter-build // just to lint. std::array ifaces = { "interfaces/Crafter.LintRules" }; std::array impls = {}; cfg.GetInterfacesAndImplementations(ifaces, impls); // The rule test compiles the module as its own interface and links // crafter-build to run the linter in-process: from git by default, or // the sibling checkout with `crafter-build test --local`. Host only, // like the rules themselves, and only when this is the project being // built: crafter-build itself loads this file as a dependency, and the // test's GitProject would then load crafter-build's project file again // and recurse into the cycle guard. if (IsTopLevelProject() && cfg.target == "x86_64-pc-linux-gnu") { Configuration* build = useLocal ? LocalProject({ .projectFile = "../Crafter.Build/project.cpp", .args = depArgs }) : GitProject({ .source = { .url = "https://forgejo.catcrafts.net/Catcrafts/Crafter.Build.git" }, .args = depArgs }); cfg.AddTest("HouseRules", ifaces).Dependencies({ build }); } return cfg; }