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 31# libpfm, if available 32if (PFM_FOUND) 33 target_link_libraries(benchmark PRIVATE PFM::libpfm) 34 target_compile_definitions(benchmark PRIVATE -DHAVE_LIBPFM) 35endif() 36 37# pthread affinity, if available 38if(HAVE_PTHREAD_AFFINITY) 39 target_compile_definitions(benchmark PRIVATE -DBENCHMARK_HAS_PTHREAD_AFFINITY) 40endif() 41 42# Link threads. 43target_link_libraries(benchmark PRIVATE Threads::Threads) 44 45target_link_libraries(benchmark PRIVATE ${BENCHMARK_CXX_LIBRARIES}) 46 47if(HAVE_LIB_RT) 48 target_link_libraries(benchmark PRIVATE rt) 49endif(HAVE_LIB_RT) 50 51 52# We need extra libraries on Windows 53if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") 54 target_link_libraries(benchmark PRIVATE shlwapi) 55endif() 56 57# We need extra libraries on Solaris 58if(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") 59 target_link_libraries(benchmark PRIVATE kstat) 60endif() 61 62if (NOT BUILD_SHARED_LIBS) 63 target_compile_definitions(benchmark PUBLIC -DBENCHMARK_STATIC_DEFINE) 64endif() 65 66# Benchmark main library 67add_library(benchmark_main "benchmark_main.cc") 68add_library(benchmark::benchmark_main ALIAS benchmark_main) 69set_target_properties(benchmark_main PROPERTIES 70 OUTPUT_NAME "benchmark_main" 71 VERSION ${GENERIC_LIB_VERSION} 72 SOVERSION ${GENERIC_LIB_SOVERSION} 73 DEFINE_SYMBOL benchmark_EXPORTS 74) 75target_link_libraries(benchmark_main PUBLIC benchmark::benchmark) 76 77set(generated_dir "${PROJECT_BINARY_DIR}") 78 79set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") 80set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") 81set(pkg_config "${generated_dir}/${PROJECT_NAME}.pc") 82set(targets_to_export benchmark benchmark_main) 83set(targets_export_name "${PROJECT_NAME}Targets") 84 85set(namespace "${PROJECT_NAME}::") 86 87include(CMakePackageConfigHelpers) 88 89configure_package_config_file ( 90 ${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in 91 ${project_config} 92 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} 93 NO_SET_AND_CHECK_MACRO 94 NO_CHECK_REQUIRED_COMPONENTS_MACRO 95) 96write_basic_package_version_file( 97 "${version_config}" VERSION ${GENERIC_LIB_VERSION} COMPATIBILITY SameMajorVersion 98) 99 100configure_file("${PROJECT_SOURCE_DIR}/cmake/benchmark.pc.in" "${pkg_config}" @ONLY) 101 102export ( 103 TARGETS ${targets_to_export} 104 NAMESPACE "${namespace}" 105 FILE ${generated_dir}/${targets_export_name}.cmake 106) 107 108if (BENCHMARK_ENABLE_INSTALL) 109 # Install target (will install the library to specified CMAKE_INSTALL_PREFIX variable) 110 install( 111 TARGETS ${targets_to_export} 112 EXPORT ${targets_export_name} 113 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 114 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 115 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 116 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 117 118 install( 119 DIRECTORY "${PROJECT_SOURCE_DIR}/include/benchmark" 120 "${PROJECT_BINARY_DIR}/include/benchmark" 121 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 122 FILES_MATCHING PATTERN "*.*h") 123 124 install( 125 FILES "${project_config}" "${version_config}" 126 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") 127 128 install( 129 FILES "${pkg_config}" 130 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 131 132 install( 133 EXPORT "${targets_export_name}" 134 NAMESPACE "${namespace}" 135 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") 136endif() 137 138if (BENCHMARK_ENABLE_DOXYGEN) 139 find_package(Doxygen REQUIRED) 140 set(DOXYGEN_QUIET YES) 141 set(DOXYGEN_RECURSIVE YES) 142 set(DOXYGEN_GENERATE_HTML YES) 143 set(DOXYGEN_GENERATE_MAN NO) 144 set(DOXYGEN_MARKDOWN_SUPPORT YES) 145 set(DOXYGEN_BUILTIN_STL_SUPPORT YES) 146 set(DOXYGEN_EXTRACT_PACKAGE YES) 147 set(DOXYGEN_EXTRACT_STATIC YES) 148 set(DOXYGEN_SHOW_INCLUDE_FILES YES) 149 set(DOXYGEN_BINARY_TOC YES) 150 set(DOXYGEN_TOC_EXPAND YES) 151 set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "index.md") 152 doxygen_add_docs(benchmark_doxygen 153 docs 154 include 155 src 156 ALL 157 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 158 COMMENT "Building documentation with Doxygen.") 159 if (BENCHMARK_ENABLE_INSTALL AND BENCHMARK_INSTALL_DOCS) 160 install( 161 DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html/" 162 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 163 endif() 164else() 165 if (BENCHMARK_ENABLE_INSTALL AND BENCHMARK_INSTALL_DOCS) 166 install( 167 DIRECTORY "${PROJECT_SOURCE_DIR}/docs/" 168 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 169 endif() 170endif() 171