# Initialize CMake ################################################################################ CMake_Minimum_Required ( VERSION 3.12.0 FATAL_ERROR ) # CMAKE_BUILD_TYPE If ( NOT CMAKE_BUILD_TYPE ) Set ( CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build!" FORCE ) EndIf ( NOT CMAKE_BUILD_TYPE ) Set_Property ( CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo MinSizeRel ) # CMAKE_MODULE_PATH If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/" ) EndIf ( ) If ( EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/cmake" ) Set ( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/cmake" ) EndIf ( ) # Project ######################################################################################### Include ( GNUInstallDirs ) Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-options.cmake ) Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-const.cmake ) Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-var.cmake ) Project ( ${LIBHELLOWORLD_PROJECT_NAME} DESCRIPTION "${LIBHELLOWORLD_PROJECT_DESCRIPTION}" VERSION "${LIBHELLOWORLD_VERSION}" ) Include ( CTest ) # Initialize ###################################################################################### Include ( cotire OPTIONAL RESULT_VARIABLE HAS_COTIRE ) Include ( pedantic OPTIONAL RESULT_VARIABLE HAS_PEDANTIC ) Include ( cmake_tests OPTIONAL RESULT_VARIABLE HAS_CMAKE_TESTS ) Include ( strip_symbols OPTIONAL RESULT_VARIABLE HAS_STRIP_SYMBOLS ) Find_Package ( GTest QUIET ) Find_Package ( Sanitizers QUIET ) Message ( FATAL_ERROR "Please configure the dependencies of this project!" ) # Find_Package ( libhelloworld REQUIRED ${LIBHELLOWORLD_FIND_PACKAGE_EXTRA_ARGS} ) # Object Library ################################################################################## Set ( CMAKE_POSITION_INDEPENDENT_CODE ON ) Set ( LIBHELLOWORLD_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" ) Set ( LIBHELLOWORLD_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" ) File ( GLOB_RECURSE LIBHELLOWORLD_HEADER_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.h" ) File ( GLOB_RECURSE LIBHELLOWORLD_INLINE_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.inl" ) File ( GLOB_RECURSE LIBHELLOWORLD_SOURCE_FILES "${LIBHELLOWORLD_SOURCE_DIR}/*.cpp" ) File ( GLOB_RECURSE LIBHELLOWORLD_TEST_HEADER_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.test.h" ) File ( GLOB_RECURSE LIBHELLOWORLD_TEST_INLINE_FILES "${LIBHELLOWORLD_INCLUDE_DIR}/*.test.inl" ) File ( GLOB_RECURSE LIBHELLOWORLD_TEST_SOURCE_FILES "${LIBHELLOWORLD_SOURCE_DIR}/*.test.cpp" ) ForEach ( TEST_FILE IN LISTS LIBHELLOWORLD_TEST_HEADER_FILES ) List ( REMOVE_ITEM LIBHELLOWORLD_HEADER_FILES "${TEST_FILE}" ) EndForEach ( ) ForEach ( TEST_FILE IN LISTS LIBHELLOWORLD_TEST_INLINE_FILES ) List ( REMOVE_ITEM LIBHELLOWORLD_INLINE_FILES "${TEST_FILE}" ) EndForEach ( ) ForEach ( TEST_FILE IN LISTS LIBHELLOWORLD_TEST_SOURCE_FILES ) List ( REMOVE_ITEM LIBHELLOWORLD_SOURCE_FILES "${TEST_FILE}" ) EndForEach ( ) Add_Library ( libhelloworld-objects OBJECT ${LIBHELLOWORLD_HEADER_FILES} ${LIBHELLOWORLD_INLINE_FILES} ${LIBHELLOWORLD_SOURCE_FILES} ) Target_Include_Directories ( libhelloworld-objects PUBLIC $ $ ) # Static Library ################################################################################## Add_Library ( libhelloworld-static STATIC $ ) Set_Target_Properties ( libhelloworld-static PROPERTIES VERSION "${LIBHELLOWORLD_VERSION}-${LIBHELLOWORLD_VERSION_HASH_SHORT}" OUTPUT_NAME "${LIBHELLOWORLD_OUTPUTNAME}" ) Target_Include_Directories ( libhelloworld-static PUBLIC $ $ ) # Shared Library ################################################################################## Add_Library ( libhelloworld-shared SHARED $ ) Set_Target_Properties ( libhelloworld-shared PROPERTIES VERSION "${LIBHELLOWORLD_VERSION}-${LIBHELLOWORLD_VERSION_HASH_SHORT}" OUTPUT_NAME "${LIBHELLOWORLD_OUTPUTNAME}" ) Target_Include_Directories ( libhelloworld-shared PUBLIC $ $ ) # Tests ########################################################################################### If ( GTest_FOUND ) ForEach ( FILE IN LISTS LIBHELLOWORLD_TEST_SOURCE_FILES ) # Add Test File ( RELATIVE_PATH RELFILE "${LIBHELLOWORLD_SOURCE_DIR}" "${FILE}" ) Get_Filename_Component ( TEST_DIR "${RELFILE}" DIRECTORY ) Get_Filename_Component ( TEST_NAME "${RELFILE}" NAME_WE ) Set ( TEST_NAME "${TEST_DIR}/${TEST_NAME}" ) String ( REPLACE ".test" "" TEST_NAME "${TEST_NAME}" ) String ( REPLACE "\\" "-" TEST_NAME "${TEST_NAME}" ) String ( REPLACE "/" "-" TEST_NAME "${TEST_NAME}" ) String ( REPLACE "_" "-" TEST_NAME "${TEST_NAME}" ) Set ( TEST_NAME "test-${TEST_NAME}" ) Add_Executable ( ${TEST_NAME} EXCLUDE_FROM_ALL ${HELLOWORLD_TEST_HEADER_FILES} ${HELLOWORLD_TEST_INLINE_FILES} ${FILE} ) Target_Link_Libraries ( ${TEST_NAME} PUBLIC libhelloworld-objects GTest::Main ) # Sanitizers If ( Sanitizers_FOUND ) Add_Sanitizers ( ${TEST_NAME} ) EndIf ( ) # pedantic If ( HAS_PEDANTIC ) Pedantic_Apply_Flags_Target ( ${TEST_NAME} ALL ) EndIf ( ) # test If ( HAS_CMAKE_TESTS ) Add_CMake_Test ( NAME ${TEST_NAME} TARGET ${TEST_NAME} GROUP gedt ) Else ( ) Add_Test ( NAME ${TEST_NAME} COMMAND ${TEST_NAME} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) EndIf ( ) EndForEach ( ) EndIf ( ) # Optimization #################################################################################### # sanitizers If ( Sanitizers_FOUND ) Add_Sanitizers ( libhelloworld-objects ) EndIf ( ) # pedantic If ( HAS_PEDANTIC ) Pedantic_Apply_Flags_Target ( libhelloworld-objects ALL ) Pedantic_Apply_Flags_Target ( libhelloworld-static ALL ) Pedantic_Apply_Flags_Target ( libhelloworld-shared ALL ) EndIf ( ) # cotire If ( HAS_COTIRE ) Cotire ( libhelloworld-objects ) Cotire ( libhelloworld-static ) Cotire ( libhelloworld-shared ) EndIf ( ) # Install ######################################################################################### # Header If ( LIBHELLOWORLD_INSTALL_HEADER ) Install ( DIRECTORY "${LIBHELLOWORLD_INCLUDE_DIR}/libhelloworld" DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_INCLUDE}" FILES_MATCHING PATTERN "*.h" PATTERN "*.inl" PATTERN "*.test.h" EXCLUDE PATTERN "*.test.inl" EXCLUDE ) EndIf ( ) # Static If ( LIBHELLOWORLD_INSTALL_STATIC ) Install ( TARGETS libhelloworld-static EXPORT libhelloworld DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_LIB}" ) EndIf ( ) # Shared If ( LIBHELLOWORLD_INSTALL_SHARED ) Install ( TARGETS libhelloworld-shared EXPORT libhelloworld DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_LIB}" ) EndIf ( ) # Debug If ( HAS_STRIP_SYMBOLS AND NOT LIBHELLOWORLD_NO_STRIP ) Strip_Symbols ( libhelloworld-shared LIBHELLOWORLD_DBG_FILE ) If ( LIBHELLOWORLD_INSTALL_DEBUG ) Install ( FILES "${LIBHELLOWORLD_DBG_FILE}" DESTINATION "${LIBHELLOWORLD_INSTALL_DIR_LIB}" ) EndIf ( ) EndIf ( ) # Package Include ( CMakePackageConfigHelpers ) Write_Basic_Package_Version_File ( "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config-version.cmake" VERSION "${LIBHELLOWORLD_VERSION}" COMPATIBILITY AnyNewerVersion ) Configure_File ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libhelloworld-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config.cmake" @ONLY ) Set ( ConfigPackageLocation "${LIBHELLOWORLD_INSTALL_DIR_SHARE}/cmake" ) Install ( EXPORT libhelloworld NAMESPACE libhelloworld:: DESTINATION ${ConfigPackageLocation} ) Install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmake/libhelloworld-config-version.cmake" DESTINATION ${ConfigPackageLocation} COMPONENT Devel )