CMakeLists.txt 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. cmake_minimum_required(VERSION 3.6)
  2. set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "build type")
  3. set(CMAKE_SKIP_RPATH TRUE)
  4. project(srpc
  5. VERSION 0.10.2
  6. LANGUAGES C CXX)
  7. ###Options
  8. if (WIN32)
  9. option(SRPC_BUILD_STATIC_RUNTIME "Use static runtime" ON)
  10. endif ()
  11. #### CHECK
  12. include(CheckIncludeFile)
  13. include(CheckIncludeFileCXX)
  14. set(THIRD_PARTY_FATAL_MESSAGE
  15. " is neither installed nor found in third_party!
  16. Sugguestion to initial third_party:
  17. \"git submodule update --init\""
  18. )
  19. find_library(LZ4_LIBRARY NAMES lz4)
  20. check_include_file("lz4.h" LZ4_INSTALLED)
  21. if (NOT LZ4_INSTALLED AND ${LZ4_LIBRARY} STREQUAL "LZ4_LIBRARY-NOTFOUND")
  22. if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/lz4/lib/lz4.h")
  23. message( FATAL_ERROR "\nLz4" ${THIRD_PARTY_FATAL_MESSAGE} )
  24. endif ()
  25. else ()
  26. if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/lz4/lib/lz4.h")
  27. message("Lz4 third_party FOUND. Use for source code dependencies.")
  28. set(LZ4_INSTALLED 0 CACHE INTERNAL "check_lz4_installed")
  29. else ()
  30. find_path(LZ4_INCLUDE_DIR NAMES "lz4.h")
  31. include_directories(${LZ4_INCLUDE_DIR})
  32. set(LZ4_INSTALLED 1 CACHE INTERNAL "check_lz4_installed")
  33. endif ()
  34. endif ()
  35. find_package(Snappy)
  36. check_include_file_cxx("snappy.h" SNAPPY_INSTALLED)
  37. if (NOT SNAPPY_INSTALLED AND NOT ${Snappy_FOUND})
  38. if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/snappy/cmake")
  39. message( FATAL_ERROR "\nSnappy" ${THIRD_PARTY_FATAL_MESSAGE} )
  40. endif ()
  41. else ()
  42. if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/third_party/snappy/cmake")
  43. message("Snappy third_party FOUND. Use for source code dependencies.")
  44. set(SNAPPY_INSTALLED 0 CACHE INTERNAL "check_snappy_installed")
  45. else ()
  46. find_path(Snappy_INCLUDE_DIR NAMES "snappy.h")
  47. include_directories(${Snappy_INCLUDE_DIR})
  48. set(SNAPPY_INSTALLED 1 CACHE INTERNAL "check_snappy_installed")
  49. endif ()
  50. endif ()
  51. check_include_file_cxx("workflow/Workflow.h" WORKFLOW_INSTALLED)
  52. if (NOT WORKFLOW_INSTALLED)
  53. if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/workflow/workflow-config.cmake.in")
  54. message( FATAL_ERROR "\nWorkflow" ${THIRD_PARTY_FATAL_MESSAGE} )
  55. endif ()
  56. else ()
  57. if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/workflow/workflow-config.cmake.in")
  58. message("Workflow third_party FOUND. Use for source code dependencies.")
  59. set(WORKFLOW_INSTALLED 0)
  60. endif ()
  61. endif ()
  62. find_program(PROTOC "protoc")
  63. if(${PROTOC} STREQUAL "PROTOC-NOTFOUND")
  64. message( FATAL_ERROR "Protobuf compiler is missing!")
  65. endif()
  66. #### PREPARE
  67. set(INC_DIR ${PROJECT_SOURCE_DIR}/_include CACHE PATH "srpc inc")
  68. set(LIB_DIR ${PROJECT_SOURCE_DIR}/_lib CACHE PATH "srpc lib")
  69. set(BIN_DIR ${PROJECT_SOURCE_DIR}/_bin CACHE PATH "srpc bin")
  70. include(GNUInstallDirs)
  71. set(CMAKE_CONFIG_INSTALL_FILE ${PROJECT_BINARY_DIR}/config.toinstall.cmake)
  72. set(CMAKE_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
  73. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LIB_DIR})
  74. set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_DIR})
  75. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${BIN_DIR})
  76. add_custom_target(
  77. LINK_HEADERS ALL
  78. COMMENT "link headers..."
  79. )
  80. INCLUDE(CMakeLists_Headers.txt)
  81. macro(makeLink src dest target)
  82. add_custom_command(
  83. TARGET ${target} PRE_BUILD
  84. COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dest}
  85. DEPENDS ${dest}
  86. )
  87. endmacro()
  88. add_custom_command(
  89. TARGET LINK_HEADERS PRE_BUILD
  90. COMMAND ${CMAKE_COMMAND} -E make_directory ${INC_DIR}/${PROJECT_NAME}
  91. )
  92. foreach(header_file ${INCLUDE_HEADERS})
  93. string(REPLACE "/" ";" arr ${header_file})
  94. list(GET arr -1 file_name)
  95. makeLink(${PROJECT_SOURCE_DIR}/${header_file} ${INC_DIR}/${PROJECT_NAME}/${file_name} LINK_HEADERS)
  96. endforeach()
  97. if (WIN32)
  98. if (SRPC_BUILD_STATIC_RUNTIME)
  99. set(CompilerFlags
  100. CMAKE_CXX_FLAGS
  101. CMAKE_CXX_FLAGS_DEBUG
  102. CMAKE_CXX_FLAGS_RELEASE
  103. CMAKE_CXX_FLAGS_MINSIZEREL
  104. CMAKE_C_FLAGS
  105. CMAKE_C_FLAGS_DEBUG
  106. CMAKE_C_FLAGS_RELEASE
  107. CMAKE_C_FLAGS_MINSIZEREL
  108. )
  109. foreach(CompilerFlag ${CompilerFlags})
  110. string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
  111. endforeach ()
  112. endif ()
  113. endif ()
  114. add_subdirectory(src)
  115. #### CONFIG
  116. include(CMakePackageConfigHelpers)
  117. set(CONFIG_INC_DIR ${INC_DIR})
  118. set(CONFIG_LIB_DIR ${LIB_DIR})
  119. if (VCPKG_TOOLCHAIN AND EXISTS "${CMAKE_INSTALL_PREFIX}/tools/srpc")
  120. set(CONFIG_BIN_DIR ${CMAKE_INSTALL_PREFIX}/tools/srpc)
  121. set(WITH_VCPKG_TOOLCHAIN 1 CACHE INTERNAL "build_with_vcpkg_toolchain")
  122. message("Install with VCPKG toolchain. Dir ${CMAKE_INSTALL_PREFIX}/tools/srpc.")
  123. else()
  124. set(CONFIG_BIN_DIR ${BIN_DIR})
  125. set(WITH_VCPKG_TOOLCHAIN 0 CACHE INTERNAL "build_with_vcpkg_toolchain")
  126. endif()
  127. configure_package_config_file(
  128. ${PROJECT_NAME}-config.cmake.in
  129. ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}-config.cmake
  130. INSTALL_DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}
  131. PATH_VARS CONFIG_INC_DIR CONFIG_LIB_DIR CONFIG_BIN_DIR
  132. )
  133. set(CONFIG_INC_DIR ${CMAKE_INSTALL_INCLUDEDIR})
  134. set(CONFIG_LIB_DIR ${CMAKE_INSTALL_LIBDIR})
  135. set(CONFIG_BIN_DIR ${CMAKE_INSTALL_BINDIR})
  136. configure_package_config_file(
  137. ${PROJECT_NAME}-config.cmake.in
  138. ${CMAKE_CONFIG_INSTALL_FILE}
  139. INSTALL_DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}
  140. PATH_VARS CONFIG_INC_DIR CONFIG_LIB_DIR CONFIG_BIN_DIR
  141. )
  142. write_basic_package_version_file(
  143. ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
  144. VERSION ${WORKFLOW_VERSION}
  145. COMPATIBILITY AnyNewerVersion
  146. )
  147. install(
  148. FILES ${CMAKE_CONFIG_INSTALL_FILE}
  149. DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}
  150. COMPONENT devel
  151. RENAME ${PROJECT_NAME}-config.cmake
  152. )
  153. install(
  154. FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
  155. DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}
  156. COMPONENT devel
  157. )
  158. install(
  159. FILES ${INCLUDE_HEADERS}
  160. DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
  161. COMPONENT devel
  162. )
  163. install(
  164. FILES README.md
  165. DESTINATION "${CMAKE_INSTALL_DOCDIR}-${PROJECT_VERSION}"
  166. COMPONENT devel
  167. )