config from args
All checks were successful
CI / build-test-release (push) Successful in 9m2s

This commit is contained in:
Jorijn van der Graaf 2026-04-29 18:59:01 +02:00
commit bc9ceb8f24
3 changed files with 50 additions and 28 deletions

View file

@ -4,36 +4,17 @@ namespace fs = std::filesystem;
using namespace Crafter;
extern "C" Configuration CrafterBuildProject(std::span<const std::string_view> args) {
bool debug = false;
std::string target = "x86_64-pc-linux-gnu";
for (std::string_view arg : args) {
if (arg == "--debug") debug = true;
else if (arg.starts_with("--target=")) target = std::string(arg.substr(std::string_view("--target=").size()));
}
// Honor CRAFTER_BUILD_MARCH/MTUNE so CI (which sets these for portability)
// applies them to both the self-rebuild and the mingw cross-compile —
// otherwise Configuration's "native" defaults bake in the build host's
// CPU and the published artifact's portability becomes accidental.
const char* envMarch = std::getenv("CRAFTER_BUILD_MARCH");
const char* envMtune = std::getenv("CRAFTER_BUILD_MTUNE");
std::string march = (envMarch && *envMarch) ? envMarch : "native";
std::string mtune = (envMtune && *envMtune) ? envMtune : "native";
static auto crafterBuildLib = std::make_unique<Configuration>();
crafterBuildLib->path = "./";
crafterBuildLib->name = "crafter.build-lib";
crafterBuildLib->outputName = "crafter-build";
crafterBuildLib->target = target;
crafterBuildLib->march = march;
crafterBuildLib->mtune = mtune;
ApplyStandardArgs(*crafterBuildLib, args);
// Windows builds (native msvc via build.cmd or cross-compiled mingw from
// Linux) need a DLL + import lib + launcher exe so LoadProject can
// compile project.cpp against a stable ABI boundary. Linux is monolithic.
crafterBuildLib->type = (target == "x86_64-w64-mingw32" || target == "x86_64-pc-windows-msvc")
crafterBuildLib->type = (crafterBuildLib->target == "x86_64-w64-mingw32" || crafterBuildLib->target == "x86_64-pc-windows-msvc")
? ConfigurationType::LibraryDynamic
: ConfigurationType::LibraryStatic;
crafterBuildLib->debug = debug;
{
std::array<fs::path, 9> interfaces = {
"interfaces/Crafter.Build",
@ -67,7 +48,7 @@ extern "C" Configuration CrafterBuildProject(std::span<const std::string_view> a
// mingw cross-build: skip the standalone executable. We only consume the
// libraries, and glslang.exe pulls in libgcc_eh which needs pthread that
// mingw-w64 doesn't link by default.
if (target == "x86_64-w64-mingw32") {
if (crafterBuildLib->target == "x86_64-w64-mingw32") {
glslang.options.push_back("-DENABLE_GLSLANG_BINARIES=OFF");
}
glslang.includeDirs = { "" };
@ -77,18 +58,15 @@ extern "C" Configuration CrafterBuildProject(std::span<const std::string_view> a
cfg.path = "./";
cfg.name = "crafter.build-exe";
cfg.outputName = "crafter-build";
cfg.target = target;
cfg.march = march;
cfg.mtune = mtune;
ApplyStandardArgs(cfg, args);
cfg.type = ConfigurationType::Executable;
cfg.debug = debug;
cfg.dependencies = { crafterBuildLib.get() };
{
std::array<fs::path, 0> interfaces = {};
std::array<fs::path, 1> implementations = { "implementations/main" };
cfg.GetInterfacesAndImplementations(interfaces, implementations);
}
if (target == "x86_64-pc-linux-gnu") {
if (cfg.target == "x86_64-pc-linux-gnu") {
cfg.linkFlags.push_back("-Wl,--export-dynamic");
cfg.linkFlags.push_back("-ldl");
}