Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 

243 строки
8.8 KiB

  1. # Initialize CMake ################################################################################
  2. CMake_Minimum_Required ( VERSION 3.12.0 FATAL_ERROR )
  3. # CMAKE_BUILD_TYPE
  4. If ( NOT CMAKE_BUILD_TYPE )
  5. Set ( CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build!" FORCE )
  6. EndIf ( NOT CMAKE_BUILD_TYPE )
  7. Set_Property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel )
  8. # CMAKE_MODULE_PATH
  9. If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" )
  10. Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" )
  11. EndIf ( )
  12. If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/cmake" )
  13. Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/cmake" )
  14. EndIf ( )
  15. # Project #########################################################################################
  16. Include ( GNUInstallDirs )
  17. Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-options.cmake )
  18. Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-const.cmake )
  19. Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-var.cmake )
  20. Project ( ${LIBHELLOWORLD_PROJECT_NAME}
  21. DESCRIPTION "${LIBHELLOWORLD_PROJECT_DESCRIPTION}"
  22. VERSION "${LIBHELLOWORLD_VERSION}" )
  23. Include ( CTest )
  24. # Initialize ######################################################################################
  25. Include ( cotire OPTIONAL RESULT_VARIABLE HAS_COTIRE )
  26. Include ( pedantic OPTIONAL RESULT_VARIABLE HAS_PEDANTIC )
  27. Include ( cmake_tests OPTIONAL RESULT_VARIABLE HAS_CMAKE_TESTS )
  28. Include ( strip_symbols OPTIONAL RESULT_VARIABLE HAS_STRIP_SYMBOLS )
  29. Find_Package ( GTest QUIET )
  30. Find_Package ( Sanitizers QUIET )
  31. Message ( FATAL_ERROR "Please configure the dependencies of this project!" )
  32. # Find_Package ( libhelloworld REQUIRED ${LIBHELLOWORLD_FIND_PACKAGE_EXTRA_ARGS} )
  33. # Object Library ##################################################################################
  34. Set ( CMAKE_POSITION_INDEPENDENT_CODE ON )
  35. Set ( LIBHELLOWORLD_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" )
  36. Set ( LIBHELLOWORLD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" )
  37. File ( GLOB_RECURSE LIBHELLOWORLD_HEADER_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.h" )
  38. File ( GLOB_RECURSE LIBHELLOWORLD_INLINE_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.inl" )
  39. File ( GLOB_RECURSE LIBHELLOWORLD_SOURCE_FILES "${LIBHELLOWORLD_SOURCE_DIR}/*.cpp" )
  40. File ( GLOB_RECURSE LIBHELLOWORLD_TEST_HEADER_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.test.h" )
  41. File ( GLOB_RECURSE LIBHELLOWORLD_TEST_INLINE_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.test.inl" )
  42. File ( GLOB_RECURSE LIBHELLOWORLD_TEST_SOURCE_FILES "${LIBHELLOWORLD_SOURCE_DIR}/*.test.cpp" )
  43. ForEach ( TEST_FILE IN LISTS LIBHELLOWORLD_TEST_HEADER_FILES )
  44. List ( REMOVE_ITEM LIBHELLOWORLD_HEADER_FILES "${TEST_FILE}" )
  45. EndForEach ( )
  46. ForEach ( TEST_FILE IN LISTS LIBHELLOWORLD_TEST_INLINE_FILES )
  47. List ( REMOVE_ITEM LIBHELLOWORLD_INLINE_FILES "${TEST_FILE}" )
  48. EndForEach ( )
  49. ForEach ( TEST_FILE IN LISTS LIBHELLOWORLD_TEST_SOURCE_FILES )
  50. List ( REMOVE_ITEM LIBHELLOWORLD_SOURCE_FILES "${TEST_FILE}" )
  51. EndForEach ( )
  52. Add_Library (
  53. libhelloworld-objects
  54. OBJECT
  55. ${LIBHELLOWORLD_HEADER_FILES}
  56. ${LIBHELLOWORLD_INLINE_FILES}
  57. ${LIBHELLOWORLD_SOURCE_FILES} )
  58. Target_Include_Directories (
  59. libhelloworld-objects
  60. PUBLIC
  61. $<BUILD_INTERFACE:${LIBHELLOWORLD_INCLUDE_DIR}>
  62. $<INSTALL_INTERFACE:${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}> )
  63. # Static Library ##################################################################################
  64. Add_Library (
  65. libhelloworld-static
  66. STATIC
  67. $<TARGET_OBJECTS:libhelloworld-objects> )
  68. Set_Target_Properties (
  69. libhelloworld-static
  70. PROPERTIES
  71. VERSION "${LIBHELLOWORLD_VERSION}-${LIBHELLOWORLD_VERSION_HASH_SHORT}"
  72. OUTPUT_NAME "${LIBHELLOWORLD_OUTPUTNAME}" )
  73. Target_Include_Directories (
  74. libhelloworld-static
  75. PUBLIC
  76. $<BUILD_INTERFACE:${LIBHELLOWORLD_INCLUDE_DIR}>
  77. $<INSTALL_INTERFACE:${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}> )
  78. # Shared Library ##################################################################################
  79. Add_Library (
  80. libhelloworld-shared
  81. SHARED
  82. $<TARGET_OBJECTS:libhelloworld-objects> )
  83. Set_Target_Properties (
  84. libhelloworld-shared
  85. PROPERTIES
  86. VERSION "${LIBHELLOWORLD_VERSION}-${LIBHELLOWORLD_VERSION_HASH_SHORT}"
  87. OUTPUT_NAME "${LIBHELLOWORLD_OUTPUTNAME}" )
  88. Target_Include_Directories (
  89. libhelloworld-shared
  90. PUBLIC
  91. $<BUILD_INTERFACE:${LIBHELLOWORLD_INCLUDE_DIR}>
  92. $<INSTALL_INTERFACE:${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}> )
  93. # Tests ###########################################################################################
  94. If ( GTest_FOUND )
  95. ForEach ( FILE IN LISTS LIBHELLOWORLD_TEST_SOURCE_FILES )
  96. # Add Test
  97. File ( RELATIVE_PATH RELFILE "${LIBHELLOWORLD_SOURCE_DIR}" "${FILE}" )
  98. Get_Filename_Component ( TEST_DIR "${RELFILE}" DIRECTORY )
  99. Get_Filename_Component ( TEST_NAME "${RELFILE}" NAME_WE )
  100. Set ( TEST_NAME "${TEST_DIR}/${TEST_NAME}" )
  101. String ( REPLACE ".test" "" TEST_NAME "${TEST_NAME}" )
  102. String ( REPLACE "\\" "-" TEST_NAME "${TEST_NAME}" )
  103. String ( REPLACE "/" "-" TEST_NAME "${TEST_NAME}" )
  104. String ( REPLACE "_" "-" TEST_NAME "${TEST_NAME}" )
  105. Set ( TEST_NAME "test-${TEST_NAME}" )
  106. Add_Executable ( ${TEST_NAME}
  107. EXCLUDE_FROM_ALL
  108. ${HELLOWORLD_TEST_HEADER_FILES}
  109. ${HELLOWORLD_TEST_INLINE_FILES}
  110. ${FILE} )
  111. Target_Link_Libraries ( ${TEST_NAME}
  112. PUBLIC
  113. libhelloworld-objects
  114. GTest::Main )
  115. # Sanitizers
  116. If ( Sanitizers_FOUND )
  117. Add_Sanitizers ( ${TEST_NAME} )
  118. EndIf ( )
  119. # pedantic
  120. If ( HAS_PEDANTIC )
  121. Pedantic_Apply_Flags_Target ( ${TEST_NAME} ALL )
  122. EndIf ( )
  123. # test
  124. If ( HAS_CMAKE_TESTS )
  125. Add_CMake_Test ( NAME ${TEST_NAME} TARGET ${TEST_NAME} GROUP gedt )
  126. Else ( )
  127. Add_Test ( NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
  128. EndIf ( )
  129. EndForEach ( )
  130. EndIf ( )
  131. # Optimization ####################################################################################
  132. # sanitizers
  133. If ( Sanitizers_FOUND )
  134. Add_Sanitizers ( libhelloworld-objects )
  135. EndIf ( )
  136. # pedantic
  137. If ( HAS_PEDANTIC )
  138. Pedantic_Apply_Flags_Target ( libhelloworld-objects ALL )
  139. Pedantic_Apply_Flags_Target ( libhelloworld-static ALL )
  140. Pedantic_Apply_Flags_Target ( libhelloworld-shared ALL )
  141. EndIf ( )
  142. # cotire
  143. If ( HAS_COTIRE )
  144. Cotire ( libhelloworld-objects )
  145. Cotire ( libhelloworld-static )
  146. Cotire ( libhelloworld-shared )
  147. EndIf ( )
  148. # Install #########################################################################################
  149. # Header
  150. If ( LIBHELLOWORLD_INSTALL_HEADER )
  151. Install ( DIRECTORY "${LIBHELLOWORLD_INCLUDE_DIR}/libhelloworld"
  152. DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}"
  153. FILES_MATCHING
  154. PATTERN "*.h"
  155. PATTERN "*.inl"
  156. PATTERN "*.test.h" EXCLUDE
  157. PATTERN "*.test.inl" EXCLUDE )
  158. EndIf ( )
  159. # Static
  160. If ( LIBHELLOWORLD_INSTALL_STATIC )
  161. Install ( TARGETS libhelloworld-static
  162. EXPORT libhelloworld
  163. DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_LIB}" )
  164. EndIf ( )
  165. # Shared
  166. If ( LIBHELLOWORLD_INSTALL_SHARED )
  167. Install ( TARGETS libhelloworld-shared
  168. EXPORT libhelloworld
  169. DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_LIB}" )
  170. EndIf ( )
  171. # Debug
  172. If ( HAS_STRIP_SYMBOLS AND NOT LIBHELLOWORLD_NO_STRIP )
  173. Strip_Symbols ( libhelloworld-shared LIBHELLOWORLD_DBG_FILE )
  174. If ( LIBHELLOWORLD_INSTALL_DEBUG )
  175. Install ( FILES "${LIBHELLOWORLD_DBG_FILE}"
  176. DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_LIB}" )
  177. EndIf ( )
  178. EndIf ( )
  179. # Package
  180. Include ( CMakePackageConfigHelpers )
  181. Write_Basic_Package_Version_File (
  182. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config-version.cmake"
  183. VERSION "${LIBHELLOWORLD_VERSION}"
  184. COMPATIBILITY AnyNewerVersion )
  185. Configure_File ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-config.cmake"
  186. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config.cmake"
  187. @ONLY )
  188. Set ( ConfigPackageLocation "${LIBHELLOWORLD_INSTALL_DIR_SHARE}/cmake" )
  189. Install ( EXPORT libhelloworld
  190. NAMESPACE libhelloworld::
  191. DESTINATION ${ConfigPackageLocation} )
  192. Install ( FILES
  193. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config.cmake"
  194. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config-version.cmake"
  195. DESTINATION
  196. ${ConfigPackageLocation}
  197. COMPONENT
  198. Devel )