Improve CMake build setup Harfbuzz and Freetype deps (#3879)

This commit is contained in:
Bart Louwers
2025-10-15 21:58:24 +02:00
committed by GitHub
parent 87a67fb18e
commit 54565f081b
7 changed files with 112 additions and 44 deletions

View File

@@ -73,14 +73,16 @@ jobs:
deployment_target: 12.0 deployment_target: 12.0
deployment_arch: "x86_64;arm64" deployment_arch: "x86_64;arm64"
compiler: "" compiler: ""
- name: macOS_LLVM # disabled due to https://github.com/llvm/llvm-project/issues/77653
os: macos-14 # https://github.com/maplibre/maplibre-native/pull/3879#issuecomment-3406495279
build_type: RelWithDebInfo # - name: macOS_LLVM
qt_version: 6.9.1 # os: macos-14
qt_target: desktop # build_type: RelWithDebInfo
deployment_target: 12.0 # qt_version: 6.9.1
deployment_arch: "arm64" # qt_target: desktop
compiler: "llvm" # deployment_target: 12.0
# deployment_arch: "arm64"
# compiler: "llvm"
- name: win64_msvc2022 - name: win64_msvc2022
os: windows-2022 os: windows-2022
build_type: "RelWithDebInfo" build_type: "RelWithDebInfo"
@@ -191,6 +193,11 @@ jobs:
key: Qt_${{ matrix.name }}_${{ matrix.qt_version }} key: Qt_${{ matrix.name }}_${{ matrix.qt_version }}
max-size: 200M max-size: 200M
- name: Print cmake version
run: |
cmake --version
which cmake
- name: Build maplibre-native (macOS) - name: Build maplibre-native (macOS)
if: runner.os == 'macOS' && matrix.qt_target == 'desktop' if: runner.os == 'macOS' && matrix.qt_target == 'desktop'
run: | run: |

View File

@@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.24 FATAL_ERROR) cmake_minimum_required(VERSION 3.25 FATAL_ERROR)
option(MLN_WITH_CORE_ONLY "Build only the core bits, no platform code" OFF) option(MLN_WITH_CORE_ONLY "Build only the core bits, no platform code" OFF)
option(MLN_WITH_CLANG_TIDY "Build with clang-tidy checks enabled" OFF) option(MLN_WITH_CLANG_TIDY "Build with clang-tidy checks enabled" OFF)
@@ -1342,10 +1342,14 @@ if (MLN_TEXT_SHAPING_HARFBUZZ)
) )
include(${PROJECT_SOURCE_DIR}/vendor/freetype.cmake) include(${PROJECT_SOURCE_DIR}/vendor/freetype.cmake)
include(${PROJECT_SOURCE_DIR}/vendor/harfbuzz.cmake) include(${PROJECT_SOURCE_DIR}/vendor/harfbuzz.cmake)
set(SHAPE_TARGETS
freetype target_include_directories(
harfbuzz mbgl-core SYSTEM
PUBLIC
${PROJECT_SOURCE_DIR}/vendor/freetype/include
${PROJECT_SOURCE_DIR}/vendor/harfbuzz/src
) )
endif() endif()
target_sources( target_sources(
@@ -1457,7 +1461,8 @@ target_link_libraries(
mbgl-vendor-wagyu mbgl-vendor-wagyu
$<$<BOOL:${MLN_WITH_METAL}>:mbgl-vendor-metal-cpp> $<$<BOOL:${MLN_WITH_METAL}>:mbgl-vendor-metal-cpp>
$<IF:$<BOOL:${MLN_USE_RUST}>,mbgl-rustutils,mbgl-vendor-csscolorparser> $<IF:$<BOOL:${MLN_USE_RUST}>,mbgl-rustutils,mbgl-vendor-csscolorparser>
${SHAPE_TARGETS} # from harfbuzz.cmake $<$<BOOL:${MLN_TEXT_SHAPING_HARFBUZZ}>:mbgl-freetype>
$<$<BOOL:${MLN_TEXT_SHAPING_HARFBUZZ}>:mbgl-harfbuzz>
PUBLIC PUBLIC
MapLibreNative::Base MapLibreNative::Base
mbgl-vendor-expected-lite mbgl-vendor-expected-lite
@@ -1498,7 +1503,6 @@ set(EXPORT_TARGETS
mbgl-vendor-metal-cpp mbgl-vendor-metal-cpp
mbgl-vendor-filesystem mbgl-vendor-filesystem
unordered_dense unordered_dense
${SHAPE_TARGETS} # from harfbuzz.cmake
) )
if(MLN_USE_RUST) if(MLN_USE_RUST)
@@ -1507,6 +1511,10 @@ else()
list(APPEND EXPORT_TARGETS mbgl-vendor-csscolorparser) list(APPEND EXPORT_TARGETS mbgl-vendor-csscolorparser)
endif() endif()
if(MLN_TEXT_SHAPING_HARFBUZZ)
list(APPEND EXPORT_TARGETS mbgl-freetype mbgl-harfbuzz)
endif()
export(TARGETS ${EXPORT_TARGETS} FILE MapboxCoreTargets.cmake) export(TARGETS ${EXPORT_TARGETS} FILE MapboxCoreTargets.cmake)
if(MLN_WITH_VULKAN) if(MLN_WITH_VULKAN)

View File

@@ -211,9 +211,9 @@ if(NOT MLN_USE_BUILTIN_ICU AND NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND")
POST_BUILD POST_BUILD
COMMAND armerge --keep-symbols 'mbgl.*' --output libmbgl-core-amalgam.a COMMAND armerge --keep-symbols 'mbgl.*' --output libmbgl-core-amalgam.a
$<TARGET_FILE:mbgl-core> $<TARGET_FILE:mbgl-core>
$<TARGET_FILE:freetype> $<TARGET_FILE:mbgl-freetype>
$<TARGET_FILE:mbgl-vendor-csscolorparser> $<TARGET_FILE:mbgl-vendor-csscolorparser>
$<TARGET_FILE:harfbuzz> $<TARGET_FILE:mbgl-harfbuzz>
$<TARGET_FILE:mbgl-vendor-nunicode> $<TARGET_FILE:mbgl-vendor-nunicode>
$<TARGET_FILE:mbgl-vendor-sqlite> $<TARGET_FILE:mbgl-vendor-sqlite>
$<TARGET_FILE:mbgl-vendor-parsedate> $<TARGET_FILE:mbgl-vendor-parsedate>

View File

@@ -160,9 +160,9 @@ if(NOT "${ARMERGE}" STREQUAL "ARMERGE-NOTFOUND")
POST_BUILD POST_BUILD
COMMAND armerge --keep-symbols 'mbgl.*' --output libmbgl-core-amalgam.a COMMAND armerge --keep-symbols 'mbgl.*' --output libmbgl-core-amalgam.a
$<TARGET_FILE:mbgl-core> $<TARGET_FILE:mbgl-core>
$<TARGET_FILE:freetype> $<TARGET_FILE:mbgl-freetype>
$<TARGET_FILE:mbgl-vendor-csscolorparser> $<TARGET_FILE:mbgl-vendor-csscolorparser>
$<TARGET_FILE:harfbuzz> $<TARGET_FILE:mbgl-harfbuzz>
$<TARGET_FILE:mbgl-vendor-parsedate> $<TARGET_FILE:mbgl-vendor-parsedate>
${STATIC_LIBS} ${STATIC_LIBS}
) )

View File

@@ -212,12 +212,14 @@ if(NOT MLN_QT_LIBRARY_ONLY)
if(CMAKE_SYSTEM_NAME STREQUAL Darwin) if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
target_link_libraries( target_link_libraries(
mbgl-test-runner mbgl-test-runner
PRIVATE -Wl,-force_load mbgl-test PRIVATE
-Wl,-force_load mbgl-test
) )
else() else()
target_link_libraries( target_link_libraries(
mbgl-test-runner mbgl-test-runner
PRIVATE $<LINK_LIBRARY:WHOLE_ARCHIVE,mbgl-test> PRIVATE
$<LINK_LIBRARY:WHOLE_ARCHIVE,mbgl-test>
) )
endif() endif()

73
vendor/freetype.cmake vendored
View File

@@ -1,24 +1,71 @@
if(TARGET freetype) if(TARGET mbgl-freetype)
return() return()
endif() endif()
if (MLN_TEXT_SHAPING_HARFBUZZ) if (MLN_TEXT_SHAPING_HARFBUZZ)
set(FT_DISABLE_BROTLI ON CACHE BOOL "freetype option") add_library(mbgl-freetype STATIC
set(FT_REQUIRE_BROTLI OFF CACHE BOOL "freetype option") ${CMAKE_CURRENT_LIST_DIR}/freetype/src/autofit/autofit.c
set(FT_DISABLE_ZLIB ON CACHE BOOL "freetype option") ${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftbase.c
set(FT_REQUIRE_ZLIB OFF CACHE BOOL "freetype option") ${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftbbox.c
add_subdirectory(vendor/freetype) ${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftbdf.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftbitmap.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftcid.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftfstype.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftgasp.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftglyph.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftgxval.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftinit.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftmm.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftotval.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftpatent.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftpfr.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftstroke.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftsynth.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/fttype1.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftwinfnt.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/bdf/bdf.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/bzip2/ftbzip2.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/cache/ftcache.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/cff/cff.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/cid/type1cid.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/gzip/ftgzip.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/lzw/ftlzw.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/pcf/pcf.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/pfr/pfr.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/psaux/psaux.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/pshinter/pshinter.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/psnames/psnames.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/raster/raster.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/sdf/sdf.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/sfnt/sfnt.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/smooth/smooth.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/svg/svg.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/truetype/truetype.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/type1/type1.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/type42/type42.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/winfonts/winfnt.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftsystem.c
${CMAKE_CURRENT_LIST_DIR}/freetype/src/base/ftdebug.c
)
target_include_directories(mbgl-freetype
PUBLIC
${CMAKE_CURRENT_LIST_DIR}/freetype/include
)
target_compile_definitions(mbgl-freetype PRIVATE
FT2_BUILD_LIBRARY
FT_DISABLE_BROTLI
FT_REQUIRE_BROTLI=0
FT_DISABLE_ZLIB
FT_REQUIRE_ZLIB=0
)
set_target_properties( set_target_properties(
freetype mbgl-freetype
PROPERTIES PROPERTIES
INTERFACE_MAPLIBRE_NAME "freetype" INTERFACE_MAPLIBRE_NAME "freetype"
INTERFACE_MAPLIBRE_URL "https://github.com/freetype/freetype" INTERFACE_MAPLIBRE_URL "https://github.com/freetype/freetype"
INTERFACE_MAPLIBRE_AUTHOR "David Turner, Robert Wilhelm, Werner Lemberg and FreeType contributors" INTERFACE_MAPLIBRE_AUTHOR "David Turner, Robert Wilhelm, Werner Lemberg and FreeType contributors"
INTERFACE_MAPLIBRE_LICENSE ${PROJECT_SOURCE_DIR}/vendor/freetype/docs/FTL.TXT INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/freetype/docs/FTL.TXT
)
target_include_directories(
mbgl-core SYSTEM
PUBLIC vendor/freetype/include
) )
endif() endif()

26
vendor/harfbuzz.cmake vendored
View File

@@ -1,22 +1,26 @@
if(TARGET harfbuzz) if(TARGET mbgl-harfbuzz)
return() return()
endif() endif()
if (MLN_TEXT_SHAPING_HARFBUZZ) if (MLN_TEXT_SHAPING_HARFBUZZ)
add_subdirectory(vendor/harfbuzz) add_library(mbgl-harfbuzz STATIC
${CMAKE_CURRENT_LIST_DIR}/harfbuzz/src/harfbuzz.cc
)
target_compile_definitions(harfbuzz PRIVATE -DHAVE_FREETYPE) target_include_directories(mbgl-harfbuzz
PUBLIC
${CMAKE_CURRENT_LIST_DIR}/harfbuzz/src
)
target_link_libraries(mbgl-harfbuzz PRIVATE mbgl-freetype)
target_include_directories(mbgl-harfbuzz PRIVATE ${CMAKE_CURRENT_LIST_DIR}/freetype/include)
target_compile_definitions(mbgl-harfbuzz PRIVATE -DHAVE_FREETYPE)
set_target_properties( set_target_properties(
harfbuzz mbgl-harfbuzz
PROPERTIES PROPERTIES
INTERFACE_MAPLIBRE_NAME "harfbuzz" INTERFACE_MAPLIBRE_NAME "harfbuzz"
INTERFACE_MAPLIBRE_URL "https://github.com/harfbuzz/harfbuzz" INTERFACE_MAPLIBRE_URL "https://github.com/harfbuzz/harfbuzz"
INTERFACE_MAPLIBRE_AUTHOR ${PROJECT_SOURCE_DIR}/vendor/harfbuzz/AUTHORS INTERFACE_MAPLIBRE_AUTHOR ${CMAKE_CURRENT_LIST_DIR}/harfbuzz/AUTHORS
INTERFACE_MAPLIBRE_LICENSE ${PROJECT_SOURCE_DIR}/vendor/harfbuzz/COPYING INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/harfbuzz/COPYING
)
target_include_directories(
mbgl-core SYSTEM
PUBLIC vendor/harfbuzz/src
) )
endif() endif()