feat(osi): replace pre-built OSI 3.5.0 with source-built OSI 3.8.0 via asam-osi-utilities#784
feat(osi): replace pre-built OSI 3.5.0 with source-built OSI 3.8.0 via asam-osi-utilities#784jdsika wants to merge 13 commits into
Conversation
9b14c70 to
ba27216
Compare
|
We will carefully review and consider this updated and improved OSI integration. We have considered updating OSI before, but so far decided to stay due to 3rd party dependencies. It's some time ago, so maybe that decision can be re-evaluated. In which case I think this PR can be extremely valuable. A quick comment on the fixed static libraries; The idea is not to have esmini locked into those. For example, any user could replace the OSG libraries with customized ones. However, they're a bit tricky and time consuming to build so the provided ones can be considered and used as default ones. For reviewing this PR, there will be a few considerations, e.g:
|
|
OK, thanks for the requirements. I will see how to proceed. This PR is in preparation to introduce writing trace files into .mcap which is part of ASAM-OSI-Utilities. Then Lichtblick visualisation can be used natively which is a great win! In addition we can ease the integration of OSC-Validation. There is no hurry to merge. I will also see how to further improve caching for lower build times. I was just happy to get it a green ci yesterday :))) |
|
Thanks for the thoughtful review and clear requirements, @eknabevcc! Both points are addressable within the current architecture. Here's my technical plan: 1. Dynamic linking of OSI/ProtobufGood news: the underlying osi-cpp library (bundled in asam-osi-utilities) already builds all three variants unconditionally:
The current PR always selects
The key use case you described — two libs each needing OSI, avoiding double-registration — maps exactly to the shared OSI + shared protobuf configuration. Both libs would link against the same Implementation: I'll add this as a follow-up commit on this PR. The CI will test static (default) on all platforms; dynamic can be validated as an opt-in. 2. OSI and Protobuf version parameterizationThe version control already exists in the architecture, but isn't well-documented: OSI version is controlled by the osi-cpp git submodule commit:
Protobuf version is controlled by the vcpkg baseline:
Important constraint: Protobuf is a public dependency — its types appear in OSI headers. All consumers must use the same protobuf version (ABI-compatible). This is inherent to protobuf, not specific to this integration. What I'll add:
True simultaneous multi-version support (e.g., build for both OSI 3.5 and 3.8 at once) would be impractical since the proto message definitions differ. But single-version parameterization is straightforward. TimelineI'll address both points in follow-up commits on this branch:
The existing green CI and test coverage provide a solid baseline. No rush — I want to get this right. |
6218417 to
b67c14b
Compare
b67c14b to
4652594
Compare
|
@eknabevcc this is ready for review I will only further investigate caching improvements. |
ba53fd2 to
3f0c18b
Compare
…a asam-osi-utilities Replace the legacy pre-built OSI 3.5.0 static binaries with modern source-built OSI 3.8.0 provided by the asam-osi-utilities library. Key changes: - Add asam-osi-utilities as a git submodule (externals/asam-osi-utilities) - Rewrite support/cmake/external/osi.cmake to build OSI from source using vcpkg for dependency management (protobuf 5.x, abseil, lz4, zstd) - Remove stale Python protobuf bindings (scripts/osi3/*_pb2.py) in favor of the osi-python package from asam-osi-utilities - Update OSIReporter.cpp for protobuf 5.x API (arena allocation, GetDescriptor, traffic sign type validation) - Update unit tests and smoke tests for OSI 3.8.0 message sizes and vehicle type enum aliases - Add vcpkg triplets for macOS universal builds and Windows static-md - Suppress MSVC warnings from protobuf/abseil third-party headers Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
Add a reusable setup_osi_utilities composite action that builds asam-osi-utilities with vcpkg in Phase A (cached separately) and installs headers, libraries, and CMake configs to an osi-deps prefix. Phase B (esmini itself) consumes this via CMAKE_PREFIX_PATH. Changes: - Add .github/actions/setup_osi_utilities/action.yml with two-phase build, vcpkg caching, and platform-specific triplet selection - Update ci.yml, memoryleak.yml, sanitize.yml to call the new action before CMake configure, passing OSI_UTILITIES_PREFIX and vcpkg paths - Add Python 3.x to setup_tools_shared for osi2csv smoke tests - Replace deprecated actions/cache save-always with explicit cache/restore + cache/save pattern for Phase A artifacts Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
Update all user-facing documentation to reflect the migration from pre-built OSI 3.5.0 to source-built OSI 3.8.0 via asam-osi-utilities: README.md: - Update OSI version to v3.8.0, protobuf to vcpkg-managed v5.x - Replace generate_osi_libs.sh reference with submodule build info user_guide.adoc: - Rewrite build guide with git clone --recursive and two-phase build - Add quick build without OSI section - Replace stale DYN_PROTOBUF section with comprehensive guide covering static linking (default), dynamic/shared linking (Linux/macOS), protobuf version configuration, and OSI version pinning - Simplify Python OSI setup (pip install from requirements.txt) - Update OSI doc links from V3.5.0 to latest - Remove stale generate_osi_libs.sh and Dropbox download references release_notes.md: - Document the OSI 3.5.0 to 3.8.0 migration as a new feature Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
Add CMakePresets.json (version 6) to centralize build configuration:
- Hidden base presets (base, osi-base, no-externals-base)
- Platform-specific CI presets (ci-linux, ci-macos, ci-windows)
- Slim build presets (ci-no-externals-{linux,macos,windows})
- Specialized presets (ci-sanitize, ci-memoryleak)
- Developer presets (default, full)
OSI paths (OSI_UTILITIES_PREFIX, CMAKE_PREFIX_PATH, Protobuf_PROTOC_EXECUTABLE)
are injected via environment variables (ESMINI_OSI_PREFIX, ESMINI_CMAKE_PREFIX_PATH,
ESMINI_PROTOC) set by the setup_osi_utilities composite action.
CI workflows now use 'cmake --preset <name>' instead of per-platform
configure steps with duplicated flags. This reduces the test job configure
from 3 platform-specific steps to 1 cross-platform step.
Preset conditions restrict platform-specific presets to their target OS,
so 'cmake --list-presets' only shows relevant options.
Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
Extend the devcontainer Dockerfile with: - zip package (required by vcpkg bootstrap, unzip already present) - vcpkg bootstrapped at /opt/vcpkg with VCPKG_ROOT set This allows users to immediately run Phase A of the OSI two-phase build inside the devcontainer without manual vcpkg setup. Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
- Add missing system dev packages to Dockerfile (lz4-devel, libzstd-devel, libX11-devel, libXrandr-devel, libXinerama-devel, mesa-libGL-devel, fontconfig-devel) required for full build with OSG/ImPlot - Document protobuf version conflict and base preset workaround (base image ships protobuf 3.21.12, vcpkg installs 5.29.3) - Forward HTTP_PROXY/HTTPS_PROXY/NO_PROXY via containerEnv in devcontainer.json for vcpkg registry fetch behind corporate proxies - Expand README two-phase build instructions with concrete Phase A/B example for both Windows and Linux/macOS Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
745c605 to
a0c6277
Compare
Scope protobuf/abseil MSVC warning suppressions to OSI-consuming targets instead of applying them globally. This restores warnings 4141, 4267, 4244, 4189, 4296, and 4459 for esmini's own code while keeping them suppressed where OSI headers are compiled. Key changes: - Create osi_external_warnings INTERFACE library in osi.cmake carrying the 6 protobuf-specific /wd flags, and wrap OSI_LIBRARIES so linking targets inherit them automatically - Remove those 6 /wd flags from global add_compile_options() in flags.cmake (keep /wd4127 and /wd4100 for general esmini patterns) - Add osi_external_warnings to 4 include-only targets (ScenarioEngine, ViewerBase, PlayerBase, Controllers) - Restore /w14296 in compiler_warnings.cmake (no esmini code triggers it; only protobuf/abseil headers do, now scoped) - Replace 6 hardcoded EXPECT_EQ(st_size, N) assertions with resilient range-based checks (EXPECT_GT/LT) and increase max_msg_size buffer - Auto-derive vcpkg commit from submodule vcpkg-configuration.json baseline via jq, eliminating manual synchronization risk - Remove unused externals/implot from slim CI cache path Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
a0c6277 to
eaa751a
Compare
|
After brief internal discussions, here's our initial ideas on strategy forward:
@slundel6 already looking into this, and will continue next week. We are prepared to support to find a compromise solution serving the use cases you see and ours. |
|
Should we maybe setup a quick teams meeting to discuss it? |
|
Sounds like a good idea. |
|
The main argument for this integration from my end would be:
|
- OSMP_FMU: derive OSIVERSION from find_package(open_simulation_interface) instead of hardcoding 3.5.0; remove old externals/osi/ include/link paths; move configure_file after set_osi_libs() so version is available - osi.cmake: expose OSI_VERSION after find_package for downstream use - Remove dead DYN_PROTOBUF code blocks from 7 CMake files (option was removed but if-blocks remained as unreachable code) - Update outdated protobuf==3.20.2 comments in 8 Python files to reference osi-python package - Update Hello-World tutorial OSI section for two-phase build Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
- TYPE_MEDIUM_CAR -> TYPE_CAR (same wire value) - TYPE_MOTORBIKE -> TYPE_MOTORCYCLE (same wire value) - TYPE_DELIVERY_VAN -> TYPE_VAN (same wire value) - COLOR_GREY -> COLOR_GRAY (same wire value) All replacements are pure renames with identical protobuf integer values, so no behavioral change occurs. Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
When the exact Phase A cache key misses (e.g. after a minor submodule update or triplet tweak), the restore step now falls back to the most recent cache matching the same OS+triplet+config prefix, and then the same OS+triplet. This lets vcpkg reuse already-downloaded packages instead of fetching everything from scratch, significantly reducing Phase A rebuild time on partial cache misses. Fallback chain: 1. Exact key: OS-triplet-config-hash 2. Same OS+triplet+config (any prior hash) 3. Same OS+triplet (any config or hash) Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
Add a scheduled workflow that pre-builds OSI utilities Phase A artifacts on the dev branch at 03:00 UTC daily. This populates the GitHub Actions cache for all 4 platform/config combinations (Linux Release, macOS Release, Windows Debug, Windows Release) so the first PR of the day always gets a cache hit. Also supports workflow_dispatch for manual cache refresh after OSI submodule updates. Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
Enable compiler caching (ccache) for Phase B esmini builds on Linux and macOS to reduce incremental build times on cache hits. Changes: - Add ENABLE_CCACHE=ON to ci-linux, ci-macos, ci-sanitize, and ci-memoryleak CMake presets - Install ccache if not pre-installed on the runner - Persist ccache directory across runs via actions/cache with restore-keys fallback (OS + config prefix matching) - Log ccache stats after build for diagnostics Windows is excluded because the Visual Studio generator has limited ccache/sccache compatibility. The ENABLE_CCACHE flag in ccache.cmake degrades gracefully (prints a warning, continues without caching) if the binary is not found. Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
When the Phase A install-prefix cache misses and vcpkg must compile dependencies from source (protobuf, abseil, lz4, zstd, etc.), this change enables vcpkg's built-in binary caching backed by the GitHub Actions cache (x-gha provider). This means individual vcpkg packages are cached independently: - If only one package changes, the others are restored from cache - This complements the full install-prefix cache (which is all-or-nothing) - On a cold Phase A cache, this can save significant build time Implementation: - Export ACTIONS_CACHE_URL and ACTIONS_RUNTIME_TOKEN via github-script (required by the x-gha provider for authentication) - Set VCPKG_BINARY_SOURCES=clear;x-gha,readwrite via GITHUB_ENV so it persists through configure and build steps Signed-off-by: jdsika <carlo.van-driesten@bmw.de>
|
@eknabevcc I think the caching is now well optimized. |
CI Build Time Analysis: Cold vs Warm CacheWe ran the CI twice -- once cold (no Phase A cache), once warm (all caches populated) -- to measure the impact of the caching improvements in this PR. Results (test jobs with OSI)
Results (no-external-modules jobs -- no OSI, baseline)
No-external jobs don't use OSI, so no change expected -- confirms the improvement comes from Phase A caching. Summary
Caching strategy (4 layers)
|
|
Think about something: |
|
Check if debug is necessary in cache warming: |
|
Note: |
|
@eknabevcc and @slundel6 I have invited you to my fork as collaborators for you to modify the branch yourself |
|
@jdsika thanks! We are working on your PR in a separate repo, approaching it from the angle we discussed. Our goal is to have an implementation that works to run, and then have a joint discussion about it. |
Summary
Replace esmini's pre-built OSI 3.5.0 binaries (
externals/osi/) with source-built OSI 3.8.0 via asam-osi-utilities as a Git submodule. This modernizes the OSI dependency chain, gives esmini access to the latest OSI features (proto3optionalfields, new message types), and provides a reproducible build via vcpkg.Motivation
externals/osi/were frozen at OSI 3.5.0 with protobuf 3.x. Upstream OSI has moved to 3.8.0 with protobuf 5.x, proto3optionalfields, and new message types..a/.libfiles checked into the repo create ABI compatibility issues, complicate CI, and make it impossible to debug or rebuild OSI locally.Architecture: Two-Phase Build
The integration uses a two-phase build pattern:
Phase A -- Build OSI dependencies (cached in CI)
Phase A resolves protobuf, abseil, and other transitive dependencies via vcpkg, then builds and installs OSI + utilities into a prefix directory. This is cached in CI -- subsequent runs skip this entirely.
Phase B -- Build esmini (uses Phase A output)
Phase B consumes the installed OSI libraries via standard CMake
find_package(). No vcpkg toolchain needed -- justCMAKE_PREFIX_PATHpointing to the install prefix.Why two phases?
externals/asam-osi-utilities/**+ triplet files. Rebuilds only when the submodule or triplets change.x64-windows-static-mdtriplet) ensures each DLL/EXE gets its own protobuf descriptor pool, preventing double-registration crashes whenesminiLib.dlland test executables both link OSI.Commits
cc78b43dd2bbc7592171149fdf0139a3CMakePresets.jsonwith default/full/ci-* presets, env-var injectione03188f3/opt/vcpkg53a41ad1eaa751a4/wdflags viaosi_external_warningsINTERFACE library, resilient OSI file size assertions, auto-derive vcpkg commit from submodule6f028913fe912adde536e2a451a7e407e92a4416c5d06a0eDesign Decisions
1. Git submodule for asam-osi-utilities
Decision: Add
externals/asam-osi-utilitiesas a Git submodule pointing to themainbranch.Rationale: Submodules provide a pinned, reproducible dependency without vendoring large build systems. The asam-osi-utilities repo includes osi-cpp and mcap as nested submodules, giving esmini the full OSI + trace file stack from a single entry point.
2. Custom vcpkg triplets
support/vcpkg-triplets/universal-osx.cmake: Builds universal (arm64 + x86_64) fat binaries on macOS so vcpkg-managed protobuf/abseil match esmini's universal builds.support/vcpkg-triplets/x64-windows-static-md-v142.cmake: Uses MSVC v142 toolset (VS 2019). esmini's CI uses-T v142for backward compatibility; vcpkg defaults to v143 whose STL intrinsics aren't available in v142.3.
find_package(Protobuf CONFIG REQUIRED)in osi.cmakeCMake's built-in
FindProtobufmodule does not resolve transitive dependencies (abseil, utf8-range) from vcpkg's package configs. UsingCONFIGmode ensures the vcpkg-installedprotobuf-config.cmakeis used, which properly declares all transitive targets.4. MSVC warning suppressions (
/wd4141,/wd4267, etc.)Suppress specific protobuf/abseil header warnings on MSVC, scoped to OSI-consuming targets only. An
osi_external_warningsINTERFACE library inosi.cmakecarries the 6/wdflags, and a wrapperosi_with_warningstarget propagates them automatically to anything linkingOSI_LIBRARIES. Four include-only targets (ScenarioEngine, ViewerBase, PlayerBase, Controllers) explicitly linkosi_external_warnings. This keeps the warnings active for esmini's own code while suppressing them where protobuf/abseil headers are compiled./w14296remains removed fromcompiler_warnings.cmakebecause MSVC's last-flag-wins semantics would override the per-target/wd4296suppression.MSVC's
/external:W0flag has a known bug that fails to suppress some warnings fromSYSTEMinclude directories, and template instantiation in esmini's own TUs fires warnings from protobuf headers regardless.'inline'used more than oncemessage_lite.hsize_tnarrowing conversionrepeated_field.hrepeated_field.hvariant.hhash.h5. Traffic sign enum validation
Add
TrafficSign_MainSign_Classification_Type_IsValid()check beforestatic_castinOSIReporter.cpp. When a traffic sign type is not found in the OpenDRIVE-to-OSI mapping table,osi_typedefaults toINT_MAX. In Debug builds, protobuf asserts_IsValid(value)and crashes. The fix validates before casting and falls back toTYPE_OTHERwith a log warning.6. Proper protobuf API for vehicle type in osi2csv.py
Replace
str(o.vehicle_classification)[11:-1]withMovingObject.VehicleClassification.Type.Name(type_enum). OSI 3.8.0 changedVehicleClassificationfields to proto3optional(explicit presence tracking), breaking the fragile string-slicing approach.7. Replace vendored osi3 Python bindings with osi-python
Delete vendored
scripts/osi3/*.pyfiles. In CI, osi-python is installed from the submodule tree (pip install externals/asam-osi-utilities/submodules/osi-python). The vendored bindings were generated for OSI 3.5.0 / protobuf 3.x and are incompatible with protobuf 5.x wire format.8. CI cache strategy (split restore/save)
Use
actions/cache/restore@v4+actions/cache/save@v4instead ofactions/cache@v5withsave-always. The split approach saves the cache immediately after Phase A install (before downstream tests can fail), ensuring the cache is always populated on the first successful Phase A build.9.
fail-fast: falseon the test matrixDisable fail-fast so that a failure on one platform doesn't cancel in-progress jobs on other platforms. During this integration (which touches all 3 platforms), getting results from all platforms simultaneously is critical for efficient debugging.
10. Phase A configuration on Windows vs Linux/macOS
On Windows, Phase A uses
matrix.configuration(Debug or Release). On Linux/macOS, Phase A always builds Release. MSVC static libraries encode_ITERATOR_DEBUG_LEVELand CRT linkage (MD vs MDd), so a Release Phase A library cannot link into a Debug Phase B build. On Linux/macOS, static libraries are configuration-agnostic, so a single Release build serves both configurations. This means Windows has 2 Phase A caches (Debug + Release) while Linux/macOS have 1.11. Protobuf version management
The C++ protobuf version (currently v5.29.3) is controlled by the vcpkg baseline in
externals/asam-osi-utilities/vcpkg-configuration.json. The Python protobuf version (currently >=6.30.2) is declared by osi-python'spyproject.toml. These are not centrally synchronized, but wire-format compatibility across protobuf major versions ensures interoperability between C++ and Python. Therequirements.txtno longer pins protobuf directly -- it is pulled transitively via osi-python.12. Auto-derive vcpkg commit from submodule
The
setup_osi_utilitiescomposite action no longer hardcodes the vcpkg commit hash. Instead, it extracts the baseline fromexternals/asam-osi-utilities/vcpkg-configuration.jsonviajqat runtime. This eliminates the risk of the action and submodule drifting out of sync when the submodule is updated. An explicitvcpkg-commitinput can still override this for special cases.13. Resilient OSI file size assertions
Unit tests previously used exact
EXPECT_EQ(fileStatus.st_size, N)assertions that break on any protobuf serialization change. These are replaced with range-based checks (EXPECT_GT/EXPECT_LT) that validate the test behavior (file was written, grew with frames, mode differences are significant) without depending on exact byte counts. Thelane_no_objtest already used this pattern; now all 6 GroundTruth file-size tests follow suit.Files Changed (77 files, +1372 -1393)
Core CMake integration
CMakeLists.txt-- ReplaceDYN_PROTOBUFoption withOSI_UTILITIES_PREFIX; remove OSI download stepsupport/cmake/external/osi.cmake-- Complete rewrite:find_package(open_simulation_interface)via installed prefix instead of manual lib/include pathssupport/cmake/common/locations.cmake-- RemoveEXTERNALS_OSI_PATHand OS-specific OSI pathssupport/cmake/common/definitions.cmake-- RemoveDYN_PROTOBUFdefinitionssupport/cmake/common/flags.cmake-- Protobuf-specific/wdflags moved to per-targetosi_external_warningsin osi.cmake; only/wd4127and/wd4100remain globalsupport/cmake/rule/compiler_warnings.cmake--/w14296stays removed (MSVC last-flag-wins would override per-target/wd4296)CI / GitHub Actions
.github/actions/setup_osi_utilities/action.yml-- New reusable composite action for two-phase build with caching; auto-derives vcpkg baseline from submodule config viajq.github/actions/setup_tools_shared/action.yml-- Addosi-pythonandasam-osi-utilitiesPython package installation from submodule tree.github/workflows/ci.yml-- Integrate Phase A, custom triplets,fail-fast: false, platform-specific configs.github/workflows/memoryleak.yml-- Add Phase A setup.github/workflows/sanitize.yml-- Add Phase A setupSource fixes
OSIReporter.cpp-- Validate traffic sign enum beforeset_type(), fall back toTYPE_OTHERscripts/osi2csv.py-- Use proper protobuf API for vehicle type extractiontest/smoke_test.py-- Update OSI assertions for 3.8.0 type aliases (MEDIUM_CAR->CAR)ScenarioEngineDll_test.cpp-- Replace hardcoded OSI file size assertions with resilient range-based checks (EXPECT_GT/EXPECT_LT); increasemax_msg_sizebufferDependency management
.gitmodules-- Addexternals/asam-osi-utilitiessubmodule (recursive)externals/asam-osi-utilities-- Submodule atb7c8603(main)support/python/requirements.txt-- Remove standaloneprotobufpin (now transitive via osi-python)scripts/osi3/-- Delete all 11 vendored protobuf bindings (replaced by osi-python package)support/vcpkg-triplets/universal-osx.cmake-- macOS universal binary tripletsupport/vcpkg-triplets/x64-windows-static-md-v142.cmake-- Windows v142 toolset tripletDev Container
.devcontainer/Dockerfile-- Add system dev packages (lz4-devel, libzstd-devel, libX11-devel, libXrandr-devel, libXinerama-devel, mesa-libGL-devel, fontconfig-devel), vcpkg bootstrap, protobuf version conflict documentation.devcontainer/devcontainer.json-- Forward HTTP_PROXY/HTTPS_PROXY/NO_PROXY via containerEnv for vcpkg registry fetch behind corporate proxies.gitignore-- AddCMakeFiles/to ignored pathsDocumentation
README.md-- Update OSI version (3.5.0 -> 3.8.0), protobuf now vcpkg-managed, two-phase build example for Windows and Linux/macOSdocs/user_guide.adoc-- Rewrite build guide with--recursiveand two-phase instructions; replace staleDYN_PROTOBUFsection with static/dynamic linking guide and protobuf/OSI version documentation; simplify Python OSI setup; update OSI doc links to latestrelease_notes.md-- Add OSI 3.8.0 migration entry.github/copilot-instructions.md-- Build instructions for the new two-phase workflowTesting
MEDIUM_CAR->CARdue to OSI 3.8.0 enum alias resolution)Breaking Changes
DYN_PROTOBUFCMake option removed: Dynamic protobuf linking viaexternals/OSI/*/lib-dynis no longer supported. For shared linking scenarios, useLINK_WITH_SHARED_OSI=ONwith dynamic vcpkg triplets -- see asam-osi-utilities integration docs.externals/osi/directory no longer used: Pre-built OSI binaries replaced by submodule-based build.USE_OSI=ONnow requires a Phase A pre-build step (automated in CI, documented for local builds in user guide).protobufpin removed fromrequirements.txt: protobuf is now a transitive dependency of osi-python, installed from the submodule.How to Build Locally
Known Issues (Dev Container)
ghcr.io/bounverif/esmini:latest-devel) ships protobuf 3.21.12 at/opt/bazalt/. Using thevcpkgpreset for Phase A causes header conflicts. Use thebasepreset with-DCMAKE_PREFIX_PATH=/opt/bazaltinstead.mcap/writer.inl:179has an implicitinttoLZ4F_blockChecksum_tenum conversion rejected by GCC 14 with system lz4 1.8.3. Workaround: add-DCMAKE_CXX_FLAGS=-fpermissiveto Phase A configure.HTTP_PROXY/HTTPS_PROXYmust be set inside the container for vcpkg registry fetch. The updateddevcontainer.jsonforwards these from the host automatically.Related PRs
find_package())