CMakeLists.txt 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986
  1. #
  2. # tesseract
  3. #
  4. # ##############################################################################
  5. #
  6. # cmake settings
  7. #
  8. # ##############################################################################
  9. cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
  10. # In-source builds are disabled.
  11. if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
  12. message(
  13. FATAL_ERROR
  14. "CMake generation is not possible within the source directory!"
  15. "\n Remove the CMakeCache.txt file and try again from another folder, "
  16. "e.g.:\n "
  17. "\n rm CMakeCache.txt"
  18. "\n mkdir build"
  19. "\n cd build"
  20. "\n cmake ..")
  21. endif()
  22. set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake")
  23. set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin")
  24. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${EXECUTABLE_OUTPUT_PATH}")
  25. # Use solution folders.
  26. set_property(GLOBAL PROPERTY USE_FOLDERS ON)
  27. set_property(GLOBAL PROPERTY PREDEFINED_TARGETS_FOLDER "CMake Targets")
  28. if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15.0")
  29. if(WIN32)
  30. cmake_policy(SET CMP0091 NEW)
  31. message(STATUS "Setting policy CMP0091 to NEW")
  32. endif()
  33. endif()
  34. # ##############################################################################
  35. #
  36. # project settings
  37. #
  38. # ##############################################################################
  39. project(tesseract C CXX)
  40. # Get version with components from VERSION file.
  41. file(STRINGS "VERSION" VERSION_PLAIN)
  42. string(REGEX REPLACE "^([^.]*)\\..*" "\\1" VERSION_MAJOR ${VERSION_PLAIN})
  43. string(REGEX REPLACE "^[^.]*\\.([^.]*)\\..*" "\\1" VERSION_MINOR
  44. ${VERSION_PLAIN})
  45. string(REGEX REPLACE "^[^.]*\\.[^.]*\\.([0-9]*).*" "\\1" VERSION_PATCH
  46. ${VERSION_PLAIN})
  47. if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
  48. execute_process(COMMAND git --git-dir ${CMAKE_CURRENT_SOURCE_DIR}/.git
  49. describe --abbrev=4 OUTPUT_VARIABLE GIT_REV)
  50. string(REGEX REPLACE "\n$" "" PACKAGE_VERSION "${GIT_REV}")
  51. endif()
  52. if(NOT PACKAGE_VERSION)
  53. set(PACKAGE_VERSION ${VERSION_PLAIN})
  54. endif()
  55. # Provide also same macro names as autoconf (see configure.ac).
  56. set(GENERIC_MAJOR_VERSION ${VERSION_MAJOR})
  57. set(GENERIC_MINOR_VERSION ${VERSION_MINOR})
  58. set(GENERIC_MICRO_VERSION ${VERSION_PATCH})
  59. set(MINIMUM_LEPTONICA_VERSION 1.74)
  60. # ##############################################################################
  61. #
  62. # options
  63. #
  64. # ##############################################################################
  65. message(STATUS "Configuring tesseract version ${PACKAGE_VERSION}...")
  66. if(WIN32)
  67. option(SW_BUILD "Build with sw" ON)
  68. else()
  69. option(SW_BUILD "Build with sw" OFF)
  70. endif()
  71. option(OPENMP_BUILD "Build with openmp support" OFF) # see issue #1662
  72. option(GRAPHICS_DISABLED "Disable disable graphics (ScrollView)" OFF)
  73. option(DISABLED_LEGACY_ENGINE "Disable the legacy OCR engine" OFF)
  74. option(ENABLE_LTO "Enable link-time optimization" OFF)
  75. option(FAST_FLOAT "Enable float for LSTM" ON)
  76. option(ENABLE_NATIVE
  77. "Enable optimization for host CPU (could break HW compatibility)" OFF)
  78. # see
  79. # https://stackoverflow.com/questions/52653025/why-is-march-native-used-so-rarely
  80. option(BUILD_TRAINING_TOOLS "Build training tools" ON)
  81. option(BUILD_TESTS "Build tests" OFF)
  82. option(USE_SYSTEM_ICU "Use system ICU" OFF)
  83. option(DISABLE_TIFF "Disable build with libtiff (if available)" OFF)
  84. option(DISABLE_ARCHIVE "Disable build with libarchive (if available)" OFF)
  85. option(DISABLE_CURL "Disable build with libcurl (if available)" OFF)
  86. option(INSTALL_CONFIGS "Install tesseract configs" ON)
  87. if(NOT ${CMAKE_VERSION} VERSION_LESS "3.15.0")
  88. if(WIN32 AND MSVC)
  89. option(WIN32_MT_BUILD "Build with MT flag for MSVC" OFF)
  90. endif()
  91. endif()
  92. # ##############################################################################
  93. #
  94. # compiler and linker
  95. #
  96. # ##############################################################################
  97. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  98. set(CLANG 1)
  99. endif()
  100. if(NOT CMAKE_BUILD_TYPE)
  101. message(STATUS "Setting build type to 'Release' as none was specified.")
  102. set(CMAKE_BUILD_TYPE
  103. Release
  104. CACHE STRING "Choose the type of build." FORCE)
  105. set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release")
  106. endif()
  107. include(CheckCXXCompilerFlag)
  108. set(CMAKE_CXX_STANDARD 17)
  109. if("cxx_std_20" IN_LIST CMAKE_CXX_COMPILE_FEATURES)
  110. set(CMAKE_CXX_STANDARD 20)
  111. endif()
  112. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  113. if(NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  114. # cygwin gnu c++ needs to use -std=gnu++17 instead of -std=c++17
  115. set(CMAKE_CXX_EXTENSIONS OFF)
  116. endif()
  117. if(BUILD_SHARED_LIBS)
  118. set(CMAKE_CXX_VISIBILITY_PRESET hidden)
  119. endif()
  120. # LTO
  121. cmake_policy(SET CMP0069 NEW)
  122. include(CheckIPOSupported)
  123. check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT error)
  124. if(LTO_SUPPORTED)
  125. message(STATUS "IPO / LTO supported")
  126. else()
  127. message(STATUS "IPO / LTO not supported: <${error}>")
  128. endif()
  129. set(MARCH_NATIVE_OPT OFF)
  130. if(ENABLE_NATIVE)
  131. check_cxx_compiler_flag("-march=native" COMPILER_SUPPORTS_MARCH_NATIVE)
  132. if(COMPILER_SUPPORTS_MARCH_NATIVE)
  133. set(DOTPRODUCT_FLAGS "${DOTPRODUCT_FLAGS} -march=native")
  134. if(NOT CLANG AND MSVC)
  135. # clang-cl does not know this argument
  136. set(DOTPRODUCT_FLAGS "${DOTPRODUCT_FLAGS} -mtune=native")
  137. endif()
  138. set(MARCH_NATIVE_OPT ON)
  139. endif(COMPILER_SUPPORTS_MARCH_NATIVE)
  140. endif(ENABLE_NATIVE)
  141. message(STATUS "CMAKE_SYSTEM_PROCESSOR=<${CMAKE_SYSTEM_PROCESSOR}>")
  142. if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86|x86_64|AMD64|amd64|i386|i686")
  143. set(HAVE_NEON FALSE)
  144. if(MSVC)
  145. set(HAVE_AVX ON)
  146. set(AVX_COMPILE_FLAGS "/arch:AVX")
  147. add_definitions("-DHAVE_AVX")
  148. set(HAVE_AVX2 ON)
  149. set(AVX2_COMPILE_FLAGS "/arch:AVX2")
  150. add_definitions("-DHAVE_AVX2")
  151. set(HAVE_AVX512F ON)
  152. set(AVX512F_COMPILE_FLAGS "/arch:AVX512")
  153. add_definitions("-DHAVE_AVX512F")
  154. set(HAVE_FMA ON)
  155. set(FMA_COMPILE_FLAGS "-D__FMA__")
  156. add_definitions("-DHAVE_FMA")
  157. set(HAVE_SSE4_1 ON)
  158. set(SSE4_1_COMPILE_FLAGS "-D__SSE4_1__")
  159. add_definitions("-DHAVE_SSE4_1")
  160. set(DOTPRODUCT_FLAGS "${DOTPRODUCT_FLAGS} -openmp:experimental")
  161. add_definitions("-DOPENMP_SIMD")
  162. # clang with MSVC compatibility
  163. if(CLANG)
  164. set(CMAKE_CXX_FLAGS
  165. "${CMAKE_CXX_FLAGS} -Wno-microsoft-unqualified-friend")
  166. if(HAVE_FMA)
  167. set(FMA_COMPILE_FLAGS "-mfma ${FMA_COMPILE_FLAGS}")
  168. endif(HAVE_FMA)
  169. if(HAVE_SSE4_1)
  170. set(SSE4_1_COMPILE_FLAGS "-msse4.1 ${SSE4_1_COMPILE_FLAGS}")
  171. endif(HAVE_SSE4_1)
  172. endif(CLANG)
  173. else() # if not MSVC
  174. check_cxx_compiler_flag("-mavx" HAVE_AVX)
  175. if(HAVE_AVX)
  176. set(AVX_COMPILE_FLAGS "-mavx")
  177. add_definitions("-DHAVE_AVX")
  178. endif(HAVE_AVX)
  179. check_cxx_compiler_flag("-mavx2" HAVE_AVX2)
  180. if(HAVE_AVX2)
  181. set(AVX2_COMPILE_FLAGS "-mavx2")
  182. add_definitions("-DHAVE_AVX2")
  183. endif()
  184. check_cxx_compiler_flag("-mavx512f" HAVE_AVX512F)
  185. if(HAVE_AVX512F)
  186. set(AVX512F_COMPILE_FLAGS "-mavx512f")
  187. add_definitions("-DHAVE_AVX512F")
  188. endif()
  189. check_cxx_compiler_flag("-mfma" HAVE_FMA)
  190. if(HAVE_FMA)
  191. set(FMA_COMPILE_FLAGS "-mfma")
  192. add_definitions("-DHAVE_FMA")
  193. endif()
  194. check_cxx_compiler_flag("-msse4.1" HAVE_SSE4_1)
  195. if(HAVE_SSE4_1)
  196. set(SSE4_1_COMPILE_FLAGS "-msse4.1")
  197. add_definitions("-DHAVE_SSE4_1")
  198. endif()
  199. check_cxx_compiler_flag("-fopenmp-simd" OPENMP_SIMD)
  200. if(OPENMP_SIMD)
  201. set(DOTPRODUCT_FLAGS "${DOTPRODUCT_FLAGS} -fopenmp-simd")
  202. add_definitions("-DOPENMP_SIMD")
  203. endif(OPENMP_SIMD)
  204. endif(MSVC)
  205. elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64.*|AARCH64.*")
  206. set(HAVE_AVX FALSE)
  207. set(HAVE_AVX2 FALSE)
  208. set(HAVE_AVX512F FALSE)
  209. set(HAVE_FMA FALSE)
  210. set(HAVE_SSE4_1 FALSE)
  211. set(HAVE_NEON TRUE)
  212. elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm.*")
  213. set(HAVE_AVX FALSE)
  214. set(HAVE_AVX2 FALSE)
  215. set(HAVE_AVX512F FALSE)
  216. set(HAVE_FMA FALSE)
  217. set(HAVE_SSE4_1 FALSE)
  218. check_cxx_compiler_flag("-mfpu=neon" HAVE_NEON)
  219. if(HAVE_NEON)
  220. set(NEON_COMPILE_FLAGS "-mfpu=neon")
  221. endif(HAVE_NEON)
  222. else()
  223. set(HAVE_AVX FALSE)
  224. set(HAVE_AVX2 FALSE)
  225. set(HAVE_AVX512F FALSE)
  226. set(HAVE_FMA FALSE)
  227. set(HAVE_NEON FALSE)
  228. set(HAVE_SSE4_1 FALSE)
  229. endif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86|x86_64|AMD64|amd64|i386|i686")
  230. if(HAVE_NEON)
  231. message(STATUS "LTO build is not supported on arm/RBPi.")
  232. set(ENABLE_LTO FALSE) # enable LTO cause fatal error on arm/RBPi
  233. endif()
  234. # Compiler specific environment
  235. if(CMAKE_COMPILER_IS_GNUCXX OR MINGW)
  236. set(CMAKE_CXX_FLAGS_DEBUG
  237. "${CMAKE_CXX_FLAGS_DEBUG} -Wall -DDEBUG -pedantic -Og")
  238. elseif(MSVC)
  239. add_definitions(-D_CRT_SECURE_NO_WARNINGS)
  240. add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) # strdup
  241. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")
  242. if(NOT CLANG)
  243. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
  244. endif()
  245. # Hide some warnings for release target wd4244 'argument': conversion from
  246. # 'uint64_t' to 'unsigned int', possible loss of data wd4251 needs to have
  247. # dll-interface wd4267 return': conversion from 'size_t' to 'int', possible
  248. # loss of data wd4275 non dll-interface class wd4305 ...truncation from
  249. # 'double' to 'float'
  250. set(CMAKE_CXX_FLAGS_RELEASE
  251. "${CMAKE_CXX_FLAGS_RELEASE} /wd4244 /wd4305 /wd4267 /wd4251 /wd4275 /wd4005"
  252. )
  253. set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4068")
  254. # Don't use /Wall because it generates too many warnings.
  255. set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W0 /bigobj")
  256. # MT flag
  257. if(WIN32_MT_BUILD)
  258. set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
  259. message(STATUS "Building with static CRT.")
  260. endif()
  261. endif()
  262. if(CLANG) # clang all platforms
  263. set(CMAKE_CXX_FLAGS_RELEASE
  264. "${CMAKE_CXX_FLAGS_RELEASE} -Wno-unused-command-line-argument")
  265. set(CMAKE_CXX_FLAGS_DEBUG
  266. "${CMAKE_CXX_FLAGS_DEBUG} -Wall -DDEBUG -pedantic -O0")
  267. endif()
  268. if(OPENMP_BUILD
  269. AND MSVC
  270. AND "${MSVC_VERSION}" LESS 1929)
  271. set(OPENMP_BUILD OFF)
  272. endif()
  273. if(OPENMP_BUILD)
  274. find_package(OpenMP QUIET)
  275. # https://stackoverflow.com/questions/12399422
  276. # how-to-set-linker-flags-for-openmp-in-cmakes-try-compile-function
  277. if(NOT OpenMP_FOUND
  278. AND CLANG
  279. AND WIN32)
  280. # workaround because find_package(OpenMP) does not work for clang-cl
  281. # https://gitlab.kitware.com/cmake/cmake/issues/19404
  282. check_include_file_cxx(omp.h HAVE_OMP_H_INCLUDE)
  283. find_library(OpenMP_LIBRARY NAMES omp libomp.lib)
  284. message(">> OpenMP_LIBRARY: ${OpenMP_LIBRARY}")
  285. if(MSVC)
  286. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp")
  287. else()
  288. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
  289. endif()
  290. set(OpenMP_FOUND 1)
  291. # OpenMP 3.1 is fully supported from Clang 3.8.0
  292. add_definitions(-D_OPENMP=201107)
  293. endif()
  294. if(MSVC)
  295. # Note: -openmp:llvm is available for X64 from MSVC 16.9 from MSVC 16.10
  296. # Preview 2 there is support also for x86 and arm64
  297. # https://devblogs.microsoft.com/cppblog/openmp-updates-and-fixes-for-cpp-in-visual-studio-2019-16-10/
  298. if("${OpenMP_CXX_FLAGS}" STREQUAL "-openmp")
  299. set(OpenMP_CXX_FLAGS "-openmp:llvm")
  300. endif()
  301. endif()
  302. if(OpenMP_FOUND)
  303. message(">> OpenMP_FOUND ${OpenMP_FOUND} version: ${OpenMP_CXX_VERSION}")
  304. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
  305. if(NOT TARGET OpenMP::OpenMP_CXX)
  306. add_library(OpenMP::OpenMP_CXX IMPORTED INTERFACE)
  307. endif()
  308. endif()
  309. endif()
  310. if(CYGWIN)
  311. add_definitions(-D__CYGWIN__)
  312. elseif(UNIX)
  313. if(NOT ANDROID)
  314. set(LIB_pthread pthread)
  315. endif()
  316. elseif(WIN32)
  317. set(LIB_Ws2_32 Ws2_32)
  318. endif()
  319. add_definitions("-DCMAKE_BUILD")
  320. # ##############################################################################
  321. #
  322. # packages
  323. #
  324. # ##############################################################################
  325. include(CheckFunctions)
  326. if(SW_BUILD)
  327. find_package(SW REQUIRED)
  328. if(BUILD_SHARED_LIBS)
  329. set(SW_BUILD_SHARED_LIBS 1)
  330. else()
  331. set(SW_BUILD_SHARED_LIBS 0)
  332. endif()
  333. sw_add_package(org.sw.demo.danbloomberg.leptonica
  334. org.sw.demo.libarchive.libarchive)
  335. if(BUILD_TRAINING_TOOLS)
  336. sw_add_package(org.sw.demo.gnome.pango.pangocairo
  337. org.sw.demo.unicode.icu.i18n)
  338. endif()
  339. sw_execute()
  340. else()
  341. find_package(PkgConfig)
  342. # Check for required library. option -DLeptonica_DIR=path => cmake hint where
  343. # to find leptonica
  344. find_package(Leptonica ${MINIMUM_LEPTONICA_VERSION} CONFIG)
  345. if(NOT Leptonica_FOUND AND PKG_CONFIG_EXECUTABLE)
  346. pkg_check_modules(Leptonica lept>=${MINIMUM_LEPTONICA_VERSION})
  347. link_directories(${Leptonica_LIBRARY_DIRS})
  348. endif()
  349. if(NOT Leptonica_FOUND)
  350. message(FATAL_ERROR "Cannot find required library Leptonica. Quitting!")
  351. else()
  352. message(STATUS "Found leptonica version: ${Leptonica_VERSION}")
  353. endif(NOT Leptonica_FOUND)
  354. include_directories(${Leptonica_INCLUDE_DIRS})
  355. check_leptonica_tiff_support()
  356. if ((NOT LEPT_TIFF_RESULT EQUAL 0) AND LEPT_TIFF_COMPILE_SUCCESS)
  357. message(NOTICE "Leptonica was build without TIFF support! Disabling TIFF support...")
  358. set(DISABLE_TIFF ON)
  359. elseif(NOT ${CMAKE_VERSION} VERSION_LESS "3.25")
  360. message(STATUS "Leptonica was build with TIFF support.")
  361. endif()
  362. # Check for optional libraries.
  363. if(DISABLE_TIFF)
  364. set(HAVE_TIFFIO_H OFF)
  365. message(STATUS "TIFF support disabled.")
  366. else(DISABLE_TIFF)
  367. find_package(TIFF) # for tesseract
  368. if(NOT TIFF_FOUND AND PKG_CONFIG_EXECUTABLE)
  369. # try PKG_CONFIG to find libtiff if cmake failed
  370. pkg_check_modules(TIFF libtiff-4)
  371. endif()
  372. if(TIFF_FOUND)
  373. set(HAVE_TIFFIO_H ON)
  374. include_directories(${TIFF_INCLUDE_DIRS})
  375. endif(TIFF_FOUND)
  376. endif(DISABLE_TIFF)
  377. if(DISABLE_ARCHIVE)
  378. set(HAVE_LIBARCHIVE OFF)
  379. message(STATUS "LibArchive support disabled.")
  380. else(DISABLE_ARCHIVE)
  381. find_package(LibArchive)
  382. if(NOT LibArchive_FOUND AND PKG_CONFIG_EXECUTABLE)
  383. # try PKG_CONFIG to find libarchive if cmake failed
  384. pkg_check_modules(LibArchive libarchive)
  385. endif()
  386. if(LibArchive_FOUND)
  387. set(HAVE_LIBARCHIVE ON)
  388. include_directories(${LibArchive_INCLUDE_DIRS})
  389. endif(LibArchive_FOUND)
  390. endif(DISABLE_ARCHIVE)
  391. if(DISABLE_CURL)
  392. set(HAVE_LIBCURL OFF)
  393. message(STATUS "CURL support disabled.")
  394. else(DISABLE_CURL)
  395. find_package(CURL)
  396. if(NOT CURL_FOUND AND PKG_CONFIG_EXECUTABLE)
  397. # try PKG_CONFIG to find libcurl if cmake failed
  398. pkg_check_modules(CURL libcurl)
  399. endif()
  400. if(CURL_FOUND)
  401. set(HAVE_LIBCURL ON)
  402. include_directories(${CURL_INCLUDE_DIRS})
  403. endif(CURL_FOUND)
  404. endif(DISABLE_CURL)
  405. endif()
  406. # ##############################################################################
  407. #
  408. # configure
  409. #
  410. # ##############################################################################
  411. if(MSVC)
  412. set(DOTPRODUCT_FLAGS "${DOTPRODUCT_FLAGS} /fp:fast")
  413. else()
  414. set(DOTPRODUCT_FLAGS "${DOTPRODUCT_FLAGS} -O3 -ffast-math")
  415. endif()
  416. include (GNUInstallDirs)
  417. set(AUTOCONFIG_SRC ${CMAKE_CURRENT_BINARY_DIR}/config_auto.h.in)
  418. set(AUTOCONFIG ${CMAKE_CURRENT_BINARY_DIR}/config_auto.h)
  419. add_definitions(-DHAVE_CONFIG_H)
  420. if(GRAPHICS_DISABLED)
  421. message("ScrollView debugging disabled.")
  422. endif()
  423. set(CMAKE_REQUIRED_INCLUDES
  424. ${CMAKE_REQUIRED_INCLUDES} "${CMAKE_PREFIX_PATH}/include"
  425. ${CMAKE_INSTALL_INCLUDEDIR})
  426. include(Configure)
  427. configure_file(${AUTOCONFIG_SRC} ${AUTOCONFIG} @ONLY)
  428. set(INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
  429. set(LIBRARY_DIRS ${CMAKE_INSTALL_LIBDIR})
  430. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include/tesseract/version.h.in
  431. ${CMAKE_CURRENT_BINARY_DIR}/include/tesseract/version.h @ONLY)
  432. include(CMakePackageConfigHelpers)
  433. include(GenerateExportHeader)
  434. # show summary of configuration
  435. if(${CMAKE_BUILD_TYPE} MATCHES Debug)
  436. set(COMPILER_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_DEBUG}")
  437. elseif(${CMAKE_BUILD_TYPE} MATCHES Release)
  438. set(COMPILER_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_RELEASE}")
  439. if(LTO_SUPPORTED AND ENABLE_LTO)
  440. set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
  441. else()
  442. set(CMAKE_INTERPROCEDURAL_OPTIMIZATION FALSE)
  443. endif() # LTO_SUPPORTED
  444. endif()
  445. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  446. set(BUILD_ARCH "64 bits")
  447. elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
  448. set(BUILD_ARCH "32 bits")
  449. endif()
  450. message(STATUS)
  451. message(STATUS "General configuration for Tesseract ${PACKAGE_VERSION}")
  452. message(STATUS "--------------------------------------------------------")
  453. message(STATUS "Build type: ${CMAKE_BUILD_TYPE} ${BUILD_ARCH}")
  454. message(STATUS "Compiler: ${CMAKE_CXX_COMPILER_ID}")
  455. message(STATUS "Used standard: C++${CMAKE_CXX_STANDARD}")
  456. message(STATUS "CXX compiler options: ${COMPILER_FLAGS}")
  457. get_directory_property(DirCompDefs COMPILE_DEFINITIONS)
  458. message(STATUS "Compile definitions = ${DirCompDefs}")
  459. message(STATUS "Linker options: ${CMAKE_EXE_LINKER_FLAGS} "
  460. "${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UP}}")
  461. message(STATUS "Install directory: ${CMAKE_INSTALL_PREFIX}")
  462. message(STATUS "HAVE_AVX: ${HAVE_AVX}")
  463. message(STATUS "HAVE_AVX2: ${HAVE_AVX2}")
  464. message(STATUS "HAVE_AVX512F: ${HAVE_AVX512F}")
  465. message(STATUS "HAVE_FMA: ${HAVE_FMA}")
  466. message(STATUS "HAVE_SSE4_1: ${HAVE_SSE4_1}")
  467. message(STATUS "MARCH_NATIVE_OPT: ${MARCH_NATIVE_OPT}")
  468. message(STATUS "HAVE_NEON: ${HAVE_NEON}")
  469. message(STATUS "Link-time optimization: ${CMAKE_INTERPROCEDURAL_OPTIMIZATION}")
  470. message(STATUS "--------------------------------------------------------")
  471. message(STATUS "Build with sw [SW_BUILD]: ${SW_BUILD}")
  472. message(STATUS "Build with openmp support [OPENMP_BUILD]: ${OPENMP_BUILD}")
  473. message(STATUS "Build with libarchive support [HAVE_LIBARCHIVE]: "
  474. "${HAVE_LIBARCHIVE}")
  475. message(STATUS "Build with libcurl support [HAVE_LIBCURL]: ${HAVE_LIBCURL}")
  476. message(STATUS "Enable float for LSTM [FAST_FLOAT]: ${FAST_FLOAT}")
  477. message(STATUS "Enable optimization for host CPU (could break HW compatibility)"
  478. " [ENABLE_NATIVE]: ${ENABLE_NATIVE}")
  479. message(STATUS "Disable disable graphics (ScrollView) [GRAPHICS_DISABLED]: "
  480. "${GRAPHICS_DISABLED}")
  481. message(STATUS "Disable the legacy OCR engine [DISABLED_LEGACY_ENGINE]: "
  482. "${DISABLED_LEGACY_ENGINE}")
  483. message(STATUS "Build training tools [BUILD_TRAINING_TOOLS]: "
  484. "${BUILD_TRAINING_TOOLS}")
  485. message(STATUS "Build tests [BUILD_TESTS]: ${BUILD_TESTS}")
  486. message(STATUS "Use system ICU Library [USE_SYSTEM_ICU]: ${USE_SYSTEM_ICU}")
  487. message(
  488. STATUS "Install tesseract configs [INSTALL_CONFIGS]: ${INSTALL_CONFIGS}")
  489. message(STATUS "--------------------------------------------------------")
  490. message(STATUS)
  491. # ##############################################################################
  492. #
  493. # build
  494. #
  495. # ##############################################################################
  496. include(BuildFunctions)
  497. include(SourceGroups)
  498. add_definitions(-D_SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS=1)
  499. include_directories(${CMAKE_CURRENT_BINARY_DIR})
  500. include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
  501. if(ANDROID_TOOLCHAIN)
  502. include_directories(${ANDROID_TOOLCHAIN}/sysroot/usr/include)
  503. add_compile_definitions(__ANDROID_API_FUTURE__)
  504. endif()
  505. # ##############################################################################
  506. # LIBRARY tesseract
  507. # ##############################################################################
  508. file(
  509. GLOB
  510. TESSERACT_SRC
  511. src/ccmain/*.cpp
  512. src/ccstruct/*.cpp
  513. src/ccutil/*.cpp
  514. src/classify/*.cpp
  515. src/cutil/*.cpp
  516. src/dict/*.cpp
  517. src/lstm/*.cpp
  518. src/textord/*.cpp
  519. src/viewer/*.cpp
  520. src/wordrec/*.cpp)
  521. if(DISABLED_LEGACY_ENGINE)
  522. # prepend path to list of source files
  523. function(prepend_path srcs path)
  524. set(tmp, "")
  525. foreach(src IN LISTS ${srcs})
  526. list(APPEND tmp ${path}/${src})
  527. endforeach(src ${srcs})
  528. set(${srcs}
  529. ${tmp}
  530. PARENT_SCOPE)
  531. endfunction()
  532. set(TESSERACT_SRC_LEGACY
  533. src/ccmain/adaptions.cpp
  534. src/ccmain/docqual.cpp
  535. src/ccmain/equationdetect.cpp
  536. src/ccmain/fixspace.cpp
  537. src/ccmain/fixxht.cpp
  538. src/ccmain/osdetect.cpp
  539. src/ccmain/par_control.cpp
  540. src/ccmain/recogtraining.cpp
  541. src/ccmain/superscript.cpp
  542. src/ccmain/tessbox.cpp
  543. src/ccmain/tfacepp.cpp
  544. src/ccstruct/fontinfo.cpp
  545. src/ccstruct/params_training_featdef.cpp
  546. src/ccutil/ambigs.cpp
  547. src/ccutil/bitvector.cpp
  548. src/ccutil/indexmapbidi.cpp
  549. src/classify/adaptive.cpp
  550. src/classify/adaptmatch.cpp
  551. src/classify/blobclass.cpp
  552. src/classify/cluster.cpp
  553. src/classify/clusttool.cpp
  554. src/classify/cutoffs.cpp
  555. src/classify/featdefs.cpp
  556. src/classify/float2int.cpp
  557. src/classify/fpoint.cpp
  558. src/classify/intfeaturespace.cpp
  559. src/classify/intfx.cpp
  560. src/classify/intmatcher.cpp
  561. src/classify/intproto.cpp
  562. src/classify/kdtree.cpp
  563. src/classify/mf.cpp
  564. src/classify/mfoutline.cpp
  565. src/classify/mfx.cpp
  566. src/classify/normfeat.cpp
  567. src/classify/normmatch.cpp
  568. src/classify/ocrfeatures.cpp
  569. src/classify/outfeat.cpp
  570. src/classify/picofeat.cpp
  571. src/classify/protos.cpp
  572. src/classify/shapeclassifier.cpp
  573. src/classify/shapetable.cpp
  574. src/classify/tessclassifier.cpp
  575. src/classify/trainingsample.cpp
  576. src/dict/permdawg.cpp
  577. src/dict/hyphen.cpp
  578. src/wordrec/associate.cpp
  579. src/wordrec/chop.cpp
  580. src/wordrec/chopper.cpp
  581. src/wordrec/drawfx.cpp
  582. src/wordrec/findseam.cpp
  583. src/wordrec/gradechop.cpp
  584. src/wordrec/language_model.cpp
  585. src/wordrec/lm_consistency.cpp
  586. src/wordrec/lm_pain_points.cpp
  587. src/wordrec/lm_state.cpp
  588. src/wordrec/outlines.cpp
  589. src/wordrec/params_model.cpp
  590. src/wordrec/pieces.cpp
  591. src/wordrec/plotedges.cpp
  592. src/wordrec/render.cpp
  593. src/wordrec/segsearch.cpp
  594. src/wordrec/wordclass.cpp)
  595. prepend_path(TESSERACT_SRC_LEGACY "${CMAKE_CURRENT_SOURCE_DIR}")
  596. list(REMOVE_ITEM TESSERACT_SRC ${TESSERACT_SRC_LEGACY})
  597. endif(DISABLED_LEGACY_ENGINE)
  598. list(APPEND arch_files src/arch/dotproduct.cpp src/arch/simddetect.cpp
  599. src/arch/intsimdmatrix.cpp)
  600. if(DOTPRODUCT_FLAGS)
  601. set_source_files_properties(src/arch/dotproduct.cpp
  602. PROPERTIES COMPILE_FLAGS ${DOTPRODUCT_FLAGS})
  603. endif(DOTPRODUCT_FLAGS)
  604. if(HAVE_AVX)
  605. list(APPEND arch_files_opt src/arch/dotproductavx.cpp)
  606. set_source_files_properties(src/arch/dotproductavx.cpp
  607. PROPERTIES COMPILE_FLAGS ${AVX_COMPILE_FLAGS})
  608. endif(HAVE_AVX)
  609. if(HAVE_AVX2)
  610. list(APPEND arch_files_opt src/arch/intsimdmatrixavx2.cpp
  611. src/arch/dotproductavx.cpp)
  612. set_source_files_properties(src/arch/intsimdmatrixavx2.cpp
  613. PROPERTIES COMPILE_FLAGS ${AVX2_COMPILE_FLAGS})
  614. endif(HAVE_AVX2)
  615. if(HAVE_AVX512F)
  616. list(APPEND arch_files_opt src/arch/dotproductavx512.cpp)
  617. set_source_files_properties(src/arch/dotproductavx512.cpp
  618. PROPERTIES COMPILE_FLAGS ${AVX512F_COMPILE_FLAGS})
  619. endif(HAVE_AVX512F)
  620. if(HAVE_FMA)
  621. list(APPEND arch_files_opt src/arch/dotproductfma.cpp)
  622. set_source_files_properties(src/arch/dotproductfma.cpp
  623. PROPERTIES COMPILE_FLAGS ${FMA_COMPILE_FLAGS})
  624. endif(HAVE_FMA)
  625. if(HAVE_SSE4_1)
  626. list(APPEND arch_files_opt src/arch/dotproductsse.cpp
  627. src/arch/intsimdmatrixsse.cpp)
  628. set_source_files_properties(
  629. src/arch/dotproductsse.cpp src/arch/intsimdmatrixsse.cpp
  630. PROPERTIES COMPILE_FLAGS ${SSE4_1_COMPILE_FLAGS})
  631. endif(HAVE_SSE4_1)
  632. if(HAVE_NEON)
  633. list(APPEND arch_files_opt src/arch/dotproductneon.cpp
  634. src/arch/intsimdmatrixneon.cpp)
  635. if(NEON_COMPILE_FLAGS)
  636. set_source_files_properties(
  637. src/arch/dotproductneon.cpp src/arch/intsimdmatrixneon.cpp
  638. PROPERTIES COMPILE_FLAGS ${NEON_COMPILE_FLAGS})
  639. endif()
  640. endif(HAVE_NEON)
  641. file(
  642. GLOB_RECURSE
  643. TESSERACT_HDR
  644. include/*
  645. src/arch/*.h
  646. src/ccmain/*.h
  647. src/ccstruct/*.h
  648. src/ccutil/*.h
  649. src/classify/*.h
  650. src/cutil/*.h
  651. src/dict/*.h
  652. src/lstm/*.h
  653. src/textord/*.h
  654. src/viewer/*.h
  655. src/wordrec/*.h)
  656. set(TESSERACT_SRC
  657. ${TESSERACT_SRC}
  658. src/api/baseapi.cpp
  659. src/api/capi.cpp
  660. src/api/renderer.cpp
  661. src/api/altorenderer.cpp
  662. src/api/pagerenderer.cpp
  663. src/api/hocrrenderer.cpp
  664. src/api/lstmboxrenderer.cpp
  665. src/api/pdfrenderer.cpp
  666. src/api/wordstrboxrenderer.cpp)
  667. set(TESSERACT_CONFIGS
  668. tessdata/configs/alto
  669. tessdata/configs/ambigs.train
  670. tessdata/configs/api_config
  671. tessdata/configs/bazaar
  672. tessdata/configs/bigram
  673. tessdata/configs/box.train
  674. tessdata/configs/box.train.stderr
  675. tessdata/configs/digits
  676. tessdata/configs/get.images
  677. tessdata/configs/hocr
  678. tessdata/configs/inter
  679. tessdata/configs/kannada
  680. tessdata/configs/linebox
  681. tessdata/configs/logfile
  682. tessdata/configs/lstm.train
  683. tessdata/configs/lstmbox
  684. tessdata/configs/lstmdebug
  685. tessdata/configs/makebox
  686. tessdata/configs/page
  687. tessdata/configs/pdf
  688. tessdata/configs/quiet
  689. tessdata/configs/rebox
  690. tessdata/configs/strokewidth
  691. tessdata/configs/tsv
  692. tessdata/configs/txt
  693. tessdata/configs/unlv
  694. tessdata/configs/wordstrbox)
  695. set(TESSERACT_TESSCONFIGS
  696. tessdata/tessconfigs/batch tessdata/tessconfigs/batch.nochop
  697. tessdata/tessconfigs/matdemo tessdata/tessconfigs/msdemo
  698. tessdata/tessconfigs/nobatch tessdata/tessconfigs/segdemo)
  699. set(LIBTESSFILES ${TESSERACT_SRC} ${arch_files} ${arch_files_opt}
  700. ${TESSERACT_HDR})
  701. source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${LIBTESSFILES})
  702. add_library(libtesseract ${LIBTESSFILES})
  703. target_include_directories(
  704. libtesseract BEFORE
  705. PRIVATE src
  706. PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  707. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/arch>
  708. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/ccmain>
  709. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/ccstruct>
  710. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/ccutil>
  711. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/classify>
  712. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/cutil>
  713. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/dict>
  714. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/lstm>
  715. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/textord>
  716. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/viewer>
  717. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/wordrec>
  718. $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/training>)
  719. if(BUILD_SHARED_LIBS)
  720. target_compile_definitions(
  721. libtesseract
  722. PRIVATE -DTESS_EXPORTS
  723. INTERFACE -DTESS_IMPORTS)
  724. # generate_export_header (libtesseract EXPORT_MACRO_NAME TESS_API)
  725. endif()
  726. target_link_libraries(libtesseract PRIVATE ${LIB_Ws2_32} ${LIB_pthread})
  727. if(OpenMP_CXX_FOUND)
  728. target_link_libraries(libtesseract PUBLIC OpenMP::OpenMP_CXX)
  729. endif()
  730. if(LibArchive_FOUND)
  731. target_link_libraries(libtesseract PUBLIC ${LibArchive_LIBRARIES})
  732. endif(LibArchive_FOUND)
  733. if(CURL_FOUND)
  734. if(NOT CURL_LIBRARIES)
  735. target_link_libraries(libtesseract PUBLIC CURL::libcurl)
  736. else()
  737. target_link_libraries(libtesseract PUBLIC ${CURL_LIBRARIES})
  738. endif()
  739. endif(CURL_FOUND)
  740. set_target_properties(
  741. libtesseract PROPERTIES VERSION
  742. ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
  743. set_target_properties(
  744. libtesseract PROPERTIES SOVERSION
  745. ${VERSION_MAJOR}.${VERSION_MINOR})
  746. set_target_properties(
  747. libtesseract
  748. PROPERTIES
  749. OUTPUT_NAME
  750. tesseract$<$<BOOL:${WIN32}>:${VERSION_MAJOR}${VERSION_MINOR}$<$<CONFIG:DEBUG>:d>>
  751. )
  752. if(SW_BUILD)
  753. target_link_libraries(libtesseract PUBLIC org.sw.demo.danbloomberg.leptonica
  754. org.sw.demo.libarchive.libarchive)
  755. file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/TesseractTargets.cmake
  756. "include(${CMAKE_CURRENT_BINARY_DIR}/cppan.cmake)\n")
  757. export(
  758. TARGETS libtesseract
  759. APPEND
  760. FILE ${CMAKE_CURRENT_BINARY_DIR}/TesseractTargets.cmake
  761. NAMESPACE Tesseract::)
  762. else()
  763. target_link_libraries(libtesseract PUBLIC ${Leptonica_LIBRARIES})
  764. export(
  765. TARGETS libtesseract
  766. FILE ${CMAKE_CURRENT_BINARY_DIR}/TesseractTargets.cmake
  767. NAMESPACE Tesseract::)
  768. endif()
  769. if(WIN32
  770. AND CLANG
  771. AND OPENMP_BUILD)
  772. # Workaround for "libomp.lib is not automatically added on Windows" see:
  773. # http://lists.llvm.org/pipermail/openmp-dev/2015-August/000857.html
  774. target_link_libraries(libtesseract PRIVATE ${OpenMP_LIBRARY})
  775. endif()
  776. if(ANDROID)
  777. add_definitions(-DANDROID)
  778. find_package(CpuFeaturesNdkCompat REQUIRED)
  779. target_include_directories(
  780. libtesseract
  781. PRIVATE "${CpuFeaturesNdkCompat_DIR}/../../../include/ndk_compat")
  782. target_link_libraries(libtesseract PRIVATE CpuFeatures::ndk_compat)
  783. endif()
  784. # ##############################################################################
  785. # EXECUTABLE tesseract
  786. # ##############################################################################
  787. add_executable(tesseract src/tesseract.cpp)
  788. target_link_libraries(tesseract libtesseract)
  789. if(HAVE_TIFFIO_H AND WIN32)
  790. target_link_libraries(tesseract ${TIFF_LIBRARIES})
  791. endif()
  792. if(OPENMP_BUILD AND UNIX)
  793. target_link_libraries(tesseract pthread)
  794. endif()
  795. # ##############################################################################
  796. if(BUILD_TESTS
  797. AND EXISTS
  798. ${CMAKE_CURRENT_SOURCE_DIR}/unittest/third_party/googletest/CMakeLists.txt
  799. )
  800. add_subdirectory(unittest/third_party/googletest)
  801. endif()
  802. if(BUILD_TRAINING_TOOLS)
  803. add_subdirectory(src/training)
  804. endif()
  805. get_target_property(tesseract_NAME libtesseract NAME)
  806. get_target_property(tesseract_VERSION libtesseract VERSION)
  807. get_target_property(tesseract_OUTPUT_NAME libtesseract OUTPUT_NAME)
  808. configure_file(tesseract.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/tesseract.pc.in
  809. @ONLY)
  810. # to resolve generator expression in OUTPUT_NAME
  811. file(
  812. GENERATE
  813. OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/tesseract_$<CONFIG>.pc
  814. INPUT ${CMAKE_CURRENT_BINARY_DIR}/tesseract.pc.in)
  815. configure_package_config_file(
  816. cmake/templates/TesseractConfig.cmake.in
  817. ${CMAKE_CURRENT_BINARY_DIR}/cmake/tesseract/TesseractConfig.cmake
  818. INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/tesseract
  819. PATH_VARS INCLUDE_DIR LIBRARY_DIRS)
  820. write_basic_package_version_file(
  821. ${CMAKE_CURRENT_BINARY_DIR}/cmake/tesseract/TesseractConfigVersion.cmake
  822. VERSION ${PACKAGE_VERSION}
  823. COMPATIBILITY SameMajorVersion)
  824. install(
  825. FILES ${CMAKE_CURRENT_BINARY_DIR}/tesseract_$<CONFIG>.pc
  826. DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
  827. RENAME tesseract.pc)
  828. install(TARGETS tesseract DESTINATION bin)
  829. if (MSVC)
  830. install(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}> DESTINATION bin OPTIONAL)
  831. endif()
  832. install(
  833. TARGETS libtesseract
  834. EXPORT TesseractTargets
  835. RUNTIME DESTINATION bin
  836. RUNTIME DESTINATION bin
  837. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
  838. ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
  839. if (MSVC AND BUILD_SHARED_LIBS)
  840. install(FILES $<TARGET_PDB_FILE:libtesseract> DESTINATION bin OPTIONAL)
  841. endif()
  842. install(
  843. EXPORT TesseractTargets
  844. NAMESPACE Tesseract::
  845. DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/tesseract)
  846. install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/cmake
  847. DESTINATION ${CMAKE_INSTALL_LIBDIR})
  848. install(
  849. FILES include/tesseract/baseapi.h
  850. include/tesseract/capi.h
  851. include/tesseract/renderer.h
  852. ${CMAKE_CURRENT_BINARY_DIR}/include/tesseract/version.h
  853. include/tesseract/ltrresultiterator.h
  854. include/tesseract/pageiterator.h
  855. include/tesseract/resultiterator.h
  856. include/tesseract/osdetect.h
  857. include/tesseract/publictypes.h
  858. include/tesseract/ocrclass.h
  859. include/tesseract/export.h
  860. include/tesseract/unichar.h
  861. # ${CMAKE_CURRENT_BINARY_DIR}/src/endianness.h
  862. DESTINATION include/tesseract)
  863. if(INSTALL_CONFIGS)
  864. install(FILES ${TESSERACT_CONFIGS}
  865. DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/tessdata/configs)
  866. install(FILES ${TESSERACT_TESSCONFIGS}
  867. DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/tessdata/tessconfigs)
  868. endif()
  869. # ##############################################################################
  870. # uninstall target
  871. # ##############################################################################
  872. if(NOT TARGET uninstall)
  873. configure_file(
  874. "${CMAKE_CURRENT_SOURCE_DIR}/cmake/templates/cmake_uninstall.cmake.in"
  875. "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY)
  876. add_custom_target(
  877. uninstall
  878. COMMENT "Uninstall installed files"
  879. COMMAND ${CMAKE_COMMAND} -P
  880. ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
  881. endif()
  882. # ##############################################################################