diff --git a/CMakeLists.txt b/CMakeLists.txt index 3833e3de..6b0ecaa2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,11 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.16) -project(seq VERSION 1.0.0 LANGUAGES CXX) +project(seq + VERSION 1.1.0 + DESCRIPTION "Collection of C++11 original containers" + HOMEPAGE_URL "https://github.com/Thermadiag/seq" + LANGUAGES CXX +) include(GNUInstallDirs) @@ -62,100 +67,33 @@ endif() +# Install headers and sources (for header-only mode) +install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/seq" + DESTINATION "${CMAKE_INSTALL_PREFIX}/include") +install (TARGETS seq LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) +install (TARGETS seq RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ) -list(APPEND headers "${CMAKE_CURRENT_SOURCE_DIR}/seq/any.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/bits.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/charconv.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/cvector.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/deque_allocator.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/devector.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/flat_map.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/format.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/hash.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/memory.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/ordered_map.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/pdqsort.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/radix_map.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/radix_hash_map.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/range.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/seq.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/sequence.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/tagged_pointer.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/testing.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/tiered_vector.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/tiny_string.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/type_traits.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/utils.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/binary_search.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/block_codec.h" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/lz4small.h" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/transpose.h" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/shuffle_table.h" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/unshuffle_table.h" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/radix_tree.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/radix_extra.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/simd.hpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/simd.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/charconv.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/hash.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/block_codec.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/lz4small.cpp" - "${CMAKE_CURRENT_SOURCE_DIR}/seq/internal/transpose.cpp" - ) - -target_sources(seq INTERFACE "$") - +# Configure and install seq.pc configure_file(seq.pc.in seq.pc @ONLY) - - - -# Installation (only compatible with CMake version >= 3.3) -if(${CMAKE_VERSION} VERSION_GREATER "3.2") - include(CMakePackageConfigHelpers) - - ## Install include directory and potential natvis file - install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/seq" - DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}") - - - - ## Create and install seqConfig.cmake - configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/seqConfig.cmake.in" - "${CMAKE_CURRENT_BINARY_DIR}/seqConfig.cmake" - INSTALL_DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/seq") - - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/seqConfig.cmake" - DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/seq") - - install(FILES ${CMAKE_BINARY_DIR}/seq.pc +install(FILES ${CMAKE_BINARY_DIR}/seq.pc DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/pkgconfig) - ## Create local seqTargets.cmake - export(TARGETS seq NAMESPACE seq:: FILE "${CMAKE_CURRENT_BINARY_DIR}/seqTargets.cmake") - - ## Create and install global seqTargets.cmake - install(TARGETS seq - EXPORT seqTargets) - - install(EXPORT seqTargets - NAMESPACE seq:: - DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/seq") - - - - ## Create and install seqConfigVersion.cmake - # seq is header-only and does not depend on the architecture. - # Remove CMAKE_SIZEOF_VOID_P from seqConfigVersion.cmake so that a - # seqConfig.cmake generated for a 64 bit target can be used for 32 bit - # targets and vice versa. - set(CMAKE_SIZEOF_VOID_P_BACKUP ${CMAKE_SIZEOF_VOID_P}) - unset(CMAKE_SIZEOF_VOID_P) - write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/seqConfigVersion.cmake" - COMPATIBILITY SameMajorVersion) - set(CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P_BACKUP}) - - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/seqConfigVersion.cmake" - DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/cmake/seq") -endif() \ No newline at end of file +# Configure and install seqConfig.cmake and seqConfigVersion.cmake +include(CMakePackageConfigHelpers) +configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/seqConfig.cmake.in" + "${CMAKE_CURRENT_BINARY_DIR}/seqConfig.cmake" + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/seq + PATH_VARS ) + +# Generate seqConfigVersion.cmake +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/seqConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion ) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/seqConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/seqConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/seq ) + diff --git a/README.md b/README.md index 71ae9857..28c95e93 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,40 @@ Build The *seq* library requires compilation using cmake, but you can still use it without compilation by defining `SEQ_HEADER_ONLY`. Even in header-only mode, you should use the cmake file for installation. Tests can be built using cmake from the `tests` folder, and benchmarks from the `benchs` folder. +Note that for msvc build, AVX2 support is enabled by default. You should call cmake with `-DENABLE_AVX2=OFF` to disable it. + +Using Seq library with CMake +---------------------------- + +The follwing example shows how to use the *seq* library within a CMake project: + +```cmake +# Dummy test project +project(test) + +# Add seq installation folder +list(APPEND CMAKE_PREFIX_PATH "path_to_seq_installation/lib/cmake/seq") + +# Find package seq +find_package(seq REQUIRED) + +# Add include directory +include_directories("${SEQ_INCLUDE_DIR}") +# Add lib directory +link_directories("${SEQ_LIB_DIR}") +# Add sources +add_executable(test test.cpp) + +# Add sse/avx flags +if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + target_compile_options(test PRIVATE /arch:AVX2) +else() + target_compile_options(test PRIVATE -march=native) +endif() + +# Link with seq +target_link_libraries(test ${SEQ_LIBRARY} ) +``` Acknowledgements ---------------- diff --git a/cmake/seqConfig.cmake.in b/cmake/seqConfig.cmake.in index 59c3d612..a7d549e1 100644 --- a/cmake/seqConfig.cmake.in +++ b/cmake/seqConfig.cmake.in @@ -1,9 +1,15 @@ -# This module sets the following variables: -# * seq_FOUND - true if seq found on the system -# * seq_INCLUDE_DIRS - the directory containing seq headers + @PACKAGE_INIT@ -if(NOT TARGET seq) - include("${CMAKE_CURRENT_LIST_DIR}/seqTargets.cmake") - get_target_property(seq_INCLUDE_DIRS seq INTERFACE_INCLUDE_DIRECTORIES) -endif() +set_and_check(SEQ_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include") + +math(EXPR BITS "8*${CMAKE_SIZEOF_VOID_P}") +IF(${BITS} MATCHES "64" AND UNIX) + set_and_check(SEQ_LIB_DIR "${PACKAGE_PREFIX_DIR}/lib64") +ELSE() + set_and_check(SEQ_LIB_DIR "${PACKAGE_PREFIX_DIR}/lib") +ENDIF() + +set(SEQ_LIBRARY seq) + +check_required_components(seq) diff --git a/seq/internal/block_codec.cpp b/seq/internal/block_codec.cpp index f732e4c2..ffc879a4 100644 --- a/seq/internal/block_codec.cpp +++ b/seq/internal/block_codec.cpp @@ -22,11 +22,15 @@ * SOFTWARE. */ -#ifdef __SSE4_1__ - #include #include +#include "simd.hpp" + +#ifdef __SSE4_1__ + + + #include "block_codec.h" #include "transpose.h" #include "shuffle_table.h" diff --git a/seq/internal/transpose.cpp b/seq/internal/transpose.cpp index 97b2f639..7fe67334 100644 --- a/seq/internal/transpose.cpp +++ b/seq/internal/transpose.cpp @@ -22,10 +22,12 @@ * SOFTWARE. */ -#ifdef __SSE4_1__ + #include "transpose.h" +#ifdef __SSE4_1__ + namespace seq {