diff --git a/CMakeLists.txt b/CMakeLists.txt index 99426fa..6becf1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,29 +1,64 @@ +#[===================================================================[ + parallel-hashmap library by Gregory Popovitch + + CMake projects that wish to use this library may do + something like : + + include(FetchContent) + FetchContent_Declare( + parallel-hashmap + GIT_REPOSITORY https://github.com/greg7mdp/parallel-hashmap.git + GIT_TAG v1.3.7 # adjust tag/branch/commit as needed + ) + FetchContent_MakeAvailable(parallel-hashmap) + + ... + target_link_libraries (my_target PRIVATE parallel-hashmap) + +#]===================================================================] + cmake_minimum_required(VERSION 3.8) list (APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") include(DetectVersion) -cmake_policy(SET CMP0048 NEW) ## set VERSION as documented by the project() command. -cmake_policy(SET CMP0076 NEW) ## accept new policy -set(CMAKE_CXX_STANDARD 11) ## compile with C++11 support -set(CMAKE_CXX_STANDARD_REQUIRED ON) +cmake_policy(SET CMP0048 NEW) ## set VERSION as documented by the project() command. +cmake_policy(SET CMP0076 NEW) ## accept new policy + +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 11) ## compile with C++11 support +endif() + +if(NOT CMAKE_CXX_STANDARD_REQUIRED) + set(CMAKE_CXX_STANDARD_REQUIRED ON) +endif() + +if(NOT DEFINED PHMAP_MASTER_PROJECT) + set(PHMAP_MASTER_PROJECT OFF) + if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) + set(PHMAP_MASTER_PROJECT ON) + endif() +endif() project(phmap VERSION ${DETECTED_PHMAP_VERSION} LANGUAGES CXX) +## ----------------------------- options ----------------------------- +option(PHMAP_INSTALL "Enable installation" ${PHMAP_MASTER_PROJECT}) + + set(PHMAP_DIR parallel_hashmap) set(PHMAP_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap.h ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap_base.h ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap_bits.h + ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap_config.h + ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap_dump.h + ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap_fwd_decl.h ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap_utils.h - ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/phmap_config.h) + ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/meminfo.h + ${CMAKE_CURRENT_SOURCE_DIR}/${PHMAP_DIR}/btree.h) -set(CMAKE_SUPPRESS_REGENERATION true) ## suppress ZERO_CHECK project - -include(GNUInstallDirs) -include(CMakePackageConfigHelpers) include(helpers) -include_directories("${CMAKE_CURRENT_SOURCE_DIR}") add_library(${PROJECT_NAME} INTERFACE) @@ -34,19 +69,24 @@ target_include_directories( $ $) -install( - DIRECTORY ${PROJECT_SOURCE_DIR}/${PHMAP_DIR}/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHMAP_DIR}) - -install(TARGETS ${PROJECT_NAME} - EXPORT ${PROJECT_NAME}-targets) - -export(EXPORT ${PROJECT_NAME}-targets - FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake") +if(PHMAP_INSTALL) + include(GNUInstallDirs) + include(CMakePackageConfigHelpers) + + install( + DIRECTORY ${PROJECT_SOURCE_DIR}/${PHMAP_DIR}/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PHMAP_DIR}) + + install(TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}-targets) + + export(EXPORT ${PROJECT_NAME}-targets + FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake") +endif() ## ------------------------- building tests and examples ------------- -option(PHMAP_BUILD_TESTS "Whether or not to build the tests" ON) -option(PHMAP_BUILD_EXAMPLES "Whether or not to build the examples" ON) +option(PHMAP_BUILD_TESTS "Whether or not to build the tests" ${PHMAP_MASTER_PROJECT}) +option(PHMAP_BUILD_EXAMPLES "Whether or not to build the examples" ${PHMAP_MASTER_PROJECT}) if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") @@ -54,72 +94,75 @@ endif() if (PHMAP_BUILD_TESTS) - include(cmake/DownloadGTest.cmake) - include_directories(${PROJECT_SOURCE_DIR}) - - check_target(gtest) - check_target(gtest_main) - check_target(gmock) + if (NOT PHMAP_GTEST_LIBS) + include(cmake/DownloadGTest.cmake) + include_directories(${PROJECT_SOURCE_DIR}) + + check_target(gtest) + check_target(gtest_main) + check_target(gmock) + set(PHMAP_GTEST_LIBS gmock_main) + endif() enable_testing() ## ---------------- regular hash maps ---------------------------- phmap_cc_test(NAME compressed_tuple SRCS "tests/compressed_tuple_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME container_memory SRCS "tests/container_memory_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME hash_policy_testing SRCS "tests/hash_policy_testing_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME node_hash_policy SRCS "tests/node_hash_policy_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME raw_hash_set SRCS "tests/raw_hash_set_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME raw_hash_set_allocator SRCS "tests/raw_hash_set_allocator_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) ## ---------------- regular hash maps ---------------------------- phmap_cc_test(NAME flat_hash_set SRCS "tests/flat_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_SET_CXX17" DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME flat_hash_map SRCS "tests/flat_hash_map_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME node_hash_map SRCS "tests/node_hash_map_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME node_hash_set SRCS "tests/node_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_SET_CXX17" DEPS ${PHMAP_GTEST_LIBS}) ## --------------- parallel hash maps ----------------------------------------------- phmap_cc_test(NAME parallel_flat_hash_map SRCS "tests/parallel_flat_hash_map_test.cc" - COPTS "-DUNORDERED_MAP_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_MAP_CXX17" DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME parallel_flat_hash_set SRCS "tests/parallel_flat_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_SET_CXX17" DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME parallel_node_hash_map SRCS "tests/parallel_node_hash_map_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME parallel_node_hash_set SRCS "tests/parallel_node_hash_set_test.cc" - COPTS "-DUNORDERED_SET_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_SET_CXX17" DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME parallel_flat_hash_map_mutex SRCS "tests/parallel_flat_hash_map_mutex_test.cc" - COPTS "-DUNORDERED_MAP_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_MAP_CXX17" DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME dump_load SRCS "tests/dump_load_test.cc" - COPTS "-DUNORDERED_MAP_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_MAP_CXX17" DEPS ${PHMAP_GTEST_LIBS}) phmap_cc_test(NAME erase_if SRCS "tests/erase_if_test.cc" - COPTS "-DUNORDERED_MAP_CXX17" DEPS gmock_main) + COPTS "-DUNORDERED_MAP_CXX17" DEPS ${PHMAP_GTEST_LIBS}) ## --------------- btree ----------------------------------------------- phmap_cc_test(NAME btree SRCS "tests/btree_test.cc" - DEPS gmock_main) + DEPS ${PHMAP_GTEST_LIBS}) endif() diff --git a/cmake/DownloadGTest.cmake b/cmake/DownloadGTest.cmake index 055270f..f4b3137 100644 --- a/cmake/DownloadGTest.cmake +++ b/cmake/DownloadGTest.cmake @@ -7,6 +7,9 @@ configure_file( ${CMAKE_BINARY_DIR}/googletest-download/CMakeLists.txt ) +set(PHMAP_SAVE_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) +set(PHMAP_SAVE_CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + # Configure and build the downloaded googletest source execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . RESULT_VARIABLE result @@ -24,6 +27,9 @@ if(result) message(FATAL_ERROR "Build step for googletest failed: ${result}") endif() +set(CMAKE_CXX_FLAGS ${PHMAP_SAVE_CMAKE_CXX_FLAGS}) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PHMAP_SAVE_CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + # Prevent overriding the parent project's compiler/linker settings on Windows set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) diff --git a/cmake/helpers.cmake b/cmake/helpers.cmake index b290066..768ca4a 100644 --- a/cmake/helpers.cmake +++ b/cmake/helpers.cmake @@ -15,8 +15,7 @@ function(phmap_cc_test) ) set(_NAME "test_${PHMAP_CC_TEST_NAME}") - add_executable(${_NAME} "") - target_sources(${_NAME} PRIVATE ${PHMAP_CC_TEST_SRCS}) + add_executable(${_NAME} ${PHMAP_CC_TEST_SRCS}) target_include_directories(${_NAME} PUBLIC ${PHMAP_COMMON_INCLUDE_DIRS} PRIVATE ${GMOCK_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS}