- Linux GCC rejects QMetaType instantiation over incomplete types
(static_assert(sizeof(T))); Q_DECLARE_OPAQUE_POINTER every opaque
OakEngine* handle in the public headers so QList<OakEngineTask*> etc
compile
- Windows: gtest discovery ran the fresh exe before the DLLs were next
to it; use DISCOVERY_MODE PRE_TEST on WIN32 and copy the DLLs for
ctest time
- Linux: Qt6 metatype static_assert requires complete types; declare
OakEngineBlock with Q_DECLARE_OPAQUE_POINTER in the public header
(outside extern "C")
- Windows: gtest discovery runs the freshly linked test exe at build
time and it cannot find the DLLs (0xc0000135); copy oakcore/oakengine/
ffmpeg_bridge DLLs next to the test binaries on WIN32
- macOS: Imath header mixing between otio-install's stale bundled Imath
and Homebrew's Imath broke ImathBox.h (V2h undeclared); bump the OTIO
cache to v2 and drop bundled Imath headers so the system one is the
only set in play
Move the finished migration campaign docs (handoffs v3-v6, roadmap,
R5 guides, R6 cleanup, R7 pure-ABI) from docs/zh/ into
docs/zh/plans/completed/ with an archive README; fix all
cross-references; refresh plans/README.md index (active plans now
marked unlocked).
liboakcore is now a shared library that exposes only a C ABI:
- every value class (Rational, TimeRange, Color, Bezier, AudioParams,
SampleBuffer) and the free-function groups (StringUtils, fraction
utils, Timecode) is wrapped in an opaque-handle C API under
core/include/olive/core/oakcore/ (init/copy/free + self-first
functions), implemented in core/src/capi/
- consumers keep the original C++ API unchanged through same-name
wrapper classes that hold the handle and forward across the C
boundary; original implementations moved to core/src/oliveimpl
(namespace olive::core::internal) and are hidden from export
- TimeRangeList/TimeRangeListFrameIterator are reimplemented inline
over the wrapper (iterators/containers don't cross C ABI)
- generic Value container stays internal (unused by consumers) and is
no longer part of the public umbrella header
- hidden visibility + OAKCORE_BUILD export macro; nm shows zero
olive::* symbols exported
- install into the platform's standard libdir (GNUInstallDirs);
Windows DLLs next to the executables, macOS into the app bundle
- TimelineWorkArea::in/out/length now return by value: the wrapped
TimeRange getters return values, and forwarding them through const
references dangled (found via RenderWorkerFootageTest crash)
- tests: 9 new pure C ABI test executables (oakcore_*_test) covering
every public C function; 4 stale legacy core tests removed (they
targeted a long-renamed API and were never built due to a malformed
option() that also kept OLIVECORE_BUILD_TESTS off)
- CI/CD: oakcore.dll staged for NSIS, liboakcore.so added to the
AppImage validation list, build-tree DLL copies on Windows