CMakeLists.txt 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. # WinPR: Windows Portable Runtime
  2. # winpr cmake build script
  3. #
  4. # Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
  5. #
  6. # Licensed under the Apache License, Version 2.0 (the "License");
  7. # you may not use this file except in compliance with the License.
  8. # You may obtain a copy of the License at
  9. #
  10. # http://www.apache.org/licenses/LICENSE-2.0
  11. #
  12. # Unless required by applicable law or agreed to in writing, software
  13. # distributed under the License is distributed on an "AS IS" BASIS,
  14. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. # See the License for the specific language governing permissions and
  16. # limitations under the License.
  17. cmake_minimum_required(VERSION 2.8)
  18. project(WinPR C)
  19. set(CMAKE_COLOR_MAKEFILE ON)
  20. if(RVC_VERSION)
  21. set(RVC_BUILD 1)
  22. endif()
  23. #set(BUILD_TESTING OFF)
  24. # Include cmake modules
  25. include(CheckIncludeFiles)
  26. include(CheckLibraryExists)
  27. include(CheckSymbolExists)
  28. include(CheckStructHasMember)
  29. include(FindPkgConfig)
  30. include(TestBigEndian)
  31. # Include our extra modules
  32. # set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../cmake/)
  33. # Check for cmake compatibility (enable/disable features)
  34. include(CheckCmakeCompat)
  35. include(FindFeature)
  36. include(ConfigOptions)
  37. include(ComplexLibrary)
  38. include(FeatureSummary)
  39. include(CheckCCompilerFlag)
  40. include(GNUInstallDirsWrapper)
  41. include(CMakePackageConfigHelpers)
  42. # Soname versioning
  43. set(RAW_VERSION_STRING "2.0.0-dev5")
  44. if(EXISTS "${CMAKE_SOURCE_DIR}/.source_tag")
  45. file(READ ${CMAKE_SOURCE_DIR}/.source_tag RAW_VERSION_STRING)
  46. elseif(USE_VERSION_FROM_GIT_TAG)
  47. git_get_exact_tag(_GIT_TAG --tags --always)
  48. if (NOT ${_GIT_TAG} STREQUAL "n/a")
  49. set(RAW_VERSION_STRING ${_GIT_TAG})
  50. endif()
  51. endif()
  52. string(STRIP ${RAW_VERSION_STRING} RAW_VERSION_STRING)
  53. set(VERSION_REGEX "^.?([0-9]+)\\.([0-9]+)\\.([0-9]+)-?(.*)")
  54. string(REGEX REPLACE "${VERSION_REGEX}" "\\1" WINPR_VERSION_MAJOR "${RAW_VERSION_STRING}")
  55. string(REGEX REPLACE "${VERSION_REGEX}" "\\2" WINPR_VERSION_MINOR "${RAW_VERSION_STRING}")
  56. string(REGEX REPLACE "${VERSION_REGEX}" "\\3" WINPR_VERSION_REVISION "${RAW_VERSION_STRING}")
  57. string(REGEX REPLACE "${VERSION_REGEX}" "\\4" WINPR_VERSION_SUFFIX "${RAW_VERSION_STRING}")
  58. set(WINPR_VERSION "${WINPR_VERSION_MAJOR}.${WINPR_VERSION_MINOR}.${WINPR_VERSION_REVISION}")
  59. set(WINPR_API_VERSION "${WINPR_VERSION_MAJOR}")
  60. if (WINPR_VERSION_SUFFIX)
  61. set(WINPR_VERSION_FULL "${WINPR_VERSION}-${WINPR_VERSION_SUFFIX}")
  62. else()
  63. set(WINPR_VERSION_FULL "${WINPR_VERSION}")
  64. endif()
  65. if(NOT IOS)
  66. check_include_files(stdbool.h WINPR_HAVE_STDBOOL_H)
  67. check_include_files(stdint.h WINPR_HAVE_STDINT_H)
  68. check_include_files(inttypes.h WINPR_HAVE_INTTYPES_H)
  69. else(NOT IOS)
  70. set(WINPR_HAVE_STDBOOL_H 1)
  71. set(WINPR_HAVE_STDINT_H 1)
  72. set(WINPR_HAVE_INTTYPES_H 1)
  73. endif(NOT IOS)
  74. set(OPENSSL_FOUND TRUE)
  75. # set(OPENSSL_INCLUDE_DIR "${CMAKE_BINARY_DIR}/third_party/openssl-1.1.1d/include")
  76. include_directories(${OPENSSL_INCLUDE_DIR})
  77. # set(OPENSSL_LIBRARIES crypto)
  78. set(OPENSSL_VERSION "1.1.1d")
  79. set(OPENSSL_SSL_LIBRARY ssl)
  80. set(OPENSSL_CRYPTO_LIBRARY crypto)
  81. MARK_AS_ADVANCED(OPENSSL_CRYPTO_LIBRARY OPENSSL_SSL_LIBRARY)
  82. # compat defines
  83. SET(OPENSSL_SSL_LIBRARIES ${OPENSSL_SSL_LIBRARY})
  84. SET(OPENSSL_CRYPTO_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})
  85. SET(OPENSSL_LIBRARIES ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY})
  86. if(RVC_BUILD)
  87. set(WINPR_VERSION_FULL ${WINPR_VERSION_FULL} PARENT_SCOPE)
  88. set(WINPR_VERSION ${WINPR_VERSION} PARENT_SCOPE)
  89. set(WINPR_API_VERSION ${WINPR_API_VERSION} PARENT_SCOPE)
  90. else()
  91. set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
  92. if(NOT IOS)
  93. find_package(Threads REQUIRED)
  94. endif()
  95. # Include files
  96. if(NOT IOS)
  97. check_include_files(fcntl.h HAVE_FCNTL_H)
  98. check_include_files(unistd.h HAVE_UNISTD_H)
  99. check_include_files(execinfo.h HAVE_EXECINFO_H)
  100. check_include_files(inttypes.h HAVE_INTTYPES_H)
  101. check_include_files(sys/modem.h HAVE_SYS_MODEM_H)
  102. check_include_files(sys/filio.h HAVE_SYS_FILIO_H)
  103. check_include_files(sys/sockio.h HAVE_SYS_SOCKIO_H)
  104. check_include_files(sys/strtio.h HAVE_SYS_STRTIO_H)
  105. check_include_files(sys/select.h HAVE_SYS_SELECT_H)
  106. else()
  107. set(HAVE_FCNTL_H 1)
  108. set(HAVE_UNISTD_H 1)
  109. set(HAVE_INTTYPES_H 1)
  110. set(HAVE_SYS_FILIO_H 1)
  111. endif()
  112. if(NOT IOS)
  113. check_struct_has_member("struct tm" tm_gmtoff time.h HAVE_TM_GMTOFF)
  114. else()
  115. set(HAVE_TM_GMTOFF 1)
  116. endif()
  117. if(NOT WIN32)
  118. CHECK_SYMBOL_EXISTS(pthread_mutex_timedlock pthread.h HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
  119. if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
  120. CHECK_LIBRARY_EXISTS(pthread pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
  121. endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL)
  122. if (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
  123. CHECK_LIBRARY_EXISTS(pthreads pthread_mutex_timedlock "" HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
  124. endif (NOT HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB)
  125. if (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
  126. set(HAVE_PTHREAD_MUTEX_TIMEDLOCK ON)
  127. endif (HAVE_PTHREAD_MUTEX_TIMEDLOCK_SYMBOL OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIB OR HAVE_PTHREAD_MUTEX_TIMEDLOCK_LIBS)
  128. endif()
  129. set(OPENSSL_FEATURE_TYPE "OPTIONAL")
  130. set(OPENSSL_FEATURE_PURPOSE "cryptography")
  131. set(OPENSSL_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
  132. set(MBEDTLS_FEATURE_TYPE "OPTIONAL")
  133. set(MBEDTLS_FEATURE_PURPOSE "cryptography")
  134. set(MBEDTLS_FEATURE_DESCRIPTION "encryption, certificate validation, hashing functions")
  135. find_feature(OpenSSL ${OPENSSL_FEATURE_TYPE} ${OPENSSL_FEATURE_PURPOSE} ${OPENSSL_FEATURE_DESCRIPTION})
  136. find_feature(MbedTLS ${MBEDTLS_FEATURE_TYPE} ${MBEDTLS_FEATURE_PURPOSE} ${MBEDTLS_FEATURE_DESCRIPTION})
  137. if(OPENSSL_FOUND)
  138. add_definitions("-DWITH_OPENSSL")
  139. endif()
  140. if(MBEDTLS_FOUND)
  141. add_definitions("-DWITH_MBEDTLS")
  142. endif()
  143. # Include directories
  144. include_directories(${CMAKE_CURRENT_BINARY_DIR})
  145. # Configure files
  146. add_definitions("-DHAVE_CONFIG_H")
  147. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)
  148. enable_testing()
  149. if(MSVC)
  150. set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
  151. else()
  152. set(TESTING_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/Testing")
  153. endif()
  154. endif()
  155. # Default to release build type
  156. if(NOT CMAKE_BUILD_TYPE)
  157. set(CMAKE_BUILD_TYPE "Release")
  158. endif()
  159. # Default to build shared libs
  160. if(NOT DEFINED BUILD_SHARED_LIBS)
  161. set(BUILD_SHARED_LIBS ON)
  162. endif()
  163. if(BUILD_SHARED_LIBS)
  164. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_DLL")
  165. endif()
  166. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINPR_EXPORTS")
  167. # Enable 64bit file support on linux and FreeBSD.
  168. if("${CMAKE_SYSTEM_NAME}" MATCHES "Linux" OR FREEBSD)
  169. add_definitions("-D_FILE_OFFSET_BITS=64")
  170. endif()
  171. include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
  172. include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
  173. add_subdirectory(include)
  174. add_subdirectory(libwinpr)
  175. if(NOT ANDROID AND NOT IOS AND NOT UWP AND WITH_WINPR_TOOLS)
  176. add_subdirectory(tools)
  177. endif()
  178. if(BUILD_TESTING)
  179. # add_subdirectory(test)
  180. endif()
  181. if(RVC_BUILD)
  182. set(WINPR_PKG_CONFIG_FILENAME winpr${WINPR_VERSION_MAJOR} PARENT_SCOPE)
  183. endif()
  184. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/winpr.pc.in ${CMAKE_CURRENT_BINARY_DIR}/winpr${WINPR_VERSION_MAJOR}.pc @ONLY)
  185. install(FILES ${CMAKE_CURRENT_BINARY_DIR}/winpr${WINPR_VERSION_MAJOR}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)