cmake_minimum_required(VERSION 3.15.0) project(mapnik VERSION 3.0.24 HOMEPAGE_URL "https://mapnik.org/" DESCRIPTION "Mapnik is an open source toolkit for developing mapping applications" LANGUAGES CXX ) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") option(BUILD_SHARED_LIBS "build mapnik dynamic" ON) option(BUILD_TEST "builds the tests" ON) option(USE_EXTERNAL_MAPBOX_GEOMETRY "Use a external mapnik/geometry.hpp. If off, use the submodule" OFF) option(USE_EXTERNAL_MAPBOX_POLYLABEL "Use a external mapnik/polylabel. If off, use the submodule" OFF) option(USE_EXTERNAL_MAPBOX_PROTOZERO "Use a external mapnik/protozero. If off, use the submodule" OFF) option(USE_EXTERNAL_MAPBOX_VARIANT "Use a external mapnik/variant. If off, use the submodule" OFF) option(USE_JPEG "adds jpeg support" ON) option(USE_PNG "adds png support" ON) option(USE_TIFF "adds tiff support" ON) option(USE_WEBP "adds webp support" ON) option(USE_LIBXML2 "adds libxml2 support" ON) option(USE_CAIRO "adds the cairo renderer" ON) option(USE_PROJ4 "adds proj4 support" ON) option(USE_GRID_RENDERER "adds grid renderer" ON) option(USE_SVG_RENDERER "adds grid renderer" ON) option(USE_PLUGIN_INPUT_CSV "adds plugin input csv" ON) option(USE_PLUGIN_INPUT_GDAL "adds plugin input gdal" ON) option(USE_PLUGIN_INPUT_GEOBUF "adds plugin input geobuf" ON) option(USE_PLUGIN_INPUT_GEOJSON "adds plugin input geojson" ON) option(USE_PLUGIN_INPUT_OGR "adds plugin input ogr" ON) option(USE_PLUGIN_INPUT_PGRASTER "adds plugin input pgraster" ON) option(USE_PLUGIN_INPUT_POSTGIS "adds plugin input postgis" ON) option(USE_PLUGIN_INPUT_RASTER "adds plugin input raster" ON) option(USE_PLUGIN_INPUT_SHAPE "adds plugin input shape" ON) option(USE_PLUGIN_INPUT_SQLITE "adds plugin input sqlite" ON) option(USE_PLUGIN_INPUT_TOPOJSON "adds plugin input topojson" ON) option(BUILD_DEMO_VIEWER "builds the demo viewer" ON) option(BUILD_DEMO_CPP "builds the demo c++ application" ON) option(BUILD_UTILITY_GEOMETRY_TO_WKB "builds the utility program geometry_to_wkb" ON) option(BUILD_UTILITY_MAPNIK_INDEX "builds the utility program mapnik_index" ON) option(BUILD_UTILITY_MAPNIK_RENDER "builds the utility program mapnik_render" ON) option(BUILD_UTILITY_OGRINDEX "builds the utility program ogrindex" OFF) option(BUILD_UTILITY_PGSQL2SQLITE "builds the utility program pgsql2sqlite" ON) option(BUILD_UTILITY_SHAPEINDEX "builds the utility program shapeindex" ON) option(BUILD_UTILITY_SVG2PNG "builds the utility program svg2png" ON) set(PLUGINS_INSTALL_DIR bin/plugins/input CACHE STRING "installs the plugins in the specified directory") get_filename_component(ABSOLUTE_PLUGINS_INSTALL_DIR ${PLUGINS_INSTALL_DIR} ABSOLUTE) message("Installing plugins to ${ABSOLUTE_PLUGINS_INSTALL_DIR}") set(FONTS_INSTALL_DIR bin/fonts CACHE STRING "installs the fonts in the specified directory") get_filename_component(ABSOLUTE_FONTS_INSTALL_DIR ${FONTS_INSTALL_DIR} ABSOLUTE) message("Installing fonts to ${FONTS_INSTALL_DIR}") set(CMAKE_CXX_STANDARD 14) find_package(Boost 1.74 REQUIRED COMPONENTS filesystem system regex) find_package(ICU REQUIRED COMPONENTS uc) find_package(Freetype REQUIRED) find_package(harfbuzz CONFIG REQUIRED) if(USE_EXTERNAL_MAPBOX_GEOMETRY) # this is used to provide a way to specify include dirs with CACHE VARIABLES if(NOT MAPBOX_GEOMETRY_INCLUDE_DIRS) message(STATUS "Searching for the include dir of mapbox/geometry.hpp") find_path(MAPBOX_GEOMETRY_INCLUDE_DIRS "mapbox/geometry.hpp" REQUIRED) endif() else() set(MAPBOX_GEOMETRY_INCLUDE_DIRS $ $ ) endif() if(NOT MAPBOX_GEOMETRY_INCLUDE_DIRS) message(FATAL_ERROR "Set -DMAPBOX_GEOMETRY_INCLUDE_DIRS to the mapbox/geometry.hpp include dir") endif() if(USE_EXTERNAL_MAPBOX_POLYLABEL) if(NOT MAPBOX_POLYLABEL_INCLUDE_DIRS) message(STATUS "Searching for the include dir of mapbox/polylabel") find_path(MAPBOX_POLYLABEL_INCLUDE_DIRS "mapbox/polylabel.hpp") endif() else() set(MAPBOX_POLYLABEL_INCLUDE_DIRS $ $ ) endif() if(NOT MAPBOX_POLYLABEL_INCLUDE_DIRS) message(FATAL_ERROR "Set MAPBOX_POLYLABEL_INCLUDE_DIRS to the mapbox/geometry include dir") endif() if(USE_EXTERNAL_MAPBOX_PROTOZERO) if(NOT MAPBOX_PROTOZERO_INCLUDE_DIRS) message(STATUS "Searching for the include dir of mapbox/protozero") find_path(MAPBOX_PROTOZERO_INCLUDE_DIRS "protozero/pbf_message.hpp") endif() else() set(MAPBOX_PROTOZERO_INCLUDE_DIRS $ $ ) endif() if(NOT MAPBOX_PROTOZERO_INCLUDE_DIRS) message(FATAL_ERROR "Set MAPBOX_PROTOZERO_INCLUDE_DIRS to the mapbox/protozero include dir") endif() if(USE_EXTERNAL_MAPBOX_VARIANT) if(NOT MAPBOX_VARIANT_INCLUDE_DIRS) message(STATUS "Searching for the include dir of mapbox/variant") find_path(MAPBOX_VARIANT_INCLUDE_DIRS "mapbox/variant.hpp") endif() else() set(MAPBOX_VARIANT_INCLUDE_DIRS $ $ ) endif() if(NOT MAPBOX_VARIANT_INCLUDE_DIRS) message(FATAL_ERROR "Set MAPBOX_VARIANT_INCLUDE_DIRS to the mapbox/variant include dir") endif() set(MAPNIK_COMPILE_DEFS "") set(MAPNIK_OPTIONAL_LIBS "") if(USE_LIBXML2) message(STATUS "Using LibXml2") find_package(LibXml2 REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS HAVE_LIBXML2) list(APPEND MAPNIK_OPTIONAL_LIBS LibXml2::LibXml2) endif() if(USE_PNG) message(STATUS "Using PNG") find_package(PNG REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS HAVE_PNG) list(APPEND MAPNIK_OPTIONAL_LIBS PNG::PNG) endif() if(USE_JPEG) message(STATUS "Using JPEG") find_package(JPEG REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS HAVE_JPEG) list(APPEND MAPNIK_OPTIONAL_LIBS JPEG::JPEG) endif() if(USE_TIFF) find_package(TIFF REQUIRED) message(STATUS "Using TIFF") list(APPEND MAPNIK_COMPILE_DEFS HAVE_TIFF) list(APPEND MAPNIK_OPTIONAL_LIBS TIFF::TIFF) endif() if(USE_WEBP) message(STATUS "Using WEBP") find_package(WebP CONFIG REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS HAVE_WEBP) list(APPEND MAPNIK_OPTIONAL_LIBS WebP::webp) endif() if(USE_CAIRO) message(STATUS "Using Cairo renderer") find_package(Cairo REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS HAVE_CAIRO) list(APPEND MAPNIK_OPTIONAL_LIBS Cairo::Cairo) endif() if(USE_PROJ4) message(STATUS "Using PROJ4") find_package(PROJ4 CONFIG REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS MAPNIK_USE_PROJ4 ACCEPT_USE_OF_DEPRECATED_PROJ_API_H=1) list(APPEND MAPNIK_OPTIONAL_LIBS proj) endif() if(USE_GRID_RENDERER) message(STATUS "Using grid renderer") list(APPEND MAPNIK_COMPILE_DEFS GRID_RENDERER) endif() if(USE_SVG_RENDERER) message(STATUS "Using svg renderer") list(APPEND MAPNIK_COMPILE_DEFS SVG_RENDERER) endif() add_library(headers INTERFACE) add_library(mapnik::headers ALIAS headers) target_include_directories(headers INTERFACE $ $ $ $ $ $ $ ) target_link_libraries(headers INTERFACE Boost::boost Boost::regex Boost::filesystem ICU::uc Freetype::Freetype harfbuzz::harfbuzz ${MAPNIK_OPTIONAL_LIBS} ) target_compile_definitions(headers INTERFACE ${MAPNIK_COMPILE_DEFS}) install(TARGETS headers EXPORT MapnikTargets LIBRARY DESTINATION lib ARCHIVE DESTINATION lib RUNTIME DESTINATION bin INCLUDES DESTINATION include/ PUBLIC_HEADER DESTINATION include/ ) add_subdirectory(deps) add_subdirectory(src) add_subdirectory(plugins) add_subdirectory(utils) add_subdirectory(demo) if(BUILD_TEST) enable_testing() add_subdirectory(test) endif() # start package mapnik include(CMakePackageConfigHelpers) # set the cmake targets install location set(INSTALL_CMAKE_DIR lib/cmake) set(INCLUDE_INSTALL_DIR include/) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/MapnikConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion ) configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/MapnikConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/MapnikConfig.cmake" INSTALL_DESTINATION ${INSTALL_CMAKE_DIR} PATH_VARS INCLUDE_INSTALL_DIR PLUGINS_INSTALL_DIR FONTS_INSTALL_DIR ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/MapnikConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/MapnikConfigVersion.cmake" DESTINATION ${INSTALL_CMAKE_DIR} ) install(EXPORT MapnikTargets FILE MapnikTargets.cmake NAMESPACE mapnik:: DESTINATION ${INSTALL_CMAKE_DIR} ) install(DIRECTORY include/ TYPE INCLUDE) install(DIRECTORY deps/agg/include/ TYPE INCLUDE) install(DIRECTORY fonts/ DESTINATION ${FONTS_INSTALL_DIR} FILES_MATCHING PATTERN "*.py" EXCLUDE PATTERN "*")