CMakeLists.txt 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. #
  2. # leptonica
  3. #
  4. # ##############################################################################
  5. #
  6. # cmake settings
  7. #
  8. # ##############################################################################
  9. cmake_minimum_required(VERSION 3.5)
  10. cmake_policy(SET CMP0054 NEW)
  11. # In-source builds are disabled.
  12. if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
  13. message(
  14. FATAL_ERROR
  15. "CMake generation is not possible within the source directory!"
  16. "\n Remove the CMakeCache.txt file and try again from another folder"
  17. ", e.g.:\n "
  18. "\n rm CMakeCache.txt"
  19. "\n mkdir build"
  20. "\n cd build"
  21. "\n cmake ..")
  22. endif()
  23. set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  24. set(EXECUTABLE_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/bin")
  25. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${EXECUTABLE_OUTPUT_PATH}")
  26. # Use solution folders.
  27. set_property(GLOBAL PROPERTY USE_FOLDERS ON)
  28. set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake Targets")
  29. # ##############################################################################
  30. #
  31. # project settings
  32. #
  33. # ##############################################################################
  34. project(
  35. leptonica
  36. LANGUAGES C
  37. VERSION 1.85.0)
  38. set(CMAKE_C_STANDARD 11)
  39. set(CMAKE_C_STANDARD_REQUIRED ON)
  40. # Standard installation paths
  41. include(GNUInstallDirs)
  42. set(MINIMUM_WEBPMUX_VERSION 0.5.0)
  43. option(BUILD_PROG "Build utility programs" OFF)
  44. if(WIN32)
  45. option(SW_BUILD "Build with sw" ON)
  46. else()
  47. option(SW_BUILD "Build with sw" OFF)
  48. endif()
  49. if(UNIX OR MINGW)
  50. option(SYM_LINK "Create symlink leptonica -> lept on UNIX" OFF)
  51. endif()
  52. option(STRICT_CONF
  53. "Strict configuration - fail when the optional library is not found" OFF)
  54. option(ENABLE_ZLIB "Enable ZLIB support" ON)
  55. option(ENABLE_PNG "Enable PNG support" ON)
  56. option(ENABLE_GIF "Enable GIF support" ON)
  57. option(ENABLE_JPEG "Enable JPEG support" ON)
  58. option(ENABLE_TIFF "Enable TIFF support" ON)
  59. option(ENABLE_WEBP "Enable WebP support" ON)
  60. option(ENABLE_OPENJPEG "Enable OpenJPEG support" ON)
  61. set(leptonica_INSTALL_CMAKE_DIR
  62. "lib/cmake/leptonica"
  63. CACHE STRING "Install destination for CMake package files")
  64. if(NOT SW_BUILD)
  65. find_package(PkgConfig QUIET)
  66. if(ENABLE_ZLIB)
  67. find_package(ZLIB)
  68. if(ZLIB_FOUND)
  69. set(pkgs_private "${pkgs_private} zlib")
  70. else()
  71. if(STRICT_CONF)
  72. message(
  73. FATAL_ERROR
  74. "Could not find ZLIB libs.\n Use -DENABLE_ZLIB=OFF to disable ZLIB support."
  75. )
  76. endif(STRICT_CONF)
  77. endif(ZLIB_FOUND)
  78. endif(ENABLE_ZLIB)
  79. if(ENABLE_PNG)
  80. find_package(PNG)
  81. if(PNG_FOUND)
  82. set(pkgs_private "${pkgs_private} libpng")
  83. else()
  84. if(STRICT_CONF)
  85. message(
  86. FATAL_ERROR
  87. "Could not find PNG libs.\n Use -DENABLE_PNG=OFF to disable PNG support."
  88. )
  89. endif(STRICT_CONF)
  90. endif(PNG_FOUND)
  91. endif(ENABLE_PNG)
  92. if(ENABLE_GIF)
  93. find_package(GIF 5)
  94. if(GIF_FOUND)
  95. set(libs_private "${libs_private} -lgif")
  96. else()
  97. if(STRICT_CONF)
  98. message(
  99. FATAL_ERROR
  100. "Could not find GIF 5 libs.\n Use -DENABLE_GIF=OFF to disable GIF support."
  101. )
  102. endif(STRICT_CONF)
  103. endif(GIF_FOUND)
  104. endif(ENABLE_GIF)
  105. if(ENABLE_JPEG)
  106. find_package(JPEG)
  107. if(JPEG_FOUND)
  108. set(pkgs_private "${pkgs_private} libjpeg")
  109. else()
  110. if(STRICT_CONF)
  111. message(
  112. FATAL_ERROR
  113. "Could not find JPEG libs.\n Use -DENABLE_JPEG=OFF to disable JPEG support."
  114. )
  115. endif(STRICT_CONF)
  116. endif(JPEG_FOUND)
  117. endif(ENABLE_JPEG)
  118. if(ENABLE_TIFF)
  119. find_package(TIFF)
  120. if(TIFF_FOUND)
  121. set(pkgs_private "${pkgs_private} libtiff-4")
  122. else()
  123. if(STRICT_CONF)
  124. message(
  125. FATAL_ERROR
  126. "Could not find TIFF libs.\n Use -DENABLE_TIFF=OFF to disable TIFF support."
  127. )
  128. endif(STRICT_CONF)
  129. endif(TIFF_FOUND)
  130. endif(ENABLE_TIFF)
  131. if(ENABLE_WEBP)
  132. find_package(WebP ${MINIMUM_WEBPMUX_VERSION} CONFIG)
  133. set(pkgs_private "${pkgs_private} libwebp libwebpmux")
  134. if(NOT TARGET WebP::webp)
  135. find_path(WebP_INCLUDE_DIR NAMES webp/decode.h)
  136. find_path(WebP_MUX_INCLUDE_DIR NAMES webp/mux.h)
  137. find_library(WebP_LIBRARY NAMES webp)
  138. find_library(WebP_MUX_LIBRARY NAMES webpmux)
  139. if(WebP_INCLUDE_DIR
  140. AND WebP_MUX_INCLUDE_DIR
  141. AND WebP_LIBRARY)
  142. message(STATUS "Found non-cmake WebP: ${WebP_LIBRARY}")
  143. set(WebP_INCLUDE_DIR S "${WebP_INCLUDE_DIR};${WebP_MUX_INCLUDE_DIR}")
  144. set(WebP_LIBRARIES "${WebP_LIBRARY}")
  145. if(WebP_MUX_LIBRARY)
  146. list(APPEND WebP_LIBRARIES "${WebP_MUX_LIBRARY}")
  147. else()
  148. message(STATUS "Library webpmux not found!")
  149. endif(WebP_MUX_LIBRARY)
  150. set(WebP_FOUND 1)
  151. endif() # WebP_INCLUDE_DIR
  152. endif(NOT TARGET WebP::webp)
  153. if(WebP_FOUND)
  154. set(HAVE_LIBWEBP 1)
  155. set(HAVE_LIBWEBP_ANIM 1)
  156. include_directories(${WebP_INCLUDE_DIR})
  157. include_directories(${WebP_MUX_INCLUDE_DIR})
  158. message(STATUS "Found WebP: ${WebP_LIBRARIES} (${WebP_VERSION})")
  159. else()
  160. message(
  161. STATUS
  162. "WebP_INCLUDE_DIR : ${WebP_INCLUDE_DIR}\nWebP_MUX_INCLUDE_DIR: ${WebP_MUX_INCLUDE_DIR}\nWebP_LIBRARY: ${WebP_LIBRARY}\nWebP_MUX_LIBRARY: ${WebP_MUX_LIBRARY}"
  163. )
  164. if(STRICT_CONF)
  165. message(
  166. FATAL_ERROR
  167. "Could not find WebP libs.\n Use -DENABLE_WEBP=OFF to disable WebP support."
  168. )
  169. endif(STRICT_CONF)
  170. endif(WebP_FOUND)
  171. endif(ENABLE_WEBP)
  172. if(ENABLE_OPENJPEG)
  173. find_package(OpenJPEG CONFIG)
  174. if(OpenJPEG_FOUND)
  175. set(OPENJPEG_VERSION ${OPENJPEG_MAJOR_VERSION}.${OPENJPEG_MINOR_VERSION})
  176. if(${OPENJPEG_VERSION} LESS "2.1")
  177. message (STATUS "Your libopenjp version is too old ${OPENJPEG_VERSION}")
  178. set(HAVE_LIBJP2K 0)
  179. else(${OPENJPEG_VERSION} LESS "2.1")
  180. set(pkgs_private "${pkgs_private} libopenjp2")
  181. set(HAVE_LIBJP2K 1)
  182. include_directories(${OPENJPEG_INCLUDE_DIRS})
  183. if(WIN32)
  184. if(BUILD_SHARED_LIBS)
  185. add_definitions(-DOPJ_EXPORTS)
  186. else()
  187. add_definitions(-DOPJ_STATIC)
  188. endif()
  189. endif(WIN32)
  190. message(STATUS
  191. "Found OpenJPEG: ${OPENJPEG_LIBRARIES} (${OPENJPEG_VERSION}.${OPENJPEG_BUILD_VERSION})")
  192. endif(${OPENJPEG_VERSION} LESS "2.1")
  193. else()
  194. if(STRICT_CONF)
  195. message(
  196. FATAL_ERROR
  197. "Could not find OpenJPEG libs.\n Use -DENABLE_OPENJPEG=OFF to disable OpenJPEG support."
  198. )
  199. endif(STRICT_CONF)
  200. endif(OpenJPEG_FOUND)
  201. endif(ENABLE_OPENJPEG)
  202. else() # SW_BUILD=ON
  203. find_package(SW REQUIRED)
  204. sw_add_package(
  205. org.sw.demo.gif org.sw.demo.jpeg org.sw.demo.glennrp.png org.sw.demo.tiff
  206. org.sw.demo.webmproject.webp org.sw.demo.uclouvain.openjpeg.openjp2)
  207. sw_execute()
  208. add_definitions(
  209. -DHAVE_LIBGIF=1
  210. -DHAVE_LIBJPEG=1
  211. -DHAVE_LIBPNG=1
  212. -DHAVE_LIBTIFF=1
  213. -DHAVE_LIBWEBP=1
  214. -DHAVE_LIBWEBP_ANIM=1
  215. -DHAVE_LIBZ=1
  216. -DHAVE_LIBJP2K=1)
  217. endif()
  218. include(CheckLibraryExists)
  219. check_library_exists(m sin "" HAVE_LIBM)
  220. if(HAVE_LIBM)
  221. set(libs_private "${libs_private} -lm")
  222. endif(HAVE_LIBM)
  223. if(${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD.*|DragonFly.*|FreeBSD")
  224. set(FREEBSD ON)
  225. endif(${CMAKE_SYSTEM_NAME} MATCHES "kFreeBSD.*|DragonFly.*|FreeBSD")
  226. # ##############################################################################
  227. #
  228. # compiler and linker
  229. #
  230. # ##############################################################################
  231. if(CMAKE_C_COMPILER_ID MATCHES "Clang")
  232. set(CLANG 1)
  233. endif()
  234. # Set a default build type if none was specified
  235. if(NOT CMAKE_BUILD_TYPE)
  236. message(STATUS "Setting build type to 'Release' as none was specified.")
  237. set(CMAKE_BUILD_TYPE
  238. Release
  239. CACHE STRING "Choose the type of build." FORCE)
  240. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release")
  241. else()
  242. message("CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
  243. endif()
  244. include(CheckCCompilerFlag)
  245. # Check for valid compiler flags
  246. macro(CHECK_CCXX_COMPILER_FLAG flag_ result_)
  247. check_c_compiler_flag(${flag_} C_HAS${result_})
  248. endmacro()
  249. if(MSVC)
  250. add_definitions(-D_CRT_SECURE_NO_WARNINGS)
  251. add_compile_options("$<$<CONFIG:Release>:/W1;/Ox>")
  252. add_compile_options("$<$<CONFIG:Debug>:/W4;/DDEBUG>")
  253. if(NOT CLANG)
  254. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP")
  255. endif()
  256. else()
  257. if(CMAKE_BUILD_TYPE MATCHES "[Dd][Ee][Bb][Uu][Gg]")
  258. # Enable warnings and Optimize for Debugging
  259. foreach(
  260. flag_
  261. -Wall
  262. -Wextra
  263. -Werror=format-security
  264. -pedantic
  265. -Og
  266. -g3
  267. "-fdebug-prefix-map=${CMAKE_SOURCE_DIR}=.")
  268. string(REGEX REPLACE "[^A-Za-z0-9]" "_" flag_var "${flag_}")
  269. check_ccxx_compiler_flag(${flag_} ${flag_var})
  270. if(C_HAS${flag_var})
  271. set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${flag_}")
  272. endif()
  273. endforeach()
  274. add_definitions(-DDEBUG)
  275. endif()
  276. endif()
  277. # ##############################################################################
  278. #
  279. # configure
  280. #
  281. # ##############################################################################
  282. set(AUTOCONFIG_SRC ${CMAKE_CURRENT_BINARY_DIR}/config_auto.h.in)
  283. set(AUTOCONFIG ${CMAKE_CURRENT_BINARY_DIR}/src/config_auto.h)
  284. if(HAVE_LIBJP2K)
  285. set(ADDITIONAL_INCLUDE_DIRS "${JP2K_INCLUDE_DIR}")
  286. endif()
  287. set(CMAKE_REQUIRED_INCLUDES
  288. ${CMAKE_REQUIRED_INCLUDES} "${CMAKE_PREFIX_PATH}/include"
  289. "${CMAKE_INSTALL_PREFIX}/include" "${ADDITIONAL_INCLUDE_DIRS}")
  290. include(Configure)
  291. configure_file(${AUTOCONFIG_SRC} ${AUTOCONFIG} @ONLY)
  292. set(INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include"
  293. "${CMAKE_INSTALL_PREFIX}/include/leptonica")
  294. # ##############################################################################
  295. #
  296. # Show summary
  297. #
  298. # ##############################################################################
  299. message(STATUS)
  300. message(STATUS "General configuration for Leptonica ${VERSION_PLAIN}")
  301. message(STATUS "--------------------------------------------------------")
  302. message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
  303. message(STATUS "Compiler: ${CMAKE_C_COMPILER_ID}")
  304. message(STATUS "C compiler options:
  305. ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UP}} ${CMAKE_C_FLAGS}")
  306. message(STATUS "Linker options: ${CMAKE_EXE_LINKER_FLAGS}
  307. ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UP}}")
  308. message(STATUS "Install directory: ${CMAKE_INSTALL_PREFIX}")
  309. message(STATUS)
  310. message(STATUS "Build with sw [SW_BUILD]: ${SW_BUILD}")
  311. message(STATUS "Build utility programs [BUILD_PROG]: ${BUILD_PROG}")
  312. if(NOT SW_BUILD)
  313. message(STATUS "Used ZLIB library: ${ZLIB_LIBRARIES}")
  314. message(STATUS "Used PNG library: ${PNG_LIBRARIES}")
  315. message(STATUS "Used JPEG library: ${JPEG_LIBRARIES}")
  316. message(STATUS "Used OpenJPEG library: ${OPENJPEG_LIBRARIES}")
  317. message(STATUS "Used TIFF library: ${TIFF_LIBRARIES}")
  318. message(STATUS "Used GIF library: ${GIF_LIBRARIES}")
  319. message(STATUS "Used WebP library: ${WebP_LIBRARIES}")
  320. endif()
  321. message(STATUS "--------------------------------------------------------")
  322. message(STATUS)
  323. # ##############################################################################
  324. #
  325. # build
  326. #
  327. # ##############################################################################
  328. add_definitions(-DHAVE_CONFIG_H)
  329. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
  330. include_directories(${CMAKE_CURRENT_BINARY_DIR}/src)
  331. if(BUILD_PROG)
  332. add_subdirectory(prog)
  333. endif()
  334. add_subdirectory(src)
  335. get_target_property(leptonica_NAME leptonica NAME)
  336. get_target_property(leptonica_OUTPUT_NAME leptonica OUTPUT_NAME)
  337. configure_file(lept.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/lept.pc.in @ONLY)
  338. # to resolve generator expression in OUTPUT_NAME
  339. file(
  340. GENERATE
  341. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/lept_$<CONFIG>.pc
  342. INPUT ${CMAKE_CURRENT_BINARY_DIR}/lept.pc.in)
  343. configure_file(
  344. ${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/LeptonicaConfig-version.cmake.in
  345. ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig-version.cmake @ONLY)
  346. configure_file(
  347. ${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/LeptonicaConfig.cmake.in
  348. ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig.cmake @ONLY)
  349. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/lept_$<CONFIG>.pc
  350. DESTINATION lib/pkgconfig)
  351. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig.cmake
  352. ${CMAKE_CURRENT_BINARY_DIR}/LeptonicaConfig-version.cmake
  353. DESTINATION ${leptonica_INSTALL_CMAKE_DIR})
  354. # ##############################################################################
  355. # uninstall target
  356. # ##############################################################################
  357. if(NOT TARGET uninstall)
  358. configure_file(
  359. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/cmake_uninstall.cmake.in"
  360. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
  361. add_custom_target(
  362. uninstall COMMAND ${CMAKE_COMMAND} -P
  363. ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  364. endif()
  365. # ##############################################################################