Search code examples
cmakegoogle-benchmark

GBenchmark and CMake


From relevant search on the web, I got an impression that google-benchmark is not easily incorporated into a CMake-project. One way I could do that is adding as external project, replicating verbatim the corresponding text for GTest in google-test's readme:

# adding google-benchmark as external git project
#=======================================================
configure_file(extern/googlebenchmark/CMakeLists.txt.in googlebenchmark-download/CMakeLists.txt)
execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" .
        RESULT_VARIABLE result
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-download)
if(result)
    message(FATAL_ERROR "CMake step for googlebenchmark failed: ${result}")
endif()
execute_process(COMMAND ${CMAKE_COMMAND} --build .
        RESULT_VARIABLE result
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-download )
if(result)
    message(FATAL_ERROR "Build step for googlebenchmark failed: ${result}")
endif()

# Prevent overriding the parent project's compiler/linker
# settings on Windows
set(gbenchmark_force_shared_crt ON CACHE BOOL "" FORCE)

add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-src
        ${CMAKE_CURRENT_BINARY_DIR}/googlebenchmark-build
        EXCLUDE_FROM_ALL)

if (CMAKE_VERSION VERSION_LESS 2.8.11)
    include_directories("${gbenchmark_SOURCE_DIR}/include")
endif()

and having CMakeLists.txt.in with the contents as in How to build and link google benchmark using cmake in windows

This however has a huge downside: every time we change something in the CMakeLists.txt -- the topmost one -- that hosts all this, it starts building google-benchmark from scratch, and running all the "tests", whatever they are. Thus compilation times become longer.

Without a root access to a Linux server, is there any more-less portable way of having the benchmark code installed in one's home directory, while being able to link towards it in a CMake-project?

EDIT: I must say I've been able to git clone the benchmark code and successfully built it in my home directory.

EDIT: Answering my own question. I am not sure if this warrants a close, and leave it to the patrons to decide, but I've solved the problem as follows. In the CMakeLists.txt one can have the following contents:

cmake_minimum_required(VERSION 3.15)

set(CMAKE_CXX_STANDARD 17)

add_executable(sample_bench sample_bench.cpp)
target_link_libraries(sample_bench PUBLIC benchmark benchmark_main pthread)
target_link_directories(sample_bench PUBLIC ~/local/benchmark/build/src)
target_include_directories(sample_bench PUBLIC
        ~/local/benchmark/include)

The key here is target_link_directories, which is specified with -L in the example in https://github.com/google/benchmark


Solution

  • Answering my own question. I've solved the problem as follows. In the CMakeLists.txt one can have the following contents:

    cmake_minimum_required(VERSION 3.15)
    
    set(CMAKE_CXX_STANDARD 17)
    
    add_executable(sample_bench sample_bench.cpp)
    target_link_libraries(sample_bench PUBLIC benchmark benchmark_main pthread)
    target_link_directories(sample_bench PUBLIC ~/local/benchmark/build/src)
    target_include_directories(sample_bench PUBLIC
            ~/local/benchmark/include)
    

    The key here is target_link_directories, which is specified with -L in the example in https://github.com/google/benchmark This is enough to run the sample benchmark, at least -- haven't tried others. That is, once you have built benchmark somewhere -- even in your home directory, as in the example -- you can point CMake to the designated locations, in order for your code to compile.