diff --git a/.github/scripts/install-linux-deps b/.github/scripts/install-linux-deps index 298c5c924..6e5805911 100755 --- a/.github/scripts/install-linux-deps +++ b/.github/scripts/install-linux-deps @@ -10,3 +10,4 @@ DEBIAN_FRONTEND=noninteractive sudo apt-get install -y \ libwebp-dev \ libopengl0 \ mesa-vulkan-drivers +cargo install armerge@2.2.0 diff --git a/.github/workflows/core-release.yml b/.github/workflows/core-release.yml index b5c60e265..63f36f826 100644 --- a/.github/workflows/core-release.yml +++ b/.github/workflows/core-release.yml @@ -82,10 +82,14 @@ jobs: cmake --build --preset linux-${{ matrix.renderer }}-core - name: Rename artifact - run: cp build-linux-${{ matrix.renderer }}/libmbgl-core.a libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + run: | + cp build-linux-${{ matrix.renderer }}/libmbgl-core.a libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + cp build-linux-${{ matrix.renderer }}/libmbgl-core-amalgam.a libmaplibre-native-core-amalgam-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a - name: Upload Linux artifact - run: gh release upload core-${{ github.sha }} libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + run: | + gh release upload core-${{ github.sha }} libmaplibre-native-core-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a + gh release upload core-${{ github.sha }} libmaplibre-native-core-amalgam-linux-${{ matrix.runner.arch }}-${{ matrix.renderer }}.a env: GH_TOKEN: ${{ github.token }} diff --git a/BUILD.bazel b/BUILD.bazel index ab6d783cf..135f3789f 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -138,6 +138,9 @@ cc_library( "@platforms//os:osx": [ "//vendor:icu", ], + "@platforms//os:linux": [ + "//vendor:sqlite", + ], "//conditions:default": [], }) + select({ ":metal_renderer": [ diff --git a/CMakePresets.json b/CMakePresets.json index 768fcdf01..13d9c70ed 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -109,7 +109,7 @@ "inherits": "linux-opengl", "cacheVariables": { "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "ON" + "MLN_USE_BUILTIN_ICU": "OFF" } }, { @@ -127,7 +127,7 @@ "inherits": "linux-vulkan", "cacheVariables": { "MLN_CORE_INCLUDE_DEPS": "ON", - "MLN_USE_BUILTIN_ICU": "ON" + "MLN_USE_BUILTIN_ICU": "OFF" } }, { diff --git a/platform/default/BUILD.bazel b/platform/default/BUILD.bazel index 6a5c82d8d..e22c12db9 100644 --- a/platform/default/BUILD.bazel +++ b/platform/default/BUILD.bazel @@ -145,6 +145,7 @@ cc_library( ], "@platforms//os:linux": [ "default-collator", + "//vendor:sqlite", ], "@platforms//os:osx": [ ":default-collator", diff --git a/platform/linux/BUILD.bazel b/platform/linux/BUILD.bazel index d34b503cb..0205f7f69 100644 --- a/platform/linux/BUILD.bazel +++ b/platform/linux/BUILD.bazel @@ -16,9 +16,7 @@ cc_library( copts = CPP_FLAGS + MAPLIBRE_FLAGS, linkopts = [ "-lGL", - "-lglfw", "-lX11", - "-lsqlite3", "-luv", "-lz", "-lcurl", @@ -33,6 +31,26 @@ cc_library( ], ) +cc_static_library( + name = "maplibre-linux-static", + visibility = ["//visibility:public"], + deps = [ + ":impl", + ], +) + +genrule( + name = "maplibre-linux-amalgam", + srcs = [":maplibre-linux-static"], + outs = ["libmaplibre-linux-amalgam.a"], + cmd_bash = """( + armerge --keep-symbols "^.+" --output $(OUTS) $(BINDIR)/platform/linux/libmaplibre-linux-static.a \ + $$(pkg-config --variable=libdir icu-uc)/libicuuc.a \ + $$(pkg-config --variable=libdir icu-uc)/libicudata.a \ + $$(pkg-config --variable=libdir icu-i18n)/libicui18n.a + )""" +) + sh_binary( name = "startxwrapper", srcs = ["xorg/startxwrapper"], diff --git a/platform/linux/linux.cmake b/platform/linux/linux.cmake index 0c54b5d33..49eaae01b 100644 --- a/platform/linux/linux.cmake +++ b/platform/linux/linux.cmake @@ -2,8 +2,6 @@ option(MLN_WITH_X11 "Build with X11 Support" ON) option(MLN_WITH_WAYLAND "Build with Wayland Support" OFF) find_package(CURL REQUIRED) -find_package(ICU OPTIONAL_COMPONENTS i18n) -find_package(ICU OPTIONAL_COMPONENTS uc) find_package(JPEG REQUIRED) find_package(PNG REQUIRED) find_package(PkgConfig REQUIRED) @@ -14,6 +12,9 @@ find_package(Threads REQUIRED) pkg_search_module(WEBP libwebp REQUIRED) pkg_search_module(LIBUV libuv REQUIRED) +pkg_search_module(ICUUC icu-uc) +pkg_search_module(ICUI18N icu-i18n) +find_program(ARMERGE NAMES armerge) if(MLN_WITH_WAYLAND) # See https://github.com/maplibre/maplibre-native/pull/2022 @@ -142,7 +143,7 @@ target_include_directories( include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake) include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake) -if(NOT ${ICU_FOUND} OR "${ICU_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) +if(NOT ${ICUUC_FOUND} OR "${ICUUC_VERSION}" VERSION_LESS 62.0 OR MLN_USE_BUILTIN_ICU) message(STATUS "ICU not found, too old or MLN_USE_BUILTIN_ICU requestd, using builtin.") set(MLN_USE_BUILTIN_ICU TRUE) @@ -165,14 +166,28 @@ target_link_libraries( ${X11_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${WEBP_LIBRARIES} - $<$>:ICU::i18n> - $<$>:ICU::uc> + $<$>:${ICUUC_LIBRARIES}> + $<$>:${ICUI18N_LIBRARIES}> $<$:$,$,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") + message(STATUS "Found armerge: ${ARMERGE}") + 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 + ) +endif() + add_subdirectory(${PROJECT_SOURCE_DIR}/bin) add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test) if(MLN_WITH_GLFW) diff --git a/vendor/BUILD.bazel b/vendor/BUILD.bazel index 73e83019f..9c79f2c1c 100644 --- a/vendor/BUILD.bazel +++ b/vendor/BUILD.bazel @@ -235,3 +235,12 @@ cc_library( strip_include_prefix = "unordered_dense/include/ankerl", visibility = ["//visibility:public"], ) + +cc_library( + name = "sqlite", + srcs = ["sqlite/src/sqlite3.c"], + hdrs = ["sqlite/include/sqlite3.h"], + include_prefix = "", + strip_include_prefix = "sqlite/include", + visibility = ["//visibility:public"], +) diff --git a/vendor/sqlite.cmake b/vendor/sqlite.cmake index f0efcf2a4..be3083c90 100644 --- a/vendor/sqlite.cmake +++ b/vendor/sqlite.cmake @@ -2,7 +2,7 @@ if(TARGET mbgl-vendor-sqlite) return() endif() -if(MLN_WITH_QT) +if(MLN_WITH_QT OR MLN_CORE_INCLUDE_DEPS) add_library(mbgl-vendor-sqlite OBJECT) else() add_library(mbgl-vendor-sqlite STATIC)