make_target.cmake 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. ########################################################################################
  2. # This is an included file
  3. #
  4. # This builds targets, either an executble or a library. This behaves similar to how
  5. # Rust creates modles.
  6. #
  7. # If src/lib.cpp exists, then all src files will be compiled into a library.
  8. #
  9. #
  10. # If src/main.cpp exists. Then all src files will be compiled into a binary.
  11. #
  12. #
  13. # If include/ exists and src/ does not exist, then it will be compiled into a header-only
  14. # library
  15. ########################################################################################
  16. get_filename_component(library_MODULE ${CMAKE_CURRENT_SOURCE_DIR} NAME)
  17. string(REPLACE " " "_" library_MODULE ${library_MODULE})
  18. include(GNUInstallDirs)
  19. if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" AND NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src)
  20. # Header only library
  21. add_library( ${library_MODULE} INTERFACE )
  22. add_library( ${PROJECT_NAME}::${library_MODULE} ALIAS ${library_MODULE} )
  23. target_include_directories( ${library_MODULE}
  24. INTERFACE
  25. "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>")
  26. else()
  27. file(GLOB_RECURSE srcFiles ${CMAKE_CURRENT_SOURCE_DIR}/src/* )
  28. if( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/lib.cpp)
  29. # Library
  30. list(APPEND ${PROJECT_NAME}_ALL_LIBS ${subdir})
  31. add_library( ${library_MODULE} ${srcFiles} )
  32. add_library( ${PROJECT_NAME}::${library_MODULE} ALIAS ${library_MODULE} )
  33. target_link_libraries(${library_MODULE} PUBLIC ${REQUIRED_PUBLIC_LIBS} )
  34. target_link_libraries(${library_MODULE} PRIVATE ${REQUIRED_PRIVATE_LIBS} )
  35. if( ${PROJECT_NAME}_PACKAGE_INCLUDE_LIBS )
  36. install(
  37. TARGETS
  38. ${library_MODULE}
  39. LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  40. ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  41. RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
  42. INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  43. )
  44. endif()
  45. elseif( EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
  46. # executable
  47. add_executable( ${library_MODULE} ${srcFiles} )
  48. target_compile_definitions(${library_MODULE} PRIVATE ${PRIVATE_DEFINITIONS})
  49. target_compile_definitions(${library_MODULE} PUBLIC ${PUBLIC_DEFINITIONS})
  50. if( ${PROJECT_NAME}_PACKAGE_INCLUDE_BINS )
  51. install(
  52. TARGETS
  53. ${library_MODULE}
  54. LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  55. ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
  56. RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}"
  57. INCLUDES DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
  58. )
  59. endif()
  60. endif()
  61. if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include")
  62. target_include_directories( ${library_MODULE}
  63. PUBLIC
  64. "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>")
  65. endif()
  66. if( ${PROJECT_NAME}_ENABLE_COVERAGE )
  67. target_link_libraries( ${library_MODULE} PRIVATE ${PROJECT_NAME}::coverage )
  68. endif()
  69. if( ${PROJECT_NAME}_ENABLE_WARNINGS )
  70. target_link_libraries( ${library_MODULE} PRIVATE ${PROJECT_NAME}::warnings )
  71. endif()
  72. endif()
  73. if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include" AND ${PROJECT_NAME}_PACKAGE_INCLUDE_HEADERS )
  74. install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include
  75. DESTINATION ${CMAKE_INSTALL_PREFIX}
  76. FILES_MATCHING PATTERN "*"
  77. )
  78. endif()
  79. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test/CMakeLists.txt" AND IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/test")
  80. set(unitTestsList "")
  81. enable_testing()
  82. if(${PROJECT_NAME}_BUILD_UNIT_TESTS)
  83. add_subdirectory(test)
  84. endif()
  85. endif()
  86. message("*****************************************************")
  87. message("LIBRARIES:")
  88. message("*****************************************************")
  89. message(" ${library_MODULE} ")
  90. message(" PUBLIC_LINKED_TARGETS ")
  91. foreach(item IN LISTS REQUIRED_PUBLIC_LIBS)
  92. message(" ${item}")
  93. endforeach()
  94. message(" PRIVATE_LINKED_TARGETS ")
  95. foreach(item IN LISTS REQUIRED_PRIVATE_LIBS)
  96. message(" ${item}")
  97. endforeach()
  98. message(" Unit Tests ")
  99. foreach(item IN LISTS unitTestsList)
  100. message(" ${item}")
  101. endforeach()
  102. message("*****************************************************")