# 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/libinterface-options.cmake ) Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libinterface-const.cmake ) Include ( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/libinterface-var.cmake ) Project ( ${LIBINTERFACE_PROJECT_NAME} DESCRIPTION "${LIBINTERFACE_PROJECT_DESCRIPTION}" VERSION "${LIBINTERFACE_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 ( libinterface REQUIRED ${LIBINTERFACE_FIND_PACKAGE_EXTRA_ARGS} ) # Object Library ################################################################################## Set ( CMAKE_POSITION_INDEPENDENT_CODE ON ) Set ( LIBINTERFACE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" ) Set ( LIBINTERFACE_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/src" ) File ( GLOB_RECURSE LIBINTERFACE_HEADER_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.h" ) File ( GLOB_RECURSE LIBINTERFACE_INLINE_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.inl" ) File ( GLOB_RECURSE LIBINTERFACE_TEST_HEADER_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.test.h" ) File ( GLOB_RECURSE LIBINTERFACE_TEST_INLINE_FILES "${LIBINTERFACE_INCLUDE_DIR}/*.test.inl" ) File ( GLOB_RECURSE LIBINTERFACE_TEST_SOURCE_FILES "${LIBINTERFACE_SOURCE_DIR}/*.test.cpp" ) ForEach ( TEST_FILE IN LISTS LIBINTERFACE_TEST_HEADER_FILES ) List ( REMOVE_ITEM LIBINTERFACE_HEADER_FILES "${TEST_FILE}" ) EndForEach ( ) ForEach ( TEST_FILE IN LISTS LIBINTERFACE_TEST_INLINE_FILES ) List ( REMOVE_ITEM LIBINTERFACE_INLINE_FILES "${TEST_FILE}" ) EndForEach ( ) Add_Library ( libinterface INTERFACE ) Target_Include_Directories ( libinterface INTERFACE $<BUILD_INTERFACE:${LIBINTERFACE_INCLUDE_DIR}> $<INSTALL_INTERFACE:${LIBINTERFACE_INSTALL_DIR_INCLUDE}> ) # Tests ########################################################################################### If ( GTest_FOUND ) ForEach ( FILE IN LISTS LIBINTERFACE_TEST_SOURCE_FILES ) # Add Test File ( RELATIVE_PATH RELFILE "${LIBINTERFACE_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 libinterface 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 ( libinterface ) EndIf ( ) # pedantic If ( HAS_PEDANTIC ) Pedantic_Apply_Flags_Target ( libinterface ALL VISIBILITY INTERFACE ) EndIf ( ) # cotire If ( HAS_COTIRE ) Cotire ( libinterface ) EndIf ( ) # Install ######################################################################################### # Header If ( LIBINTERFACE_INSTALL_HEADER ) Install ( DIRECTORY "${LIBINTERFACE_INCLUDE_DIR}/libinterface" DESTINATION "${LIBINTERFACE_INSTALL_DIR_INCLUDE}" FILES_MATCHING PATTERN "*.h" PATTERN "*.inl" PATTERN "*.test.h" EXCLUDE PATTERN "*.test.inl" EXCLUDE ) Install( TARGETS libinterface EXPORT libinterface DESTINATION "${LIBINTERFACE_INSTALL_DIR_INCLUDE}" ) EndIf ( ) # Package Include ( CMakePackageConfigHelpers ) Write_Basic_Package_Version_File ( "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config-version.cmake" VERSION "${LIBINTERFACE_VERSION}" COMPATIBILITY AnyNewerVersion ) Configure_File ( "${CMAKE_CURRENT_SOURCE_DIR}/cmake/libinterface-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config.cmake" @ONLY ) Set ( ConfigPackageLocation "${LIBINTERFACE_INSTALL_DIR_SHARE}/cmake" ) Install ( EXPORT libinterface NAMESPACE libinterface:: DESTINATION ${ConfigPackageLocation} ) Install ( FILES "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/cmake/libinterface-config-version.cmake" DESTINATION ${ConfigPackageLocation} COMPONENT Devel )