You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

178 lines
6.5 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/libinterface-options.cmake )
  18. Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libinterface-const.cmake )
  19. Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libinterface-var.cmake )
  20. Project ( ${LIBINTERFACE_PROJECT_NAME}
  21. DESCRIPTION "${LIBINTERFACE_PROJECT_DESCRIPTION}"
  22. VERSION "${LIBINTERFACE_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 ( libinterface REQUIRED ${LIBINTERFACE_FIND_PACKAGE_EXTRA_ARGS} )
  33. # Object Library ##################################################################################
  34. Set ( CMAKE_POSITION_INDEPENDENT_CODE ON )
  35. Set ( LIBINTERFACE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" )
  36. Set ( LIBINTERFACE_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" )
  37. File ( GLOB_RECURSE LIBINTERFACE_HEADER_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.h" )
  38. File ( GLOB_RECURSE LIBINTERFACE_INLINE_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.inl" )
  39. File ( GLOB_RECURSE LIBINTERFACE_TEST_HEADER_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.test.h" )
  40. File ( GLOB_RECURSE LIBINTERFACE_TEST_INLINE_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.test.inl" )
  41. File ( GLOB_RECURSE LIBINTERFACE_TEST_SOURCE_FILES "${LIBINTERFACE_SOURCE_DIR}/*.test.cpp" )
  42. ForEach ( TEST_FILE IN LISTS LIBINTERFACE_TEST_HEADER_FILES )
  43. List ( REMOVE_ITEM LIBINTERFACE_HEADER_FILES "${TEST_FILE}" )
  44. EndForEach ( )
  45. ForEach ( TEST_FILE IN LISTS LIBINTERFACE_TEST_INLINE_FILES )
  46. List ( REMOVE_ITEM LIBINTERFACE_INLINE_FILES "${TEST_FILE}" )
  47. EndForEach ( )
  48. Add_Library (
  49. libinterface
  50. INTERFACE )
  51. Target_Include_Directories (
  52. libinterface
  53. INTERFACE
  54. $<BUILD_INTERFACE:${LIBINTERFACE_INCLUDE_DIR}>
  55. $<INSTALL_INTERFACE:${LIBINTERFACE_INSTALL_DIR_INCLUDE}> )
  56. # Tests ###########################################################################################
  57. If ( GTest_FOUND )
  58. ForEach ( FILE IN LISTS LIBINTERFACE_TEST_SOURCE_FILES )
  59. # Add Test
  60. File ( RELATIVE_PATH RELFILE "${LIBINTERFACE_SOURCE_DIR}" "${FILE}" )
  61. Get_Filename_Component ( TEST_DIR "${RELFILE}" DIRECTORY )
  62. Get_Filename_Component ( TEST_NAME "${RELFILE}" NAME_WE )
  63. Set ( TEST_NAME "${TEST_DIR}/${TEST_NAME}" )
  64. String ( REPLACE ".test" "" TEST_NAME "${TEST_NAME}" )
  65. String ( REPLACE "\\" "-" TEST_NAME "${TEST_NAME}" )
  66. String ( REPLACE "/" "-" TEST_NAME "${TEST_NAME}" )
  67. String ( REPLACE "_" "-" TEST_NAME "${TEST_NAME}" )
  68. Set ( TEST_NAME "test-${TEST_NAME}" )
  69. Add_Executable ( ${TEST_NAME}
  70. EXCLUDE_FROM_ALL
  71. ${HELLOWORLD_TEST_HEADER_FILES}
  72. ${HELLOWORLD_TEST_INLINE_FILES}
  73. ${FILE} )
  74. Target_Link_Libraries ( ${TEST_NAME}
  75. PUBLIC
  76. libinterface
  77. GTest::Main )
  78. # Sanitizers
  79. If ( Sanitizers_FOUND )
  80. Add_Sanitizers ( ${TEST_NAME} )
  81. EndIf ( )
  82. # pedantic
  83. If ( HAS_PEDANTIC )
  84. Pedantic_Apply_Flags_Target ( ${TEST_NAME} ALL )
  85. EndIf ( )
  86. # test
  87. If ( HAS_CMAKE_TESTS )
  88. Add_CMake_Test ( NAME ${TEST_NAME} TARGET ${TEST_NAME} GROUP gedt )
  89. Else ( )
  90. Add_Test ( NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
  91. EndIf ( )
  92. EndForEach ( )
  93. EndIf ( )
  94. # Optimization ####################################################################################
  95. # sanitizers
  96. If ( Sanitizers_FOUND )
  97. Add_Sanitizers ( libinterface )
  98. EndIf ( )
  99. # pedantic
  100. If ( HAS_PEDANTIC )
  101. Pedantic_Apply_Flags_Target ( libinterface ALL VISIBILITY INTERFACE )
  102. EndIf ( )
  103. # cotire
  104. If ( HAS_COTIRE )
  105. Cotire ( libinterface )
  106. EndIf ( )
  107. # Install #########################################################################################
  108. # Header
  109. If ( LIBINTERFACE_INSTALL_HEADER )
  110. Install ( DIRECTORY "${LIBINTERFACE_INCLUDE_DIR}/libinterface"
  111. DESTINATION "${LIBINTERFACE_INSTALL_DIR_INCLUDE}"
  112. FILES_MATCHING
  113. PATTERN "*.h"
  114. PATTERN "*.inl"
  115. PATTERN "*.test.h" EXCLUDE
  116. PATTERN "*.test.inl" EXCLUDE )
  117. Install( TARGETS libinterface
  118. EXPORT libinterface
  119. DESTINATION "${LIBINTERFACE_INSTALL_DIR_INCLUDE}" )
  120. EndIf ( )
  121. # Package
  122. Include ( CMakePackageConfigHelpers )
  123. Write_Basic_Package_Version_File (
  124. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config-version.cmake"
  125. VERSION "${LIBINTERFACE_VERSION}"
  126. COMPATIBILITY AnyNewerVersion )
  127. Configure_File ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libinterface-config.cmake"
  128. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config.cmake"
  129. @ONLY )
  130. Set ( ConfigPackageLocation "${LIBINTERFACE_INSTALL_DIR_SHARE}/cmake" )
  131. Install ( EXPORT libinterface
  132. NAMESPACE libinterface::
  133. DESTINATION ${ConfigPackageLocation} )
  134. Install ( FILES
  135. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config.cmake"
  136. "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config-version.cmake"
  137. DESTINATION
  138. ${ConfigPackageLocation}
  139. COMPONENT
  140. Devel )