diff --git a/CMakeLists.txt b/CMakeLists.txt index 23584bc8f..4588a4152 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,10 @@ option(USE_EXTERNAL_MAPBOX_POLYLABEL "Use a external mapnik/polylabel. If off, u 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_OPENJPEG "adds openjpeg support" ON) +if(USE_JPEG AND USE_OPENJPEG) + message(FATAL_ERROR "Choose either USE_JPEG OR USE_OPENJPEG") +endif() option(USE_PNG "adds png support" ON) option(USE_TIFF "adds tiff support" ON) option(USE_WEBP "adds webp support" ON) @@ -114,6 +118,7 @@ set(MAPNIK_OPTIONAL_LIBS "") set(MAPNIK_OPTIONAL_LIBS_INCLUDE "") # Begin project configuration +mapnik_find_package(PkgConfig REQUIRED) mapnik_find_threads() mapnik_find_package(ICU REQUIRED COMPONENTS uc i18n data) mapnik_find_package(Boost 1.61 REQUIRED COMPONENTS filesystem system regex) @@ -217,11 +222,16 @@ if(USE_PNG) list(APPEND MAPNIK_OPTIONAL_LIBS PNG::PNG) endif() -if(USE_JPEG) +if(USE_OPENJPEG) mapnik_find_package(OpenJPEG REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS HAVE_JPEG) list(APPEND MAPNIK_OPTIONAL_LIBS openjp2) endif() +if(USE_JPEG) + mapnik_find_package(JPEG REQUIRED) + list(APPEND MAPNIK_COMPILE_DEFS HAVE_JPEG) + list(APPEND MAPNIK_OPTIONAL_LIBS JPEG::JPEG) +endif() if(USE_TIFF) mapnik_find_package(TIFF REQUIRED) @@ -230,9 +240,9 @@ if(USE_TIFF) endif() if(USE_WEBP) - mapnik_find_package(WebP CONFIG REQUIRED) + mapnik_find_package(WebP REQUIRED) list(APPEND MAPNIK_COMPILE_DEFS HAVE_WEBP) - list(APPEND MAPNIK_OPTIONAL_LIBS WebP::webp) + list(APPEND MAPNIK_OPTIONAL_LIBS WebP::libwebp) endif() if(USE_CAIRO) @@ -243,7 +253,16 @@ endif() if(USE_PROJ) #https://proj.org/development/cmake.html - mapnik_find_package(PROJ REQUIRED) + mapnik_find_package(PROJ QUIET) + # currently the cmake files are not installed, when installing proj via apt-get. So search via pkg-config + if(NOT PROJ_FOUND) + message(STATUS "PROJ not found via FindPROJ. Searching via pkg-config...") + pkg_check_modules(PROJ REQUIRED IMPORTED_TARGET proj) + string(REGEX MATCH "([0-9]+)\.([0-9]+)\.([0-9]+)" _dummy "${PROJ_VERSION}") + set(PROJ_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(PROJ_VERSION_MINOR "${CMAKE_MATCH_2}") + set(PROJ_VERSION_PATCH "${CMAKE_MATCH_3}") + endif() math(EXPR MAPNIK_PROJ_VERSION "${PROJ_VERSION_MAJOR}*10000 + ${PROJ_VERSION_MINOR}*100 + ${PROJ_VERSION_PATCH}" OUTPUT_FORMAT DECIMAL) message(STATUS "Using mapnik PROJ version: ${MAPNIK_PROJ_VERSION}") list(APPEND MAPNIK_COMPILE_DEFS MAPNIK_USE_PROJ MAPNIK_PROJ_VERSION=${MAPNIK_PROJ_VERSION}) diff --git a/cmake/FindWebP.cmake b/cmake/FindWebP.cmake new file mode 100644 index 000000000..c93e78ceb --- /dev/null +++ b/cmake/FindWebP.cmake @@ -0,0 +1,166 @@ +# Copyright (C) 2020 Sony Interactive Entertainment Inc. +# Copyright (C) 2012 Raphael Kubo da Costa +# Copyright (C) 2013 Igalia S.L. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS +# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#[=======================================================================[.rst: +FindWebP +-------------- + +Find WebP headers and libraries. + +Imported Targets +^^^^^^^^^^^^^^^^ + +``WebP::libwebp`` + The WebP library, if found. + +``WebP::demux`` + The WebP demux library, if found. + +Result Variables +^^^^^^^^^^^^^^^^ + +This will define the following variables in your project: + +``WebP_FOUND`` + true if (the requested version of) WebP is available. +``WebP_VERSION`` + the version of WebP. +``WebP_LIBRARIES`` + the libraries to link against to use WebP. +``WebP_INCLUDE_DIRS`` + where to find the WebP headers. +``WebP_COMPILE_OPTIONS`` + this should be passed to target_compile_options(), if the + target is not used for linking + +#]=======================================================================] + +find_package(PkgConfig QUIET) +pkg_check_modules(PC_WEBP QUIET libwebp) +set(WebP_COMPILE_OPTIONS ${PC_WEBP_CFLAGS_OTHER}) +set(WebP_VERSION ${PC_WEBP_CFLAGS_VERSION}) + +find_path(WebP_INCLUDE_DIR + NAMES webp/decode.h + HINTS ${PC_WEBP_INCLUDEDIR} ${PC_WEBP_INCLUDE_DIRS} +) + +find_library(WebP_LIBRARY + NAMES ${WebP_NAMES} webp + HINTS ${PC_WEBP_LIBDIR} ${PC_WEBP_LIBRARY_DIRS} +) + +# There's nothing in the WebP headers that could be used to detect the exact +# WebP version being used so don't attempt to do so. A version can only be found +# through pkg-config +if ("${WebP_FIND_VERSION}" VERSION_GREATER "${WebP_VERSION}") + if (WebP_VERSION) + message(FATAL_ERROR "Required version (" ${WebP_FIND_VERSION} ") is higher than found version (" ${WebP_VERSION} ")") + else () + message(WARNING "Cannot determine WebP version without pkg-config") + endif () +endif () + +# Find components +if (WebP_INCLUDE_DIR AND WebP_LIBRARY) + set(_WebP_REQUIRED_LIBS_FOUND ON) + set(WebP_LIBS_FOUND "WebP (required): ${WebP_LIBRARY}") +else () + set(_WebP_REQUIRED_LIBS_FOUND OFF) + set(WebP_LIBS_NOT_FOUND "WebP (required)") +endif () + +if ("demux" IN_LIST WebP_FIND_COMPONENTS) + find_library(WebP_DEMUX_LIBRARY + NAMES ${WebP_DEMUX_NAMES} webpdemux + HINTS ${PC_WEBP_LIBDIR} ${PC_WEBP_LIBRARY_DIRS} + ) + + if (WebP_DEMUX_LIBRARY) + if (WebP_FIND_REQUIRED_demux) + list(APPEND WebP_LIBS_FOUND "demux (required): ${WebP_DEMUX_LIBRARY}") + else () + list(APPEND WebP_LIBS_FOUND "demux (optional): ${WebP_DEMUX_LIBRARY}") + endif () + else () + if (WebP_FIND_REQUIRED_demux) + set(_WebP_REQUIRED_LIBS_FOUND OFF) + list(APPEND WebP_LIBS_NOT_FOUND "demux (required)") + else () + list(APPEND WebP_LIBS_NOT_FOUND "demux (optional)") + endif () + endif () +endif () + +if (NOT WebP_FIND_QUIETLY) + if (WebP_LIBS_FOUND) + message(STATUS "Found the following WebP libraries:") + foreach (found ${WebP_LIBS_FOUND}) + message(STATUS " ${found}") + endforeach () + endif () + if (WebP_LIBS_NOT_FOUND) + message(STATUS "The following WebP libraries were not found:") + foreach (found ${WebP_LIBS_NOT_FOUND}) + message(STATUS " ${found}") + endforeach () + endif () +endif () + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(WebP + FOUND_VAR WebP_FOUND + REQUIRED_VARS WebP_INCLUDE_DIR WebP_LIBRARY _WebP_REQUIRED_LIBS_FOUND + VERSION_VAR WebP_VERSION +) + +if (WebP_LIBRARY AND NOT TARGET WebP::libwebp) + add_library(WebP::libwebp UNKNOWN IMPORTED GLOBAL) + set_target_properties(WebP::libwebp PROPERTIES + IMPORTED_LOCATION "${WebP_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${WebP_COMPILE_OPTIONS}" + INTERFACE_INCLUDE_DIRECTORIES "${WebP_INCLUDE_DIR}" + ) +endif () + +if (WebP_DEMUX_LIBRARY AND NOT TARGET WebP::demux) + add_library(WebP::demux UNKNOWN IMPORTED GLOBAL) + set_target_properties(WebP::demux PROPERTIES + IMPORTED_LOCATION "${WebP_DEMUX_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${WebP_COMPILE_OPTIONS}" + INTERFACE_INCLUDE_DIRECTORIES "${WebP_INCLUDE_DIR}" + ) +endif () + +mark_as_advanced( + WebP_INCLUDE_DIR + WebP_LIBRARY + WebP_DEMUX_LIBRARY +) + +if (WebP_FOUND) + set(WebP_LIBRARIES ${WebP_LIBRARY} ${WebP_DEMUX_LIBRARY}) + set(WebP_INCLUDE_DIRS ${WebP_INCLUDE_DIR}) +endif ()