[qt] Improve CMake setup (#159)

This commit is contained in:
Tadej Novak
2021-10-19 17:51:14 +02:00
committed by GitHub
parent cae0fc272e
commit 66f32106a9
8 changed files with 1123 additions and 212 deletions

View File

@@ -1,4 +1,18 @@
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
option(MBGL_WITH_CORE_ONLY "Build only the core bits, no platform code" OFF)
option(MBGL_WITH_COVERAGE "Enable code coverage collection" OFF)
option(MBGL_WITH_QT "Build Mapbox GL Qt bindings" OFF)
option(MBGL_WITH_SANITIZER "Use [address|thread|undefined] here" OFF)
option(MBGL_WITH_RTTI "Compile with runtime type information" OFF)
option(MBGL_WITH_OPENGL "Build with OpenGL renderer" ON)
option(MBGL_WITH_EGL "Build with EGL renderer" OFF)
option(MBGL_WITH_WERROR "Make all compilation warnings errors" ON)
if (MBGL_WITH_QT)
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.13)
endif()
project("Mapbox GL Native" LANGUAGES CXX C)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
@@ -15,15 +29,6 @@ if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
endif()
option(MBGL_WITH_CORE_ONLY "Build only the core bits, no platform code" OFF)
option(MBGL_WITH_COVERAGE "Enable code coverage collection" OFF)
option(MBGL_WITH_QT "Build Mapbox GL Qt bindings" OFF)
option(MBGL_WITH_SANITIZER "Use [address|thread|undefined] here" OFF)
option(MBGL_WITH_RTTI "Compile with runtime type information" OFF)
option(MBGL_WITH_OPENGL "Build with OpenGL renderer" ON)
option(MBGL_WITH_EGL "Build with EGL renderer" OFF)
option(MBGL_WITH_WERROR "Make all compilation warnings errors" ON)
add_library(
mbgl-compiler-options INTERFACE
)
@@ -49,7 +54,7 @@ target_compile_options(
-fsanitize-blacklist=${UBSAN_BLACKLIST}>
$<$<STREQUAL:${MBGL_WITH_SANITIZER},undefined>:-fsanitize=float-divide-by-zero,
-fsanitize-blacklist=${UBSAN_BLACKLIST}>
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<NOT:$<BOOL:${MBGL_WITH_RTTI}>>>:-fno-rtti>
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<NOT:$<OR:$<BOOL:${MBGL_WITH_RTTI}>,$<CXX_COMPILER_ID:MSVC>>>>:-fno-rtti>
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<NOT:$<PLATFORM_ID:Windows>>>:-Wall>
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<NOT:$<PLATFORM_ID:Windows>>>:-Wshadow>
$<$<AND:$<COMPILE_LANGUAGE:CXX>,$<NOT:$<PLATFORM_ID:Windows>>>:-Wextra>
@@ -58,9 +63,15 @@ target_compile_options(
$<$<CXX_COMPILER_ID:GNU>:-Wno-error=maybe-uninitialized>
$<$<CXX_COMPILER_ID:GNU>:-Wno-error=return-type>
$<$<CXX_COMPILER_ID:GNU>:-Wno-error=unknown-pragmas>
$<$<CXX_COMPILER_ID:AppleClang>:-Wno-error=deprecated-declarations>
$<$<CXX_COMPILER_ID:AppleClang>:-Wno-error=unused-parameter>
$<$<CXX_COMPILER_ID:AppleClang>:-Wno-error=unused-property-ivar>
$<$<AND:$<CXX_COMPILER_ID:AppleClang>,$<NOT:$<BOOL:${MBGL_WITH_QT}>>>:-Wno-error=deprecated-declarations>
$<$<AND:$<CXX_COMPILER_ID:AppleClang>,$<NOT:$<BOOL:${MBGL_WITH_QT}>>>:-Wno-error=unused-parameter>
$<$<AND:$<CXX_COMPILER_ID:AppleClang>,$<NOT:$<BOOL:${MBGL_WITH_QT}>>>:-Wno-error=unused-property-ivar>
$<$<CXX_COMPILER_ID:MSVC>:/utf-8>
# $<$<CXX_COMPILER_ID:MSVC>:/WX> # all warnings as errors
$<$<CXX_COMPILER_ID:MSVC>:/wd4068> # pragma
$<$<CXX_COMPILER_ID:MSVC>:/wd4244> # types
$<$<CXX_COMPILER_ID:MSVC>:/wd4828> # encoding
$<$<CXX_COMPILER_ID:MSVC>:/D_CRT_SECURE_NO_WARNINGS>
)
target_link_libraries(
@@ -86,14 +97,6 @@ set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_MINSIZEREL ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
if(MBGL_WITH_QT)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core REQUIRED)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
endif()
add_library(
mbgl-core STATIC
${PROJECT_SOURCE_DIR}/include/mbgl/actor/actor.hpp
@@ -829,7 +832,7 @@ add_library(
)
if(MBGL_WITH_OPENGL)
message("-- Configuring GL-Native with OpenGL renderer backend")
message(STATUS "Configuring GL-Native with OpenGL renderer backend")
target_compile_definitions(
mbgl-core
PRIVATE MBGL_RENDER_BACKEND_OPENGL=1

View File

@@ -3,7 +3,7 @@ if(MBGL_IOS_RENDER_TEST)
initialize_ios_target(mbgl-vendor-zip-archive)
if(MBGL_WITH_OPENGL)
message("-- Setting up test data for iOS render test with OpenGL renderer")
message(STATUS "Setting up test data for iOS render test with OpenGL renderer")
set(PREPARE_CMD "${PROJECT_SOURCE_DIR}/render-test/ios/setup_test_data.sh")
endif()
add_custom_target(RenderTestApp-prepare COMMAND ${PREPARE_CMD} ${CMAKE_CURRENT_BINARY_DIR} WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})

File diff suppressed because it is too large Load Diff

View File

@@ -92,7 +92,7 @@ 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)
message("-- ICU not found or too old, using builtin.")
message(STATUS "ICU not found or too old, using builtin.")
set(MBGL_USE_BUILTIN_ICU TRUE)
include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake)

