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.
 
 
 
 

177 lines
6.3 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 ( )
  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/helloworld-options.cmake )
  18. Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/helloworld-const.cmake )
  19. Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/helloworld-var.cmake )
  20. Project ( ${HELLOWORLD_PROJECT_NAME}
  21. DESCRIPTION "${HELLOWORLD_PROJECT_DESCRIPTION}"
  22. VERSION "${HELLOWORLD_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 ${HELLOWORLD_FIND_PACKAGE_EXTRA_ARGS} )
  33. # Object Library ##################################################################################
  34. Set ( HELLOWORLD_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" )
  35. Set ( HELLOWORLD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" )
  36. Set ( HELLOWORLD_MAIN_FILE "${HELLOWORLD_SOURCE_DIR}/main.cpp" )
  37. File ( GLOB_RECURSE HELLOWORLD_HEADER_FILES "${HELLOWORLD_INCLUDE_DIR}/*.h" )
  38. File ( GLOB_RECURSE HELLOWORLD_INLINE_FILES "${HELLOWORLD_INCLUDE_DIR}/*.inl" )
  39. File ( GLOB_RECURSE HELLOWORLD_SOURCE_FILES "${HELLOWORLD_SOURCE_DIR}/*.cpp" )
  40. File ( GLOB_RECURSE HELLOWORLD_TEST_HEADER_FILES "${HELLOWORLD_INCLUDE_DIR}/*.test.h" )
  41. File ( GLOB_RECURSE HELLOWORLD_TEST_INLINE_FILES "${HELLOWORLD_INCLUDE_DIR}/*.test.inl" )
  42. File ( GLOB_RECURSE HELLOWORLD_TEST_SOURCE_FILES "${HELLOWORLD_SOURCE_DIR}/*.test.cpp" )
  43. ForEach ( TEST_FILE IN LISTS HELLOWORLD_TEST_HEADER_FILES )
  44. List ( REMOVE_ITEM HELLOWORLD_HEADER_FILES "${TEST_FILE}" )
  45. EndForEach ( )
  46. ForEach ( TEST_FILE IN LISTS HELLOWORLD_TEST_INLINE_FILES )
  47. List ( REMOVE_ITEM HELLOWORLD_INLINE_FILES "${TEST_FILE}" )
  48. EndForEach ( )
  49. List ( REMOVE_ITEM HELLOWORLD_SOURCE_FILES "${HELLOWORLD_MAIN_FILE}" )
  50. ForEach ( TEST_FILE IN LISTS HELLOWORLD_TEST_SOURCE_FILES )
  51. List ( REMOVE_ITEM HELLOWORLD_SOURCE_FILES "${TEST_FILE}" )
  52. EndForEach ( )
  53. Add_Library (
  54. helloworld-objects
  55. OBJECT
  56. ${HELLOWORLD_HEADER_FILES}
  57. ${HELLOWORLD_INLINE_FILES}
  58. ${HELLOWORLD_SOURCE_FILES} )
  59. Target_Include_Directories (
  60. helloworld-objects
  61. PUBLIC
  62. $<BUILD_INTERFACE:${HELLOWORLD_INCLUDE_DIR}>
  63. $<INSTALL_INTERFACE:${HELLOWORLD_INSTALL_DIR_INCLUDE}> )
  64. Target_Link_Libraries (
  65. helloworld-objects
  66. PUBLIC
  67. libhelloworld::libhelloworld-shared )
  68. # Executable ######################################################################################
  69. Add_Executable ( helloworld "${HELLOWORLD_MAIN_FILE}" )
  70. Target_Link_Libraries (
  71. helloworld
  72. PUBLIC
  73. helloworld-objects )
  74. # Tests ###########################################################################################
  75. If ( GTest_FOUND )
  76. ForEach ( FILE IN LISTS HELLOWORLD_TEST_SOURCE_FILES )
  77. # Add Test
  78. File ( RELATIVE_PATH RELFILE "${HELLOWORLD_SOURCE_DIR}" "${FILE}" )
  79. Get_Filename_Component ( TEST_DIR "${RELFILE}" DIRECTORY )
  80. Get_Filename_Component ( TEST_NAME "${RELFILE}" NAME_WE )
  81. Set ( TEST_NAME "${TEST_DIR}/${TEST_NAME}" )
  82. String ( REPLACE ".test" "" TEST_NAME "${TEST_NAME}" )
  83. String ( REPLACE "\\" "-" TEST_NAME "${TEST_NAME}" )
  84. String ( REPLACE "/" "-" TEST_NAME "${TEST_NAME}" )
  85. String ( REPLACE "_" "-" TEST_NAME "${TEST_NAME}" )
  86. Set ( TEST_NAME "test-${TEST_NAME}" )
  87. Add_Executable ( ${TEST_NAME}
  88. EXCLUDE_FROM_ALL
  89. ${HELLOWORLD_TEST_HEADER_FILES}
  90. ${HELLOWORLD_TEST_INLINE_FILES}
  91. ${FILE} )
  92. Target_Link_Libraries ( ${TEST_NAME}
  93. PUBLIC
  94. helloworld-objects
  95. GTest::Main )
  96. # Sanitizers
  97. If ( Sanitizers_FOUND )
  98. Add_Sanitizers ( ${TEST_NAME} )
  99. EndIf ( )
  100. # pedantic
  101. If ( HAS_PEDANTIC )
  102. Pedantic_Apply_Flags_Target ( ${TEST_NAME} ALL )
  103. EndIf ( )
  104. # test
  105. If ( HAS_CMAKE_TESTS )
  106. Add_CMake_Test ( NAME ${TEST_NAME} TARGET ${TEST_NAME} GROUP gedt )
  107. Else ( )
  108. Add_Test ( NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} )
  109. EndIf ( )
  110. EndForEach ( )
  111. EndIf ( )
  112. # Optimization ####################################################################################
  113. # sanitizers
  114. If ( Sanitizers_FOUND )
  115. Add_Sanitizers ( helloworld-objects )
  116. Add_Sanitizers ( helloworld )
  117. EndIf ( )
  118. # pedantic
  119. If ( HAS_PEDANTIC )
  120. Pedantic_Apply_Flags_Target ( helloworld-objects ALL )
  121. Pedantic_Apply_Flags_Target ( helloworld ALL )
  122. EndIf ( )
  123. # cotire
  124. If ( HAS_COTIRE )
  125. Cotire ( helloworld-objects )
  126. Cotire ( helloworld )
  127. EndIf ( )
  128. # Install #########################################################################################
  129. # Executable
  130. Install ( TARGETS helloworld
  131. DESTINATION ${HELLOWORLD_INSTALL_DIR_BIN} )
  132. # Debug
  133. If ( HAS_STRIP_SYMBOLS AND NOT HELLOWORLD_NO_STRIP )
  134. Strip_Symbols ( helloworld HELLOWORLD_DBG_FILE )
  135. If ( HELLOWORLD_INSTALL_DEBUG )
  136. Install ( FILES ${HELLOWORLD_DBG_FILE}
  137. DESTINATION ${HELLOWORLD_INSTALL_DIR_LIB} )
  138. EndIf ( )
  139. EndIf ( )