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) 67endif() 68 69if (NOT BUILD_SHARED_LIBS) 70 target_compile_definitions(benchmark PUBLIC -DBENCHMARK_STATIC_DEFINE) 71endif() 72 73# Benchmark main library 74add_library(benchmark_main "benchmark_main.cc") 75add_library(benchmark::benchmark_main ALIAS benchmark_main) 76set_target_properties(benchmark_main PROPERTIES 77 OUTPUT_NAME "benchmark_main" 78 VERSION ${GENERIC_LIB_VERSION} 79 SOVERSION ${GENERIC_LIB_SOVERSION} 80 DEFINE_SYMBOL benchmark_EXPORTS 81) 82target_link_libraries(benchmark_main PUBLIC benchmark::benchmark) 83 84set(generated_dir "${PROJECT_BINARY_DIR}") 85 86set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") 87set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") 88set(pkg_config "${generated_dir}/${PROJECT_NAME}.pc") 89set(pkg_config_main "${generated_dir}/${PROJECT_NAME}_main.pc") 90set(targets_to_export benchmark benchmark_main) 91set(targets_export_name "${PROJECT_NAME}Targets") 92 93set(namespace "${PROJECT_NAME}::") 94 95include(CMakePackageConfigHelpers) 96 97configure_package_config_file ( 98 ${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in 99 ${project_config} 100 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME} 101 NO_SET_AND_CHECK_MACRO 102 NO_CHECK_REQUIRED_COMPONENTS_MACRO 103) 104write_basic_package_version_file( 105 "${version_config}" VERSION ${GENERIC_LIB_VERSION} COMPATIBILITY SameMajorVersion 106) 107 108configure_file("${PROJECT_SOURCE_DIR}/cmake/benchmark.pc.in" "${pkg_config}" @ONLY) 109configure_file("${PROJECT_SOURCE_DIR}/cmake/benchmark_main.pc.in" "${pkg_config_main}" @ONLY) 110 111export ( 112 TARGETS ${targets_to_export} 113 NAMESPACE "${namespace}" 114 FILE ${generated_dir}/${targets_export_name}.cmake 115) 116 117if (BENCHMARK_ENABLE_INSTALL) 118 # Install target (will install the library to specified CMAKE_INSTALL_PREFIX variable) 119 install( 120 TARGETS ${targets_to_export} 121 EXPORT ${targets_export_name} 122 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 123 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 124 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 125 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 126 127 install( 128 DIRECTORY "${PROJECT_SOURCE_DIR}/include/benchmark" 129 "${PROJECT_BINARY_DIR}/include/benchmark" 130 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 131 FILES_MATCHING PATTERN "*.*h") 132 133 install( 134 FILES "${project_config}" "${version_config}" 135 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") 136 137 install( 138 FILES "${pkg_config}" "${pkg_config_main}" 139 DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") 140 141 install( 142 EXPORT "${targets_export_name}" 143 NAMESPACE "${namespace}" 144 DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}") 145endif() 146 147if (BENCHMARK_ENABLE_DOXYGEN) 148 find_package(Doxygen REQUIRED) 149 set(DOXYGEN_QUIET YES) 150 set(DOXYGEN_RECURSIVE YES) 151 set(DOXYGEN_GENERATE_HTML YES) 152 set(DOXYGEN_GENERATE_MAN NO) 153 set(DOXYGEN_MARKDOWN_SUPPORT YES) 154 set(DOXYGEN_BUILTIN_STL_SUPPORT YES) 155 set(DOXYGEN_EXTRACT_PACKAGE YES) 156 set(DOXYGEN_EXTRACT_STATIC YES) 157 set(DOXYGEN_SHOW_INCLUDE_FILES YES) 158 set(DOXYGEN_BINARY_TOC YES) 159 set(DOXYGEN_TOC_EXPAND YES) 160 set(DOXYGEN_USE_MDFILE_AS_MAINPAGE "index.md") 161 doxygen_add_docs(benchmark_doxygen 162 docs 163 include 164 src 165 ALL 166 WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 167 COMMENT "Building documentation with Doxygen.") 168 if (BENCHMARK_ENABLE_INSTALL AND BENCHMARK_INSTALL_DOCS) 169 install( 170 DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html/" 171 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 172 endif() 173else() 174 if (BENCHMARK_ENABLE_INSTALL AND BENCHMARK_INSTALL_DOCS) 175 install( 176 DIRECTORY "${PROJECT_SOURCE_DIR}/docs/" 177 DESTINATION ${CMAKE_INSTALL_DOCDIR}) 178 endif() 179endif() 180