View File

@@ -1,5 +1,5 @@
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/node_modules/@mapbox/cmake-node-module/module.cmake)
message("-- Not building node bindings, dependencies not found. Run 'npm update'.")
message(WARNING "Not building node bindings, dependencies not found. Run 'npm update'.")
return()
endif()

1
platform/qt/VERSION Normal file
View File

@@ -0,0 +1 @@
2.0.0

View File

@@ -1,12 +1,43 @@
# Note: Using Sqlite instead of QSqlDatabase for better compatibility.
message(STATUS "Configuring GL-Native with Qt bindings")
# VLC-Qt version number
file(READ "${PROJECT_SOURCE_DIR}/platform/qt/VERSION" MBGL_QT_VERSION)
string(REGEX REPLACE "\n" "" MBGL_QT_VERSION "${MBGL_QT_VERSION}") # get rid of the newline at the end
set(MBGL_QT_VERSION_COMPATIBILITY 2.0.0)
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
message(STATUS "Version ${MBGL_QT_VERSION}")
option(MBGL_QT_STATIC "Build Mapbox GL Qt bindings staticly" OFF)
option(MBGL_QT_LIBRARY_ONLY "Build only libraries" OFF)
option(MBGL_QT_WITH_INTERNAL_SQLITE "Build Mapbox GL Qt bindings with internal sqlite" $<NOT:$<BOOL:${MBGL_QT_STATIC}>>)
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
find_package(Qt${QT_VERSION_MAJOR}
COMPONENTS Gui
Network
OpenGL
OpenGLWidgets
Widgets
REQUIRED)
if (Qt6_FOUND)
find_package(Qt${QT_VERSION_MAJOR}OpenGLWidgets REQUIRED)
endif()
if(NOT MBGL_QT_WITH_INTERNAL_SQLITE)
find_package(Qt${QT_VERSION_MAJOR}Sql REQUIRED)
else()
message(STATUS "Using internal sqlite")
include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
option(MBGL_QT_WITH_INTERNAL_ICU "Build Mapbox GL Qt bindings with internal ICU" OFF)
if(NOT MBGL_QT_WITH_INTERNAL_ICU)
find_package(ICU COMPONENTS uc REQUIRED)
else()
message(STATUS "Using internal ICU")
include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake)
endif()
endif()
if(MSVC)
add_definitions("/DQT_COMPILING_QIMAGE_COMPAT_CPP")
@@ -14,21 +45,21 @@ if(MSVC)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
add_definitions("-DQT_COMPILING_QIMAGE_COMPAT_CPP")
add_definitions("-D_USE_MATH_DEFINES")
add_definitions("-Wno-deprecated-declarations")
add_definitions("-Wno-inconsistent-missing-override")
add_definitions("-Wno-macro-redefined")
add_definitions("-Wno-microsoft-exception-spec")
add_definitions("-Wno-unknown-argument")
add_definitions("-Wno-unknown-warning-option")
add_definitions("-Wno-unused-command-line-argument")
add_definitions("-Wno-unused-local-typedef")
add_definitions("-Wno-unused-private-field")
endif()
if(ANDROID)
message(STATUS "Building for ABI: ${ANDROID_ABI}")
set(CMAKE_STATIC_LIBRARY_SUFFIX "_${ANDROID_ABI}.a")
elseif(MSVC AND CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_STATIC_LIBRARY_SUFFIX "d.lib")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_STATIC_LIBRARY_SUFFIX "d.a")
endif()
target_sources(
mbgl-core
PRIVATE
${PROJECT_SOURCE_DIR}/platform/$<IF:$<PLATFORM_ID:Windows>,qt/src/bidi.cpp,default/src/mbgl/text/bidi.cpp>
${PROJECT_SOURCE_DIR}/platform/$<IF:$<PLATFORM_ID:Linux>,default/src/mbgl/text/bidi.cpp,qt/src/bidi.cpp>
${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gfx/headless_backend.hpp
${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gfx/headless_frontend.hpp
${PROJECT_SOURCE_DIR}/platform/default/include/mbgl/gl/headless_backend.hpp
@@ -50,7 +81,7 @@ target_sources(
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp
${PROJECT_SOURCE_DIR}/platform/$<IF:$<BOOL:${MBGL_QT_WITH_INTERNAL_SQLITE}>,default/src/mbgl/storage/sqlite3.cpp,qt/src/sqlite3.cpp>
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp
${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/monotonic_timer.cpp
${PROJECT_SOURCE_DIR}/platform/qt/src/async_task.cpp
@@ -86,27 +117,57 @@ target_include_directories(
PRIVATE ${PROJECT_SOURCE_DIR}/platform/default/include
)
include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake)
include(${PROJECT_SOURCE_DIR}/vendor/nunicode.cmake)
include(${PROJECT_SOURCE_DIR}/vendor/sqlite.cmake)
if(MBGL_QT_STATIC)
install(TARGETS mbgl-vendor-csscolorparser
ARCHIVE DESTINATION lib
)
install(TARGETS mbgl-vendor-nunicode
ARCHIVE DESTINATION lib
)
install(TARGETS mbgl-vendor-parsedate
ARCHIVE DESTINATION lib
)
endif()
set_property(TARGET mbgl-core PROPERTY AUTOMOC ON)
target_link_libraries(
mbgl-core
PRIVATE
$<$<NOT:$<PLATFORM_ID:Windows>>:z>
$<$<NOT:$<PLATFORM_ID:Windows>>:mbgl-vendor-icu>
Qt${QT_VERSION_MAJOR}::Core
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::Network
Qt${QT_VERSION_MAJOR}::OpenGL
$<IF:$<BOOL:${MBGL_QT_WITH_INTERNAL_SQLITE}>,mbgl-vendor-sqlite,Qt${QT_VERSION_MAJOR}::Sql>
$<$<PLATFORM_ID:Linux>:$<IF:$<BOOL:${MBGL_QT_WITH_INTERNAL_ICU}>,mbgl-vendor-icu,ICU::uc>>
mbgl-vendor-nunicode
mbgl-vendor-sqlite
)
add_library(
qmapboxgl SHARED
if(MBGL_QT_STATIC)
install(TARGETS mbgl-core
ARCHIVE DESTINATION lib
)
endif()
set(qmapboxgl_headers
${PROJECT_SOURCE_DIR}/platform/qt/include/QMapbox
${PROJECT_SOURCE_DIR}/platform/qt/include/QMapboxGL
${PROJECT_SOURCE_DIR}/platform/qt/include/qmapbox.hpp
${PROJECT_SOURCE_DIR}/platform/qt/include/qmapboxgl.hpp
)
if(MBGL_QT_STATIC)
add_library(qmapboxgl STATIC)
else()
add_library(qmapboxgl SHARED)
endif()
target_sources(
qmapboxgl
PRIVATE
${qmapboxgl_headers}
${PROJECT_SOURCE_DIR}/platform/qt/src/qmapbox.cpp
${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl.cpp
${PROJECT_SOURCE_DIR}/platform/qt/src/qmapboxgl_map_observer.cpp
@@ -123,6 +184,23 @@ add_library(
${PROJECT_SOURCE_DIR}/platform/qt/src/qt_geojson.hpp
)
# Linux/Mac: Set framework, version and headers
set_target_properties(
qmapboxgl PROPERTIES
AUTOMOC ON
OUTPUT_NAME QMapboxGL
VERSION ${MBGL_QT_VERSION}
SOVERSION ${MBGL_QT_VERSION_COMPATIBILITY}
PUBLIC_HEADER "${qmapboxgl_headers}"
)
if (NOT MBGL_QT_STATIC)
set_target_properties(
qmapboxgl PROPERTIES
FRAMEWORK ON
FRAMEWORK_VERSION A
)
endif()
# FIXME: Because of rapidjson conversion
target_include_directories(
qmapboxgl
@@ -136,7 +214,8 @@ target_include_directories(
target_compile_definitions(
qmapboxgl
PRIVATE QT_BUILD_MAPBOXGL_LIB
PRIVATE
$<IF:$<BOOL:${MBGL_QT_STATIC}>,QT_MAPBOXGL_STATIC,QT_BUILD_MAPBOXGL_LIB>
)
target_link_libraries(
@@ -148,82 +227,109 @@ target_link_libraries(
mbgl-core
)
add_executable(
mbgl-qt
${PROJECT_SOURCE_DIR}/platform/qt/app/main.cpp
${PROJECT_SOURCE_DIR}/platform/qt/app/mapwindow.cpp
${PROJECT_SOURCE_DIR}/platform/qt/app/mapwindow.hpp
${PROJECT_SOURCE_DIR}/platform/qt/resources/common.qrc
)
if(MSVC)
if(MBGL_QT_STATIC)
set_target_properties(mbgl-vendor-csscolorparser PROPERTIES COMPILE_PDB_NAME mbgl-vendor-csscolorparserd)
set_target_properties(mbgl-vendor-nunicode PROPERTIES COMPILE_PDB_NAME mbgl-vendor-nunicoded)
set_target_properties(mbgl-vendor-parsedate PROPERTIES COMPILE_PDB_NAME mbgl-vendor-parsedated)
# Qt public API should keep compatibility with old compilers for legacy systems
set_property(TARGET mbgl-qt PROPERTY CXX_STANDARD 98)
set_target_properties(mbgl-core PROPERTIES COMPILE_PDB_NAME mbgl-cored)
set_target_properties(qmapboxgl PROPERTIES COMPILE_PDB_NAME QMapboxGLd)
target_link_libraries(
mbgl-qt
PRIVATE
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::OpenGLWidgets
mbgl-compiler-options
qmapboxgl
)
install(FILES $<TARGET_FILE_DIR:mbgl-vendor-csscolorparser>/mbgl-vendor-csscolorparserd.pdb CONFIGURATIONS "Debug" DESTINATION lib)
install(FILES $<TARGET_FILE_DIR:mbgl-vendor-nunicode>/mbgl-vendor-nunicoded.pdb CONFIGURATIONS "Debug" DESTINATION lib)
install(FILES $<TARGET_FILE_DIR:mbgl-vendor-parsedate>/mbgl-vendor-parsedated.pdb CONFIGURATIONS "Debug" DESTINATION lib)
add_executable(
mbgl-test-runner
${PROJECT_SOURCE_DIR}/platform/qt/test/main.cpp
)
target_include_directories(
mbgl-test-runner
PUBLIC ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/test/include
)
target_compile_definitions(
mbgl-test-runner
PRIVATE WORK_DIRECTORY=${PROJECT_SOURCE_DIR}
)
if (MSVC)
target_link_libraries(
mbgl-test-runner
PRIVATE
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::OpenGL
mbgl-compiler-options
)
else()
target_link_libraries(
mbgl-test-runner
PRIVATE
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::OpenGL
mbgl-compiler-options
pthread
)
install(FILES $<TARGET_FILE_DIR:mbgl-core>/mbgl-cored.pdb CONFIGURATIONS "Debug" DESTINATION lib)
install(FILES $<TARGET_FILE_DIR:qmapboxgl>/QMapboxGLd.pdb CONFIGURATIONS "Debug" DESTINATION lib)
else()
install(FILES $<TARGET_PDB_FILE:qmapboxgl> CONFIGURATIONS "Debug" DESTINATION bin)
endif()
endif()
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
install(TARGETS qmapboxgl
RUNTIME DESTINATION bin
FRAMEWORK DESTINATION lib
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
INCLUDES DESTINATION include
PUBLIC_HEADER DESTINATION include
)
if(NOT MBGL_QT_LIBRARY_ONLY)
add_executable(
mbgl-qt
${PROJECT_SOURCE_DIR}/platform/qt/app/main.cpp
${PROJECT_SOURCE_DIR}/platform/qt/app/mapwindow.cpp
${PROJECT_SOURCE_DIR}/platform/qt/app/mapwindow.hpp
${PROJECT_SOURCE_DIR}/platform/qt/resources/common.qrc
)
# Qt public API should keep compatibility with old compilers for legacy systems
set_property(TARGET mbgl-qt PROPERTY CXX_STANDARD 98)
set_property(TARGET mbgl-qt PROPERTY AUTOMOC ON)
target_compile_definitions(
mbgl-qt
PRIVATE
$<$<BOOL:${MBGL_QT_STATIC}>:QT_MAPBOXGL_STATIC>
)
target_link_libraries(
mbgl-qt
PRIVATE
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Gui
$<$<BOOL:${Qt6_FOUND}>:Qt${QT_VERSION_MAJOR}::OpenGLWidgets>
mbgl-compiler-options
qmapboxgl
)
add_executable(
mbgl-test-runner
${PROJECT_SOURCE_DIR}/platform/qt/test/main.cpp
)
target_include_directories(
mbgl-test-runner
PUBLIC ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/test/include
)
target_compile_definitions(
mbgl-test-runner
PRIVATE WORK_DIRECTORY=${PROJECT_SOURCE_DIR}
)
target_link_libraries(
mbgl-test-runner
PRIVATE -Wl,-force_load mbgl-test
)
elseif(MSVC)
target_link_options(
mbgl-test-runner
PRIVATE /WHOLEARCHIVE:../../lib/mbgl-test.lib
)
target_link_libraries(
mbgl-test-runner
PRIVATE mbgl-test
)
else()
target_link_libraries(
mbgl-test-runner
PRIVATE -Wl,--whole-archive mbgl-test -Wl,--no-whole-archive
PRIVATE
Qt${QT_VERSION_MAJOR}::Widgets
Qt${QT_VERSION_MAJOR}::Gui
Qt${QT_VERSION_MAJOR}::OpenGL
mbgl-compiler-options
$<$<NOT:$<BOOL:MSVC>>:pthread>
)
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
target_link_libraries(
mbgl-test-runner
PRIVATE -Wl,-force_load mbgl-test
)
elseif(MSVC)
target_link_options(
mbgl-test-runner
PRIVATE /WHOLEARCHIVE:mbgl-test.lib
)
target_link_libraries(
mbgl-test-runner
PRIVATE mbgl-test
)
else()
target_link_libraries(
mbgl-test-runner
PRIVATE -Wl,--whole-archive mbgl-test -Wl,--no-whole-archive
)
endif()
endif()
find_program(MBGL_QDOC NAMES qdoc)
@@ -241,4 +347,6 @@ if(MBGL_QDOC)
)
endif()
add_test(NAME mbgl-test-runner COMMAND mbgl-test-runner WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
if(NOT MBGL_QT_LIBRARY_ONLY)
add_test(NAME mbgl-test-runner COMMAND mbgl-test-runner WORKING_DIRECTORY ${PROJECT_SOURCE_DIR})
endif()

View File

@@ -225,6 +225,7 @@ target_link_libraries(
target_link_libraries(
mbgl-test
PUBLIC mbgl-vendor-googletest
$<$<AND:$<PLATFORM_ID:Windows>,$<BOOL:MINGW>>:psapi>
)
set_property(TARGET mbgl-test PROPERTY FOLDER Core)