Files
libloot/cpp
Oliver Hamlet 4410265e10 Reduce test fixture filesystem interactions
Only copy across the plugins that are needed for each test to run. This reduces the tests' run time from 25s to 9s locally.

The exact plugins used for some tests changed (mostly to simplify handling of Starfield, which doesn't have Blank.esm in its test plugins) but only when the change didn't matter for what is being tested.

It's possible that some GameInterfaceTest tests were coincidently testing ghosted plugin support and now aren't, so I've added some more tests to explicitly cover that.
2026-05-14 18:53:50 +01:00
..
2025-04-29 17:42:46 +01:00
2026-05-14 18:40:26 +01:00
2025-04-29 17:42:46 +01:00
2025-04-29 17:42:46 +01:00
2026-04-04 18:15:32 +01:00

libloot C++ wrapper

This is a wrapper around libloot that provides a C++ interface that's ABI-compatible with libloot v0.27.0.

The wrapper has two layers:

  • a static library built using Cargo, which provides a C++ interface
  • a shared library built using CMake, which wraps that C++ interface to provide another that is more idiomatic.

Build

The prerequisites for building libloot and its C++ wrapper are CMake, the Rust toolchain and a C++ toolchain. The CI builds currently use a recent version of CMake, the latest version of Rust, MSVC 2022 on Windows and GCC 13 on Linux, so alternatives such as other versions, Mingw-w64 or Clang may not work without modifications.

To build a release build with debug info on Windows:

cmake -B build .
cmake --build build --parallel --config RelWithDebInfo

To do the same on Linux:

cmake -B build . -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build --parallel

To cross-compile on Linux for Windows:

cmake -B build . -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw64.cmake
cmake --build build --parallel

To build a debug build, pass Debug instead of RelWithDebInfo.

The following CMake variables can be used to configure the build:

Parameter Values Default Description
LIBLOOT_BUILD_SHARED ON, OFF ON Whether or not to build a shared libloot binary.
LIBLOOT_BUILD_TESTS ON, OFF ON Whether or not to build libloot's tests.
LIBLOOT_INSTALL_DOCS ON, OFF ON Whether or not to install libloot's docs (which need to be built separately).
RUN_CLANG_TIDY ON, OFF OFF Whether or not to run clang-tidy during build. Has no effect when using CMake's Visual Studio generator.

An example of using libloot with CMake's FetchContent:

set(LIBLOOT_BUILD_TESTS OFF)
set(LIBLOOT_INSTALL_DOCS OFF)

FetchContent_Declare(libloot
    GIT_REPOSITORY "https://github.com/loot/libloot.git"
    GIT_TAG "master" # Better to use a specific commit hash.
    SOURCE_SUBDIR "cpp")

FetchContent_MakeAvailable(libloot)

add_executable(myapp ${MYAPP_SOURCES})
target_link_libraries(myapp PRIVATE libloot::loot)

Documentation

Install Doxygen, Python and uv and make sure they're accessible from your PATH, then run:

uv run --directory ../docs -- sphinx-build -b html . build/html

Tests

If the tests are built they can be run using:

ctest --test-dir build --output-on-failure --parallel -V

Packaging

To package the build:

cpack --config build/CPackConfig.cmake -C RelWithDebInfo

Minimum supported Rust version

The minimum supported Rust version is 1.89. This may change at any time, but there is a CI job to check that it does not change unexpectedly.