/* Crafter® Build Copyright (C) 2026 Catcrafts® Catcrafts.net LGPL-3.0-only. */ import std; #include "TestUtil.h" namespace fs = std::filesystem; using namespace TestUtil; int main() { try { fs::path projectRoot = fs::current_path(); fs::path src = projectRoot / "tests" / "fixtures" / "libraries"; fs::path crafterBuild = projectRoot / "bin" / "crafter-build"; fs::path work = CopyFixtureToTemp("Libraries", src); auto build = RunInDir(work, std::format("'{}'", crafterBuild.string())); if (build.exitCode != 0) { std::println(std::cerr, "build failed (rc={}):\n{}", build.exitCode, build.output); return 1; } fs::path staticArchive = work / "mathlib" / "bin" / "MathLib-x86_64-pc-linux-gnu-native" / "libMathLib.a"; fs::path dynamicSO = work / "greetlib" / "bin" / "GreetLib-x86_64-pc-linux-gnu-native" / "libGreetLib.so"; fs::path artifact = work / "bin" / "libs-app-x86_64-pc-linux-gnu-native" / "libs-app"; if (!fs::exists(staticArchive)) { std::println(std::cerr, "static archive missing at {}", staticArchive.string()); return 1; } if (!fs::exists(dynamicSO)) { std::println(std::cerr, "dynamic .so missing at {}", dynamicSO.string()); return 1; } if (!fs::exists(artifact)) { std::println(std::cerr, "exe missing at {}\nbuild log:\n{}", artifact.string(), build.output); return 1; } // The exe linked against a dynamic .so needs LD_LIBRARY_PATH or rpath to find it. // Build() already passes -Wl,-rpath,'$ORIGIN' for shared libs, but the .so lives in // greetlib/bin/... while the exe lives in bin/libs-app-... — different dirs. Set // LD_LIBRARY_PATH explicitly. auto run = RunInDir(work, std::format( "LD_LIBRARY_PATH='{}' '{}'", dynamicSO.parent_path().string(), artifact.string())); if (run.exitCode != 0) { std::println(std::cerr, "artifact exited nonzero (rc={}):\n{}", run.exitCode, run.output); return 1; } if (run.output != "hi=42\n") { std::println(std::cerr, "output mismatch:\n expected: \"hi=42\\n\"\n got: {:?}", run.output); return 1; } return 0; } catch (const std::exception& e) { std::println(std::cerr, "test exception: {}", e.what()); return 1; } }