# # leptonica # ############################################################################### # # cmake settings # ############################################################################### cmake_minimum_required(VERSION 3.1.3) cmake_policy(SET CMP0054 NEW) # In-source builds are disabled. if ("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}") message(FATAL_ERROR "CMake generation is not possible within the source directory!" "\n Remove the CMakeCache.txt file and try again from another folder, e.g.:" "\n " "\n rm CMakeCache.txt" "\n mkdir build" "\n cd build" "\n cmake .." ) endif() set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake") set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/bin") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${EXECUTABLE_OUTPUT_PATH}") # Use solution folders. set_property(GLOBAL PROPERTY USE_FOLDERS ON) set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake Targets") ############################################################################### # # project settings # ############################################################################### project(leptonica C CXX) set(VERSION_MAJOR 1) set(VERSION_MINOR 81) set(VERSION_PATCH 0) set(VERSION_PLAIN ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) set(MINIMUM_WEBPMUX_VERSION 0.5.0) option(BUILD_PROG "Build utility programs" OFF) if (WIN32) option(SW_BUILD "Build with sw" ON) else() option(SW_BUILD "Build with sw" OFF) endif() if(UNIX) option(SYM_LINK "Create symlink leptonica -> lept on UNIX" OFF) endif() if(NOT SW_BUILD) find_package(GIF) find_package(JPEG) find_package(PNG) find_package(TIFF) find_package(ZLIB) find_package(PkgConfig) if (PKG_CONFIG_FOUND) pkg_check_modules(WEBP libwebp QUIET) pkg_check_modules(WEBPMUX libwebpmux>=${MINIMUM_WEBPMUX_VERSION} QUIET) pkg_check_modules(JP2K libopenjp2>=2.0 QUIET) endif() if(NOT WEBP) find_path(WEBP_INCLUDE_DIR /webp/decode.h) find_library(WEBP_LIBRARY NAMES webp) if (WEBP_INCLUDE_DIR AND WEBP_LIBRARY) set(WEBP 1) set(WEBP_FOUND TRUE) set(WEBP_LIBRARIES ${WEBP_LIBRARY}) set(WEBP_INCLUDE_DIRS ${WEBP_INCLUDE_DIR}) endif() endif() if(NOT WEBPMUX) find_path(WEBPMUX_INCLUDE_DIR /webp/mux.h) #TODO: check minimal required version if(NOT WEBPMUX_INCLUDE_DIR) message(STATUS "Can not find: /webp/mux.h") endif() if(NOT "${WEBPMUX_INCLUDE_DIR}" STREQUAL "${WEBP_INCLUDE_DIR}") set(WEBP_INCLUDE_DIRS ${WEBP_INCLUDE_DIRS} ${WEBPMUX_INCLUDE_DIR}) endif() find_library(WEBPMUX_LIBRARY NAMES webpmux) if (WEBPMUX_INCLUDE_DIR AND WEBPMUX_LIBRARY) set(WEBPMUX 1) set(HAVE_LIBWEBP_ANIM 1) set(WEBPMUX_FOUND TRUE) set(WEBP_LIBRARIES ${WEBP_LIBRARIES} ${WEBPMUX_LIBRARY}) endif() endif() if(NOT JP2K) find_path(JP2K_INCLUDE_DIR /openjpeg-2.3/openjpeg.h) find_library(JP2K_LIBRARY NAMES openjp2) if (JP2K_INCLUDE_DIR AND JP2K_LIBRARY) set(JP2K 1) set(JP2K_FOUND TRUE) set(JP2K_LIBRARIES ${JP2K_LIBRARY}) set(JP2K_INCLUDE_DIRS ${JP2K_INCLUDE_DIR}) set(HAVE_LIBJP2K 1) endif() endif() if(NOT JP2K) find_path(JP2K_INCLUDE_DIR /openjpeg-2.4/openjpeg.h) find_library(JP2K_LIBRARY NAMES openjp2) if (JP2K_INCLUDE_DIR AND JP2K_LIBRARY) set(JP2K 1) set(JP2K_FOUND TRUE) set(JP2K_LIBRARIES ${JP2K_LIBRARY}) set(JP2K_INCLUDE_DIRS ${JP2K_INCLUDE_DIR}) set(HAVE_LIBJP2K 1) endif() endif() else() # SW_BUILD=ON find_package(SW REQUIRED) sw_add_package( org.sw.demo.gif org.sw.demo.jpeg org.sw.demo.glennrp.png org.sw.demo.tiff org.sw.demo.webmproject.webp org.sw.demo.uclouvain.openjpeg.openjp2 ) sw_execute() add_definitions( -DHAVE_LIBGIF=1 -DHAVE_LIBJPEG=1 -DHAVE_LIBPNG=1 -DHAVE_LIBTIFF=1 -DHAVE_LIBWEBP=1 -DHAVE_LIBWEBP_ANIM=1 -DHAVE_LIBZ=1 -DHAVE_LIBJP2K=1 -DLIBJP2K_HEADER="openjpeg.h" ) endif() ############################################################################### # # compiler and linker # ############################################################################### if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CLANG 1) endif() # Set a default build type if none was specified if(NOT CMAKE_BUILD_TYPE) message(STATUS "Setting build type to 'Release' as none was specified.") set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release") else() message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}") endif() include(CheckCCompilerFlag) include(CheckCXXCompilerFlag) macro(CHECK_CCXX_COMPILER_FLAG _FLAG _RESULT) check_c_compiler_flag(${_FLAG} C_HAS${_RESULT}) check_cxx_compiler_flag(${_FLAG} CXX_HAS${_RESULT}) endmacro() if (MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) add_compile_options("$<$:/W1;/Ox>") add_compile_options("$<$:/W4;/DDEBUG>") if (NOT CLANG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") endif() else() if (CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]") # Enable warnings and Optimize for Debugging foreach(FLAG -Wall -Wextra -Werror=format-security -pedantic -Og -g3 "-fdebug-prefix-map=${CMAKE_SOURCE_DIR}=.") string(REGEX REPLACE "[^A-Za-z0-9]" "_" flag_var "${FLAG}") check_ccxx_compiler_flag(${FLAG} ${flag_var}) if(C_HAS${flag_var}) set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${FLAG}") endif() if(CXX_HAS${flag_var}) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${FLAG}") endif() endforeach() add_definitions(-DDEBUG) endif() endif() ############################################################################### # # configure # ############################################################################### set(AUTOCONFIG_SRC ${CMAKE_CURRENT_BINARY_DIR}/config_auto.h.in) set(AUTOCONFIG ${CMAKE_CURRENT_BINARY_DIR}/src/config_auto.h) if (HAVE_LIBJP2K) set(ADDITIONAL_INCLUDE_DIRS "${JP2K_INCLUDE_DIR}") endif() set(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} "${CMAKE_PREFIX_PATH}/include" "${CMAKE_INSTALL_PREFIX}/include" "${ADDITIONAL_INCLUDE_DIRS}") include(Configure) configure_file(${AUTOCONFIG_SRC} ${AUTOCONFIG} @ONLY) set(INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include" "${CMAKE_INSTALL_PREFIX}/include/leptonica") ############################################################################### # # Show summary # ############################################################################### message( STATUS ) message( STATUS "General configuration for Leptonica ${VERSION_PLAIN}") message( STATUS "--------------------------------------------------------") message( STATUS "Build type: ${CMAKE_BUILD_TYPE}") message( STATUS "Compiler: ${CMAKE_C_COMPILER_ID}") message( STATUS "C compiler options: ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UP}} ${CMAKE_C_FLAGS}") message( STATUS "Linker options: ${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UP}}") message( STATUS "Install directory: ${CMAKE_INSTALL_PREFIX}") message( STATUS ) message( STATUS "Build with sw [SW_BUILD]: ${SW_BUILD}") message( STATUS "Build utility programs [BUILD_PROG]: ${BUILD_PROG}") if(NOT SW_BUILD) message( STATUS "Used ZLIB library: ${ZLIB_LIBRARIES}") message( STATUS "Used PNG library: ${PNG_LIBRARIES}") message( STATUS "Used JPEG library: ${JPEG_LIBRARIES}") message( STATUS "Used JP2K library: ${JP2K_LIBRARIES}") message( STATUS "Used TIFF library: ${TIFF_LIBRARIES}") message( STATUS "Used GIF library: ${GIF_LIBRARIES}") message( STATUS "Used WEBP library: ${WEBP_LIBRARIES}") endif() message( STATUS "--------------------------------------------------------") message( STATUS ) ############################################################################### # # build # ############################################################################### add_definitions(-DHAVE_CONFIG_H) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) include_directories(${CMAKE_CURRENT_BINARY_DIR}/src) if (BUILD_PROG) add_subdirectory(prog) endif() add_subdirectory(src) get_target_property(leptonica_NAME leptonica NAME) get_target_property(leptonica_VERSION leptonica VERSION) get_target_property(leptonica_OUTPUT_NAME leptonica OUTPUT_NAME) configure_file(lept.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/lept.pc @ONLY) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/LeptonicaConfig-version.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig-version.cmake @ONLY) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/LeptonicaConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig.cmake @ONLY) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lept.pc DESTINATION lib/pkgconfig) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig-version.cmake DESTINATION lib/cmake) ######################################## # uninstall target ######################################## if(NOT TARGET uninstall) configure_file( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake) endif() ###############################################################################