1#Allow the source files to find headers in src / 2include(GNUInstallDirs) 3include_directories(${PROJECT_SOURCE_DIR}/src) 4 5if (DEFINED BENCHMARK_CXX_LINKER_FLAGS) 6 list(APPEND CMAKE_SHARED_LINKER_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}) 7 list(APPEND CMAKE_MODULE_LINKER_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}) 8endif() 9 10file(GLOB 11 SOURCE_FILES 12 *.cc 13 ${PROJECT_SOURCE_DIR}/include/benchmark/*.h 14 ${CMAKE_CURRENT_SOURCE_DIR}/*.h) 15file(GLOB BENCHMARK_MAIN "benchmark_main.cc") 16foreach(item ${BENCHMARK_MAIN}) 17 list(REMOVE_ITEM SOURCE_FILES "${item}") 18endforeach() 19 20add_library(benchmark ${SOURCE_FILES}) 21add_library(benchmark::benchmark ALIAS benchmark) 22set_target_properties(benchmark PROPERTIES 23 OUTPUT_NAME "benchmark" 24 VERSION ${GENERIC_LIB_VERSION} 25 SOVERSION ${GENERIC_LIB_SOVERSION} 26) 27target_include_directories(benchmark PUBLIC 28 $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> 29) 30 31set_property( 32 SOURCE benchmark.cc 33 APPEND 34 PROPERTY COMPILE_DEFINITIONS 35 BENCHMARK_VERSION="${VERSION}" 36) 37 38# libpfm, if available 39if (PFM_FOUND) 40 target_link_libraries(benchmark PRIVATE PFM::libpfm) 41 target_compile_definitions(benchmark PRIVATE -DHAVE_LIBPFM) 42endif() 43 44# pthread affinity, if available 45if(HAVE_PTHREAD_AFFINITY) 46 target_compile_definitions(benchmark PRIVATE -DBENCHMARK_HAS_PTHREAD_AFFINITY) 47endif() 48 49# Link threads. 50target_link_libraries(benchmark PRIVATE Threads::Threads) 51 52target_link_libraries(benchmark PRIVATE ${BENCHMARK_CXX_LIBRARIES}) 53 54if(HAVE_LIB_RT) 55 target_link_libraries(benchmark PRIVATE rt) 56endif(HAVE_LIB_RT) 57 58 59# We need extra libraries on Windows 60if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") 61 target_link_libraries(benchmark PRIVATE shlwapi) 62endif() 63 64# We need extra libraries on Solaris 65if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") 66 target_link_libraries(benchmark PRIVATE kstat) 67 set(BENCHMARK_PRIVATE_LINK_LIBRARIES -lkstat) 68endif() 69 70if (NOT BUILD_SHARED_LIBS) 71 target_compile_definitions(benchmark PUBLIC -DBENCHMARK_STATIC_DEFINE) 72endif() 73 74# Benchmark main library 75add_library(benchmark_main "benchmark_main.cc") 76add_library(benchmark::benchmark_main ALIAS benchmark_main) 77set_target_properties(benchmark_main PROPERTIES 78 OUTPUT_NAME "benchmark_main" 79 VERSION ${GENERIC_LIB_VERSION} 80 SOVERSION ${GENERIC_LIB_SOVERSION} 81 DEFINE_SYMBOL benchmark_EXPORTS 82) 83target_link_libraries(benchmark_main PUBLIC benchmark::benchmark) 84 85set(generated_dir "${PROJECT_BINARY_DIR}") 86 87set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") 88set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") 89set(pkg_config "${generated_dir}/${PROJECT_NAME}.pc") 90set(pkg_config_main "${generated_dir}/${PROJECT_NAME}_main.pc") 91set(targets_to_export benchmark benchmark_main) 92set(targets_export_name "${PROJECT_NAME}Targets") 93 94set(namespace "${PROJECT_NAME}::") 95 96include(CMakePackageConfigHelpers) 97 98configure_package_config_file ( 99 ${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in 100 ${project_config} 101 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} 102 NO_SET_AND_CHECK_MACRO 103 NO_CHECK_REQUIRED_COMPONENTS_MACRO 104) 105write_basic_package_version_file( 106 "${version_config}" VERSION ${GENERIC_LIB_VERSION} COMPATIBILITY SameMajorVersion 107) 108 109configure_file("${PROJECT_SOURCE_DIR}/cmake/benchmark.pc.in" "${pkg_config}" @ONLY) 110configure_file("${PROJECT_SOURCE_DIR}/cmake/benchmark_main.pc.in" "${pkg_config_main}" @ONLY) 111 112export ( 113 TARGETS ${targets_to_export} 114 NAMESPACE "${namespace}" 115 FILE ${generated_dir}/${targets_export_name}.cmake 116) 117 118if (BENCHMARK_ENABLE_INSTALL) 119 # Install target (will install the library to specified CMAKE_INSTALL_PREFIX variable) 120 install( 121 TARGETS ${targets_to_export} 122 EXPORT ${targets_export_name} 123 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 124 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 125 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 126 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 127 128 install( 129 DIRECTORY "${PROJECT_SOURCE_DIR}/include/benchmark" 130 "${PROJECT_BINARY_DIR}/include/benchmark" 131 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 132 FILES_MATCHING PATTERN "*.*h") 133 134 install( 135 FILES "${project_config}" "${version_config}" 136 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") 137 138 install( 139 FILES "${pkg_config}" "${pkg_config_main}" 140 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 141 142 install( 143 EXPORT "${targets_export_name}" 144 NAMESPACE "${namespace}" 145 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") 146endif() 147 148if (BENCHMARK_ENABLE_DOXYGEN) 149 find_package(Doxygen REQUIRED) 150 set(DOXYGEN_QUIET YES) 151 set(DOXYGEN_RECURSIVE YES) 152 set(DOXYGEN_GENERATE_HTML YES) 153 set(DOXYGEN_GENERATE_MAN NO) 154 set(DOXYGEN_MARKDOWN_SUPPORT YES) 155 set(DOXYGEN_BUILTIN_STL_SUPPORT YES) 156 set(DOXYGEN_EXTRACT_PACKAGE YES) 157 set(DOXYGEN_EXTRACT_STATIC YES) 158 set(DOXYGEN_SHOW_INCLUDE_FILES YES) 159 set(DOXYGEN_BINARY_TOC YES) 160 set(DOXYGEN_TOC_EXPAND YES) 161 set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "index.md") 162 doxygen_add_docs(benchmark_doxygen 163 docs 164 include 165 src 166 ALL 167 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 168 COMMENT "Building documentation with Doxygen.") 169 if (BENCHMARK_ENABLE_INSTALL AND BENCHMARK_INSTALL_DOCS) 170 install( 171 DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html/" 172 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 173 endif() 174else() 175 if (BENCHMARK_ENABLE_INSTALL AND BENCHMARK_INSTALL_DOCS) 176 install( 177 DIRECTORY "${PROJECT_SOURCE_DIR}/docs/" 178 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 179 endif() 180endif() 181