From 52d0d7420dd001909108fbade5823c150d7ef9b8 Mon Sep 17 00:00:00 2001 From: Martin Leitner-Ankerl Date: Wed, 24 Aug 2022 08:14:16 +0200 Subject: [PATCH] Updated cmake Makes the library more easy to use and installable. --- CMakeLists.txt | 63 ++++++++++++++++++++++------ cmake/unordered_denseConfig.cmake.in | 4 ++ example/CMakeLists.txt | 6 +++ example/README.md | 16 +++++++ example/main.cpp | 13 ++++++ 5 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 cmake/unordered_denseConfig.cmake.in create mode 100644 example/CMakeLists.txt create mode 100644 example/README.md create mode 100644 example/main.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 585f6c0..323202f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,19 +4,58 @@ project("unordered_dense" DESCRIPTION "A fast & densely stored hashmap and hashset based on robin-hood backward shift deletion" HOMEPAGE_URL "https://github.com/martinus/unordered_dense") +include(GNUInstallDirs) + # determine whether this is a standalone project or included by other projects -set(_unordered_dense_is_included ON) -if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(_unordered_dense_is_included OFF) +if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME) + set(_unordered_dense_is_toplevel_project TRUE) +else() + set(_unordered_dense_is_toplevel_project FALSE) endif() -if(_unordered_dense_is_included) - add_library(unordered_dense INTERFACE) - add_library(unordered_dense::unordered_dense ALIAS unordered_dense) - target_compile_features(unordered_dense INTERFACE cxx_std_17) - target_include_directories( - unordered_dense - INTERFACE - $ - $) +add_library(unordered_dense INTERFACE) +add_library(unordered_dense::unordered_dense ALIAS unordered_dense) + +target_include_directories( + unordered_dense + INTERFACE + $ + $) + +target_compile_features(unordered_dense INTERFACE cxx_std_17) + +if(_unordered_dense_is_toplevel_project) + # locations are provided by GNUInstallDirs + install( + TARGETS unordered_dense + EXPORT unordered_dense_Targets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + + include(CMakePackageConfigHelpers) + write_basic_package_version_file( + "unordered_denseConfigVersion.cmake" + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion) + + configure_package_config_file( + "${PROJECT_SOURCE_DIR}/cmake/unordered_denseConfig.cmake.in" + "${PROJECT_BINARY_DIR}/unordered_denseConfig.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/unordered_dense/cmake) + + install( + EXPORT unordered_dense_Targets + FILE unordered_denseTargets.cmake + NAMESPACE unordered_dense:: + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/unordered_dense/cmake) + + install( + FILES "${PROJECT_BINARY_DIR}/unordered_denseConfig.cmake" + "${PROJECT_BINARY_DIR}/unordered_denseConfigVersion.cmake" + DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/unordered_dense/cmake) + + install( + DIRECTORY ${PROJECT_SOURCE_DIR}/include/ankerl + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() diff --git a/cmake/unordered_denseConfig.cmake.in b/cmake/unordered_denseConfig.cmake.in new file mode 100644 index 0000000..ff0fa67 --- /dev/null +++ b/cmake/unordered_denseConfig.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") +check_required_components("@PROJECT_NAME@") \ No newline at end of file diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 0000000..19e2194 --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,6 @@ +cmake_minimum_required(VERSION 3.12) +project("UnorderedDenseExample") + +add_executable(UnorderedDenseExample main.cpp) +find_package(unordered_dense CONFIG REQUIRED) +target_link_libraries(UnorderedDenseExample unordered_dense::unordered_dense) diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..14fef9b --- /dev/null +++ b/example/README.md @@ -0,0 +1,16 @@ +A simple example that demonstrats how to make use of `unordered_dense` with cmake. + +Use globally installed `unordered_dense`: +```sh +mkdir build && cd build +cmake -DCMAKE_INSTALL_PREFIX:PATH=${HOME}/unordered_dense_install .. +make +``` + +Use locall installed `unordered_dense`, as in the main README.md: + +```sh +mkdir build && cd build +cmake -DCMAKE_INSTALL_PREFIX:PATH=${HOME}/unordered_dense_install .. +make +``` diff --git a/example/main.cpp b/example/main.cpp new file mode 100644 index 0000000..8e9c65e --- /dev/null +++ b/example/main.cpp @@ -0,0 +1,13 @@ +#include + +#include + +auto main() -> int { + auto map = ankerl::unordered_dense::map(); + map[123] = "hello"; + map[987] = "world!"; + + for (auto const& [key, val] : map) { + std::cout << key << " => " << val << std::endl; + } +}