Skip to content

Releases: libcna/meta-gl

meta-gl v0.4.1

Choose a tag to compare

@github-actions github-actions released this 10 Oct 12:23

Fixed

  • An unoptimized shared Linux build of libmeta-gl.so (Debug, or no CMAKE_BUILD_TYPE)
    exported fourteen weak libstdc++ template instantiations, such as std::copy and
    std::__niter_base over std::vector<metagl::ContextListener*>, alongside the metagl::
    API. The version script cmake/metagl.version exported extern "C++" { metagl::*; }, which
    the linker matches against demangled names, and a demangled function template specialization
    starts with its return type, so metagl::ContextListener** std::copy<...>(...) matched. It
    now matches the mangled prefix _ZN6metagl, which every function in namespace metagl has
    and no std:: symbol does. An optimized build never emitted these instantiations, so its
    exports, and those of the 0.4.0 packages, are unchanged at 394 symbols.

Changed

  • CI runs all eleven registered CTest tests instead of five: the release-contract, thread,
    desktop-tier and version tests on every leg, and the SONAME and exported-symbol tests on the
    Linux shared leg. Until now they ran only in the tag-triggered release workflow, so a failure
    in one of them, like the leak above, first showed up when a version tag was pushed.

Verification

  • 11/11 CTest tests pass on a shared Release build with tests, examples, GPU (EGL surfaceless)
    tests and docs enabled, including API consistency (358 wrappers). The build is
    warning-free.
  • The exported-symbol policy test passes on an unoptimized Clang shared build as well: 394
    exports, the same as Release. Before the fix it failed there with the fourteen std::
    symbols. CI passes every test on Linux GCC static, Linux Clang shared, Windows MSVC shared and
    Linux Clang ASan/UBSan.
  • Verified on Debian GNU/Linux 13 with GCC 14.2.0, Clang 19.1.7, CMake 3.31.6, Ninja and Mesa
    EGL 25.0.7. The Khronos GLES headers are vendored in third_party/Khronos, so the tag selects
    them; the EGL implementation is a system package used only by the optional GPU smoke test.

meta-gl v0.4.0

Choose a tag to compare

@github-actions github-actions released this 10 Oct 11:57

First tagged release. The 0.1.0, 0.2.0 and 0.3.0 entries below were recorded as development
milestones but never tagged or published, so this is the first version available as a tag; it
contains everything listed under them as well. See docs/releasing.md.

Added

  • Release identity: metagl/Version.hpp, generated by cmake/Version.cmake from
    project(meta-gl VERSION ...) and METAGL_VERSION_PRERELEASE, installed with the package and
    included by metagl.hpp. It provides metagl::GetVersionString(),
    GetVersionMajor/Minor/Patch(), GetVersionPreRelease(), IsPreReleaseVersion() and the
    preprocessor-testable METAGL_VERSION_* macros. Covered by metagl-version-test; the
    installed-package consumer checks the installed header against meta-gl_VERSION.
  • docs/releasing.md: where the version lives, the numbers that are not the product version,
    and the release checklist.
  • Internal-only desktop OpenGL ES-tier equivalence diagnostic
    (metagl::detail::GetDesktopEsTier() in DesktopEsTier.hpp, R76–R78):
    checks the same mandatory-function lists used for native OpenGL ES against
    a desktop 3.3+ context, with GL_ARB_ES3_1_compatibility /
    GL_ARB_ES3_2_compatibility as a fast additional signal. It never affects
    Capabilities or Initialize()'s success/failure, and is not part of the
    stable public API surface.
  • metagl-export-symbols-test (tests/test_export_symbols.py, R47): an
    automated Unix exported-symbol policy check enforcing the R44 ABI surface
    decision via nm -D — every exported dynamic symbol must be a function in
    the metagl:: namespace, any metagl::detail:: symbol must be on a small
    explicit allowlist, and a set of landmark public entry points must remain
    present.
  • A GNU ld/lld version script (cmake/metagl.version) applied on ELF
    (Unix, non-Apple) shared builds, keeping the dynamic symbol table limited
    to the metagl:: namespace even when internal implementation details pull
    in vague-linkage libstdc++ template symbols.

Changed

  • The package version moves from 0.3.0 to 0.4.0. The package version file keeps
    SameMinorVersion compatibility, so consumers that wrote find_package(meta-gl 0.3 ...) must
    request 0.4. The SONAME stays libmeta-gl.so.0.
  • Doxygen's PROJECT_NUMBER is derived from the same version string instead of
    PROJECT_VERSION, and the generated Version.hpp is part of the API documentation.

Fixed

  • A METAGLDEBUG-only use-after-free: the process-wide, non-thread-local
    guard that flushed the buffered debug log on exit could be destroyed
    after a thread's log buffer, corrupting or crashing the program during
    normal shutdown. The flush guard is now itself thread_local and is
    first touched strictly after the buffer it flushes, guaranteeing correct
    destruction order on every supported platform except Windows (which
    already flushes explicitly to avoid the DLL loader-lock deadlock).
  • include/metagl/Functions.hpp was missing #include <exception> for its
    std::terminate() calls (R07–R11's Invalid Input Contract). This was
    masked on GCC/libstdc++, where <exception> is pulled in transitively by
    other standard headers, but broke the Emscripten/libc++ toolchain with
    "no member named 'terminate' in namespace 'std'"; found while building
    easy-gl's downstream emscripten CMake preset against this library.
  • The release workflow looked for the tag name, with its leading v, in the CHANGELOG.md
    headers, which never carry one, so every GitHub release would have been published with the
    fallback text instead of its changelog section. It now matches [<version>] and stops at the
    next level-2 header.

Verification

  • 11/11 CTest tests pass on a shared Release build with tests, examples, GPU (EGL surfaceless)
    tests and docs enabled: compile, mock-loader, release-contract, thread, desktop-tier,
    version, SONAME, exported-symbol policy, API consistency (358 wrappers), installed package
    and EGL smoke. The build is warning-free.
  • A static add_subdirectory consumer — the way easy-gl consumes its sibling ../meta-gl —
    builds and reports 0.4.0. The Linux static and Windows shared packages are built only by
    the release workflow.
  • Verified on Debian GNU/Linux 13 with GCC 14.2.0, CMake 3.31.6, Ninja and Mesa EGL 25.0.7.
    The Khronos GLES headers are vendored in third_party/Khronos, so the tag selects them; the
    EGL implementation is a system package used only by the optional GPU smoke test.