minisketch.cmake raw

   1  # Copyright (c) 2023-present The Bitcoin Core developers
   2  # Distributed under the MIT software license, see the accompanying
   3  # file COPYING or https://opensource.org/license/mit/.
   4  
   5  include(CheckSourceCompilesWithFlags)
   6  
   7  # Check for clmul instructions support.
   8  if(MSVC)
   9    set(CLMUL_CXXFLAGS "")
  10  else()
  11    set(CLMUL_CXXFLAGS -mpclmul)
  12  endif()
  13  check_cxx_source_compiles_with_flags("
  14    #include <immintrin.h>
  15    #include <cstdint>
  16  
  17    int main()
  18    {
  19      __m128i a = _mm_cvtsi64_si128((uint64_t)7);
  20      __m128i b = _mm_clmulepi64_si128(a, a, 37);
  21      __m128i c = _mm_srli_epi64(b, 41);
  22      __m128i d = _mm_xor_si128(b, c);
  23      uint64_t e = _mm_cvtsi128_si64(d);
  24      return e == 0;
  25    }
  26    " HAVE_CLMUL
  27    CXXFLAGS ${CLMUL_CXXFLAGS}
  28  )
  29  
  30  add_library(minisketch_common INTERFACE)
  31  if(MSVC)
  32    target_compile_options(minisketch_common INTERFACE
  33      /wd4060
  34      /wd4065
  35      /wd4146
  36      /wd4244
  37      /wd4267
  38    )
  39  endif()
  40  
  41  add_library(minisketch STATIC EXCLUDE_FROM_ALL
  42    ${PROJECT_SOURCE_DIR}/src/minisketch/src/minisketch.cpp
  43    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_1byte.cpp
  44    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_2bytes.cpp
  45    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_3bytes.cpp
  46    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_4bytes.cpp
  47    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_5bytes.cpp
  48    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_6bytes.cpp
  49    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_7bytes.cpp
  50    ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/generic_8bytes.cpp
  51  )
  52  
  53  target_compile_definitions(minisketch
  54    PRIVATE
  55      DISABLE_DEFAULT_FIELDS
  56      ENABLE_FIELD_32
  57  )
  58  
  59  target_include_directories(minisketch
  60    PUBLIC
  61      $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/src/minisketch/include>
  62  )
  63  
  64  target_link_libraries(minisketch
  65    PRIVATE
  66      core_interface
  67      minisketch_common
  68  )
  69  
  70  set_target_properties(minisketch PROPERTIES
  71    EXPORT_COMPILE_COMMANDS OFF
  72  )
  73  
  74  if(HAVE_CLMUL)
  75    set(_minisketch_clmul_src
  76        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_1byte.cpp
  77        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_2bytes.cpp
  78        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_3bytes.cpp
  79        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_4bytes.cpp
  80        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_5bytes.cpp
  81        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_6bytes.cpp
  82        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_7bytes.cpp
  83        ${PROJECT_SOURCE_DIR}/src/minisketch/src/fields/clmul_8bytes.cpp
  84    )
  85    target_sources(minisketch PRIVATE ${_minisketch_clmul_src})
  86    set_property(SOURCE ${_minisketch_clmul_src} PROPERTY COMPILE_OPTIONS ${CLMUL_CXXFLAGS})
  87    target_compile_definitions(minisketch PRIVATE HAVE_CLMUL)
  88    unset(_minisketch_clmul_src)
  89  endif()
  90