From 76d317ebc313cbc14001a5238c34af48a6bb409c Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Sat, 9 Aug 2025 21:12:46 +0200 Subject: [PATCH] Improve Core Builds for Linux (#3706) --- .github/workflows/core-release.yml | 4 +- .github/workflows/linux-ci.yml | 68 +++++++++---------- CMakePresets.json | 16 ----- metrics/BUILD.bazel | 2 +- ...{linux-drawable.json => linux-opengl.json} | 0 .../linux/cmake/find_static_library.cmake | 31 ++++----- platform/linux/linux.cmake | 35 +++++----- render-test/BUILD.bazel | 2 +- 8 files changed, 70 insertions(+), 88 deletions(-) rename metrics/{linux-drawable.json => linux-opengl.json} (100%) diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index b89ea9667..ef471de8a 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -78,8 +78,8 @@ jobs: - name: Build mbgl-core for Linux run: | - cmake --preset linux-${{ matrix.renderer }}-core -DCMAKE_CXX_COMPILER_LAUNCHER="" - cmake --build --preset linux-${{ matrix.renderer }}-core + cmake --preset linux-${{ matrix.renderer }} -DCMAKE_CXX_COMPILER_LAUNCHER="" + cmake --build build-linux-${{ matrix.renderer }} --target mbgl-core - name: Rename artifact run: | diff --git a/.github/workflows/linux-ci.yml b/.github/workflows/linux-ci.yml index 11b30c081..fd344cabf 100644 --- a/.github/workflows/linux-ci.yml +++ b/.github/workflows/linux-ci.yml @@ -24,6 +24,9 @@ permissions: contents: read # needed for CodeQL security-events: write # needed for CodeQL +env: + EGL_PLATFORM: surfaceless + jobs: pre_job: runs-on: ubuntu-22.04 @@ -53,7 +56,13 @@ jobs: strategy: fail-fast: true matrix: - renderer: [vulkan, drawable, drawable-rust] + variant: + - renderer: vulkan + rust: false + - renderer: opengl + rust: false + - renderer: opengl + rust: true runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 @@ -75,17 +84,8 @@ jobs: - name: Install dependencies run: .github/scripts/install-linux-deps - - if: matrix.renderer == 'drawable-rust' - run: | - echo "renderer_flag_cmake=DMLN_WITH_OPENGL=ON -DMLN_USE_RUST=ON" >> "$GITHUB_ENV" - cargo install cxxbridge-cmd --version 1.0.157 --locked - - - if: matrix.renderer == 'drawable' - run: | - echo "-DMLN_WITH_OPENGL=ON" >> "$GITHUB_ENV" - - - if: matrix.renderer == 'vulkan' - run: echo renderer_flag_cmake="-DMLN_WITH_VULKAN=ON -DMLN_WITH_OPENGL=OFF" >> "$GITHUB_ENV" + - if: matrix.variant.rust + run: cargo install cxxbridge-cmd --version 1.0.157 --locked - name: Install sccache run: | @@ -103,7 +103,7 @@ jobs: role-to-assume: ${{ vars.OIDC_AWS_ROLE_TO_ASSUME }} role-session-name: ${{ github.run_id }} - - name: Build MapLibre Native Core + - name: Build MapLibre Native env: CI: 1 run: | @@ -118,12 +118,12 @@ jobs: export SCCACHE_S3_NO_CREDENTIALS=1 fi - cmake -B build -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -DMLN_WITH_CLANG_TIDY=ON \ + cmake --preset linux-${{ matrix.variant.renderer }} \ + -DMLN_WITH_CLANG_TIDY=ON \ -DCMAKE_C_COMPILER_LAUNCHER=sccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=sccache \ - -DMLN_WITH_COVERAGE=ON \ - ${{ env.renderer_flag_cmake }} - cmake --build build --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner + -DMLN_WITH_COVERAGE=ON + cmake --build build-linux-${{ matrix.variant.renderer }} --target mbgl-core mbgl-test-runner mbgl-render-test-runner mbgl-expression-test mbgl-render mbgl-benchmark-runner # mbgl-render (used for size test) & mbgl-benchmark-runner @@ -131,26 +131,26 @@ jobs: run: sccache --show-stats - name: Upload mbgl-render as artifact - if: matrix.renderer == 'drawable' && github.event_name == 'pull_request' + if: matrix.variant.renderer == 'opengl' && !matrix.variant.rust && github.event_name == 'pull_request' uses: actions/upload-artifact@v4 with: name: mbgl-render path: | - build/bin/mbgl-render + build-linux-${{ matrix.variant.renderer }}/bin/mbgl-render - name: Upload mbgl-benchmark-runner as artifact - if: matrix.renderer == 'drawable' && github.event_name == 'pull_request' + if: matrix.variant.renderer == 'opengl' && !matrix.variant.rust && github.event_name == 'pull_request' uses: actions/upload-artifact@v4 with: name: mbgl-benchmark-runner path: | - build/mbgl-benchmark-runner + build-linux-${{ matrix.variant.renderer }}/mbgl-benchmark-runner - name: Upload mbgl-render & mbgl-benchmark-runner to S3 - if: matrix.renderer == 'drawable' && github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME + if: matrix.variant.renderer == 'opengl' && !matrix.variant.rust && github.ref == 'refs/heads/main' && vars.OIDC_AWS_ROLE_TO_ASSUME run: | - aws s3 cp build/bin/mbgl-render s3://maplibre-native/mbgl-render-main - aws s3 cp build/mbgl-benchmark-runner s3://maplibre-native/mbgl-benchmark-runner-main + aws s3 cp build-linux-${{ matrix.variant.renderer }}/bin/mbgl-render s3://maplibre-native/mbgl-render-main + aws s3 cp build-linux-${{ matrix.variant.renderer }}/mbgl-benchmark-runner s3://maplibre-native/mbgl-benchmark-runner-main # CodeQL @@ -161,39 +161,39 @@ jobs: # unit tests - - run: chmod +x build/mbgl-test-runner + - run: chmod +x build-linux-${{ matrix.variant.renderer }}/mbgl-test-runner - name: Run C++ tests - continue-on-error: ${{ matrix.renderer == 'vulkan' }} - run: xvfb-run -a build/mbgl-test-runner + continue-on-error: ${{ matrix.variant.renderer == 'vulkan' }} + run: xvfb-run -a build-linux-${{ matrix.variant.renderer }}/mbgl-test-runner # render tests - - run: chmod +x build/mbgl-render-test-runner + - run: chmod +x build-linux-${{ matrix.variant.renderer }}/mbgl-render-test-runner - name: Run render test id: render_test run: | - renderer="${{ matrix.renderer }}" + renderer="${{ matrix.variant.renderer }}" if [[ "$renderer" == *-rust ]]; then renderer=${renderer%-rust} fi - xvfb-run -a build/mbgl-render-test-runner --manifestPath=metrics/linux-"$renderer".json + xvfb-run -a build-linux-${{ matrix.variant.renderer }}/mbgl-render-test-runner --manifestPath=metrics/linux-"$renderer".json - name: Upload render test result if: always() && steps.render_test.outcome == 'failure' uses: actions/upload-artifact@v4 with: - name: render-test-result-${{ matrix.renderer }} + name: render-test-result-${{ matrix.variant.renderer }} path: | - metrics/linux-${{ matrix.renderer }}.html + metrics/linux-${{ matrix.variant.renderer }}.html # expression tests - - run: chmod +x build/expression-test/mbgl-expression-test + - run: chmod +x build-linux-${{ matrix.variant.renderer }}/expression-test/mbgl-expression-test - name: Run expression test - run: build/expression-test/mbgl-expression-test + run: build-linux-${{ matrix.variant.renderer }}/expression-test/mbgl-expression-test - if: github.event_name == 'pull_request' uses: ./.github/actions/save-pr-number diff --git a/CMakePresets.json b/CMakePresets.json index ac422dcc5..b60e0de1d 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -106,14 +106,6 @@ "MLN_WITH_OPENGL": "ON" } }, - { - "name": "linux-opengl-core", - "inherits": "linux-opengl", - "cacheVariables": { - "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "OFF" - } - }, { "name": "linux-vulkan", "binaryDir": "${sourceDir}/build-linux-vulkan", @@ -124,14 +116,6 @@ "MLN_WITH_X11": "ON" } }, - { - "name": "linux-vulkan-core", - "inherits": "linux-vulkan", - "cacheVariables": { - "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "OFF" - } - }, { "name": "windows", "hidden": true, diff --git a/metrics/BUILD.bazel b/metrics/BUILD.bazel index 658d6c1cd..bc960b23f 100644 --- a/metrics/BUILD.bazel +++ b/metrics/BUILD.bazel @@ -22,7 +22,7 @@ filegroup( "ios-render-test-runner-style.json", # iOS only "linux-gcc8-release-metrics.json", "linux-gcc8-release-style.json", - "linux-drawable.json", + "linux-opengl.json", ], visibility = [ "//platform/ios/test/common:__pkg__", diff --git a/metrics/linux-drawable.json b/metrics/linux-opengl.json similarity index 100% rename from metrics/linux-drawable.json rename to metrics/linux-opengl.json diff --git a/platform/linux/cmake/find_static_library.cmake b/platform/linux/cmake/find_static_library.cmake index d3fd482a6..e80a518fe 100644 --- a/platform/linux/cmake/find_static_library.cmake +++ b/platform/linux/cmake/find_static_library.cmake @@ -1,5 +1,5 @@ -function(find_static_library result_var) - # Usage: find_static_library(VAR_NAME NAMES name1 [name2 ...]) +function(find_static_library result_list_var) + # Usage: find_static_library(LIST_VAR NAMES name1 [name2 ...]) set(options) set(one_value_args) set(multi_value_args NAMES) @@ -9,25 +9,24 @@ function(find_static_library result_var) message(FATAL_ERROR "find_static_library: NAMES argument required") endif() - # Clear any previous cached result for this variable - unset(${result_var} CACHE) - - # Temporarily force CMake to look only for .a + # Temporarily restrict to static libs set(_old_suffixes ${CMAKE_FIND_LIBRARY_SUFFIXES}) set(CMAKE_FIND_LIBRARY_SUFFIXES .a) - # Invoke find_library using the caller's var name - find_library(${result_var} NAMES ${FSL_NAMES}) + foreach(lib_name IN LISTS FSL_NAMES) + unset(_found_lib CACHE) + find_library(_found_lib NAMES ${lib_name}) + if(_found_lib) + message(STATUS "find_static_library: Found static [${lib_name}] -> ${_found_lib}") + # Append to result list and return early + set(${result_list_var} "${${result_list_var}};${_found_lib}" PARENT_SCOPE) + set(CMAKE_FIND_LIBRARY_SUFFIXES ${_old_suffixes}) + return() + endif() + endforeach() # Restore original suffix list set(CMAKE_FIND_LIBRARY_SUFFIXES ${_old_suffixes}) - # Check result - if(NOT ${result_var}) - message(FATAL_ERROR - "find_static_library: could not find any of [${FSL_NAMES}] as a .a") - endif() - - message(STATUS - "find_static_library: Found static [${FSL_NAMES}] -> ${${result_var}}") + message(FATAL_ERROR "find_static_library: could not find any of the specified static libraries: ${FSL_NAMES}") endfunction() diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index fde921dc7..5abc3f619 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -175,41 +175,40 @@ target_link_libraries( ${WEBP_LIBRARIES} $<$>:${ICUUC_LIBRARIES}> $<$>:${ICUI18N_LIBRARIES}> - $<$:$,$,mbgl-vendor-icu>> + $<$:mbgl-vendor-icu> PNG::PNG mbgl-vendor-nunicode mbgl-vendor-sqlite ) # Bundle system provided libraries -if(MLN_CORE_INCLUDE_DEPS AND NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") +if(NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND") message(STATUS "Found armerge: ${ARMERGE}") include(${CMAKE_CURRENT_LIST_DIR}/cmake/find_static_library.cmake) - find_static_library(PNG_STATIC_LIB NAMES png) - find_static_library(ZLIB_STATIC_LIB NAMES z) - find_static_library(JPEG_STATIC_LIB NAMES jpeg) - find_static_library(WEBP_STATIC_LIB NAMES webp) - find_static_library(CURL_STATIC_LIB NAMES curl) - find_static_library(UV_STATIC_LIB NAMES uv) - find_static_library(OPENSSL_STATIC_LIB NAMES ssl) - find_static_library(SQLITE_STATIC_LIB NAMES sqlite3) + set(STATIC_LIBS "") + + find_static_library(STATIC_LIBS NAMES png) + find_static_library(STATIC_LIBS NAMES z) + find_static_library(STATIC_LIBS NAMES jpeg) + find_static_library(STATIC_LIBS NAMES webp) + find_static_library(STATIC_LIBS NAMES curl) + find_static_library(STATIC_LIBS NAMES uv uv_a) + find_static_library(STATIC_LIBS NAMES ssl) + find_static_library(STATIC_LIBS NAMES crypto) add_custom_command( TARGET mbgl-core POST_BUILD COMMAND armerge --keep-symbols '.*' --output libmbgl-core-amalgam.a $ + $ + $ + $ + $ ${ICUUC_LIBRARY_DIRS}/libicuuc.a ${ICUUC_LIBRARY_DIRS}/libicudata.a ${ICUI18N_LIBRARY_DIRS}/libicui18n.a - ${PNG_STATIC_LIB} - ${ZLIB_STATIC_LIB} - ${JPEG_STATIC_LIB} - ${WEBP_STATIC_LIB} - ${CURL_STATIC_LIB} - ${UV_STATIC_LIB} - ${OPENSSL_STATIC_LIB} - ${SQLITE_STATIC_LIB} + ${STATIC_LIBS} ) endif() diff --git a/render-test/BUILD.bazel b/render-test/BUILD.bazel index d1ead91e0..790ab1b8c 100644 --- a/render-test/BUILD.bazel +++ b/render-test/BUILD.bazel @@ -45,7 +45,7 @@ cc_test( timeout = "long", args = [ "--manifestPath", - "metrics/linux-drawable.json", + "metrics/linux-opengl.json", ], data = [ "//metrics:render-test-files",