couchbase 3.0.0.alpha.1 → 3.0.0.alpha.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests-6.0.3.yml +49 -0
  3. data/.github/workflows/tests.yml +47 -0
  4. data/.gitmodules +3 -0
  5. data/.idea/dictionaries/gem_terms.xml +5 -0
  6. data/.idea/inspectionProfiles/Project_Default.xml +1 -0
  7. data/.idea/vcs.xml +1 -0
  8. data/Gemfile +1 -0
  9. data/README.md +55 -2
  10. data/Rakefile +18 -0
  11. data/bin/init-cluster +62 -0
  12. data/bin/setup +1 -0
  13. data/couchbase.gemspec +3 -2
  14. data/examples/crud.rb +1 -2
  15. data/examples/managing_buckets.rb +47 -0
  16. data/examples/managing_collections.rb +58 -0
  17. data/examples/managing_query_indexes.rb +63 -0
  18. data/examples/query.rb +3 -2
  19. data/examples/query_with_consistency.rb +76 -0
  20. data/examples/subdocument.rb +23 -1
  21. data/ext/.clang-format +1 -1
  22. data/ext/.idea/dictionaries/couchbase_terms.xml +2 -0
  23. data/ext/.idea/vcs.xml +1 -0
  24. data/ext/CMakeLists.txt +30 -12
  25. data/ext/build_version.hxx.in +26 -0
  26. data/ext/couchbase/bucket.hxx +69 -8
  27. data/ext/couchbase/cluster.hxx +70 -54
  28. data/ext/couchbase/collections_manifest.hxx +3 -3
  29. data/ext/couchbase/configuration.hxx +14 -0
  30. data/ext/couchbase/couchbase.cxx +2044 -383
  31. data/ext/couchbase/{operations/document_id.hxx → document_id.hxx} +5 -4
  32. data/ext/couchbase/io/http_message.hxx +5 -1
  33. data/ext/couchbase/io/http_parser.hxx +2 -1
  34. data/ext/couchbase/io/http_session.hxx +6 -3
  35. data/ext/couchbase/io/{binary_message.hxx → mcbp_message.hxx} +15 -12
  36. data/ext/couchbase/io/mcbp_parser.hxx +99 -0
  37. data/ext/couchbase/io/{key_value_session.hxx → mcbp_session.hxx} +200 -95
  38. data/ext/couchbase/io/session_manager.hxx +37 -22
  39. data/ext/couchbase/mutation_token.hxx +2 -1
  40. data/ext/couchbase/operations.hxx +38 -8
  41. data/ext/couchbase/operations/bucket_create.hxx +138 -0
  42. data/ext/couchbase/operations/bucket_drop.hxx +65 -0
  43. data/ext/couchbase/operations/bucket_flush.hxx +65 -0
  44. data/ext/couchbase/operations/bucket_get.hxx +69 -0
  45. data/ext/couchbase/operations/bucket_get_all.hxx +62 -0
  46. data/ext/couchbase/operations/bucket_settings.hxx +111 -0
  47. data/ext/couchbase/operations/bucket_update.hxx +115 -0
  48. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +60 -0
  49. data/ext/couchbase/operations/collection_create.hxx +86 -0
  50. data/ext/couchbase/operations/collection_drop.hxx +82 -0
  51. data/ext/couchbase/operations/command.hxx +10 -10
  52. data/ext/couchbase/operations/document_decrement.hxx +80 -0
  53. data/ext/couchbase/operations/document_exists.hxx +80 -0
  54. data/ext/couchbase/operations/{get.hxx → document_get.hxx} +4 -2
  55. data/ext/couchbase/operations/document_get_and_lock.hxx +64 -0
  56. data/ext/couchbase/operations/document_get_and_touch.hxx +64 -0
  57. data/ext/couchbase/operations/document_increment.hxx +80 -0
  58. data/ext/couchbase/operations/document_insert.hxx +74 -0
  59. data/ext/couchbase/operations/{lookup_in.hxx → document_lookup_in.hxx} +2 -2
  60. data/ext/couchbase/operations/{mutate_in.hxx → document_mutate_in.hxx} +11 -2
  61. data/ext/couchbase/operations/{query.hxx → document_query.hxx} +101 -6
  62. data/ext/couchbase/operations/document_remove.hxx +67 -0
  63. data/ext/couchbase/operations/document_replace.hxx +76 -0
  64. data/ext/couchbase/operations/{upsert.hxx → document_touch.hxx} +14 -14
  65. data/ext/couchbase/operations/{remove.hxx → document_unlock.hxx} +12 -10
  66. data/ext/couchbase/operations/document_upsert.hxx +74 -0
  67. data/ext/couchbase/operations/query_index_build_deferred.hxx +85 -0
  68. data/ext/couchbase/operations/query_index_create.hxx +134 -0
  69. data/ext/couchbase/operations/query_index_drop.hxx +108 -0
  70. data/ext/couchbase/operations/query_index_get_all.hxx +106 -0
  71. data/ext/couchbase/operations/scope_create.hxx +81 -0
  72. data/ext/couchbase/operations/scope_drop.hxx +79 -0
  73. data/ext/couchbase/operations/scope_get_all.hxx +72 -0
  74. data/ext/couchbase/protocol/client_opcode.hxx +35 -0
  75. data/ext/couchbase/protocol/client_request.hxx +56 -9
  76. data/ext/couchbase/protocol/client_response.hxx +52 -15
  77. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +81 -0
  78. data/ext/couchbase/protocol/cmd_decrement.hxx +187 -0
  79. data/ext/couchbase/protocol/cmd_exists.hxx +171 -0
  80. data/ext/couchbase/protocol/cmd_get.hxx +31 -8
  81. data/ext/couchbase/protocol/cmd_get_and_lock.hxx +142 -0
  82. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +142 -0
  83. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +16 -3
  84. data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +16 -3
  85. data/ext/couchbase/protocol/cmd_get_error_map.hxx +16 -3
  86. data/ext/couchbase/protocol/cmd_hello.hxx +24 -8
  87. data/ext/couchbase/protocol/cmd_increment.hxx +187 -0
  88. data/ext/couchbase/protocol/cmd_info.hxx +1 -0
  89. data/ext/couchbase/protocol/cmd_insert.hxx +172 -0
  90. data/ext/couchbase/protocol/cmd_lookup_in.hxx +28 -13
  91. data/ext/couchbase/protocol/cmd_mutate_in.hxx +65 -13
  92. data/ext/couchbase/protocol/cmd_remove.hxx +59 -4
  93. data/ext/couchbase/protocol/cmd_replace.hxx +172 -0
  94. data/ext/couchbase/protocol/cmd_sasl_auth.hxx +15 -3
  95. data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +15 -3
  96. data/ext/couchbase/protocol/cmd_sasl_step.hxx +15 -3
  97. data/ext/couchbase/protocol/cmd_select_bucket.hxx +14 -2
  98. data/ext/couchbase/protocol/cmd_touch.hxx +102 -0
  99. data/ext/couchbase/protocol/cmd_unlock.hxx +95 -0
  100. data/ext/couchbase/protocol/cmd_upsert.hxx +50 -14
  101. data/ext/couchbase/protocol/durability_level.hxx +67 -0
  102. data/ext/couchbase/protocol/frame_info_id.hxx +187 -0
  103. data/ext/couchbase/protocol/hello_feature.hxx +137 -0
  104. data/ext/couchbase/protocol/server_opcode.hxx +57 -0
  105. data/ext/couchbase/protocol/server_request.hxx +122 -0
  106. data/ext/couchbase/protocol/unsigned_leb128.h +15 -15
  107. data/ext/couchbase/utils/byteswap.hxx +1 -2
  108. data/ext/couchbase/utils/url_codec.hxx +225 -0
  109. data/ext/couchbase/version.hxx +3 -1
  110. data/ext/extconf.rb +4 -1
  111. data/ext/test/main.cxx +37 -113
  112. data/ext/third_party/snappy/.appveyor.yml +36 -0
  113. data/ext/third_party/snappy/.gitignore +8 -0
  114. data/ext/third_party/snappy/.travis.yml +98 -0
  115. data/ext/third_party/snappy/AUTHORS +1 -0
  116. data/ext/third_party/snappy/CMakeLists.txt +345 -0
  117. data/ext/third_party/snappy/CONTRIBUTING.md +26 -0
  118. data/ext/third_party/snappy/COPYING +54 -0
  119. data/ext/third_party/snappy/NEWS +188 -0
  120. data/ext/third_party/snappy/README.md +148 -0
  121. data/ext/third_party/snappy/cmake/SnappyConfig.cmake.in +33 -0
  122. data/ext/third_party/snappy/cmake/config.h.in +59 -0
  123. data/ext/third_party/snappy/docs/README.md +72 -0
  124. data/ext/third_party/snappy/format_description.txt +110 -0
  125. data/ext/third_party/snappy/framing_format.txt +135 -0
  126. data/ext/third_party/snappy/snappy-c.cc +90 -0
  127. data/ext/third_party/snappy/snappy-c.h +138 -0
  128. data/ext/third_party/snappy/snappy-internal.h +315 -0
  129. data/ext/third_party/snappy/snappy-sinksource.cc +121 -0
  130. data/ext/third_party/snappy/snappy-sinksource.h +182 -0
  131. data/ext/third_party/snappy/snappy-stubs-internal.cc +42 -0
  132. data/ext/third_party/snappy/snappy-stubs-internal.h +493 -0
  133. data/ext/third_party/snappy/snappy-stubs-public.h.in +63 -0
  134. data/ext/third_party/snappy/snappy-test.cc +613 -0
  135. data/ext/third_party/snappy/snappy-test.h +526 -0
  136. data/ext/third_party/snappy/snappy.cc +1770 -0
  137. data/ext/third_party/snappy/snappy.h +209 -0
  138. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +60 -0
  139. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +58 -0
  140. data/ext/third_party/snappy/snappy_unittest.cc +1512 -0
  141. data/ext/third_party/snappy/testdata/alice29.txt +3609 -0
  142. data/ext/third_party/snappy/testdata/asyoulik.txt +4122 -0
  143. data/ext/third_party/snappy/testdata/baddata1.snappy +0 -0
  144. data/ext/third_party/snappy/testdata/baddata2.snappy +0 -0
  145. data/ext/third_party/snappy/testdata/baddata3.snappy +0 -0
  146. data/ext/third_party/snappy/testdata/fireworks.jpeg +0 -0
  147. data/ext/third_party/snappy/testdata/geo.protodata +0 -0
  148. data/ext/third_party/snappy/testdata/html +1 -0
  149. data/ext/third_party/snappy/testdata/html_x_4 +1 -0
  150. data/ext/third_party/snappy/testdata/kppkn.gtb +0 -0
  151. data/ext/third_party/snappy/testdata/lcet10.txt +7519 -0
  152. data/ext/third_party/snappy/testdata/paper-100k.pdf +600 -2
  153. data/ext/third_party/snappy/testdata/plrabn12.txt +10699 -0
  154. data/ext/third_party/snappy/testdata/urls.10K +10000 -0
  155. data/lib/couchbase/binary_collection.rb +33 -76
  156. data/lib/couchbase/binary_collection_options.rb +94 -0
  157. data/lib/couchbase/bucket.rb +9 -3
  158. data/lib/couchbase/cluster.rb +161 -23
  159. data/lib/couchbase/collection.rb +108 -191
  160. data/lib/couchbase/collection_options.rb +430 -0
  161. data/lib/couchbase/errors.rb +136 -134
  162. data/lib/couchbase/json_transcoder.rb +32 -0
  163. data/lib/couchbase/management/analytics_index_manager.rb +185 -9
  164. data/lib/couchbase/management/bucket_manager.rb +84 -33
  165. data/lib/couchbase/management/collection_manager.rb +166 -1
  166. data/lib/couchbase/management/query_index_manager.rb +261 -0
  167. data/lib/couchbase/management/search_index_manager.rb +291 -0
  168. data/lib/couchbase/management/user_manager.rb +12 -10
  169. data/lib/couchbase/management/view_index_manager.rb +151 -1
  170. data/lib/couchbase/mutation_state.rb +11 -1
  171. data/lib/couchbase/scope.rb +4 -4
  172. data/lib/couchbase/version.rb +1 -1
  173. metadata +113 -18
  174. data/.travis.yml +0 -7
  175. data/ext/couchbase/io/binary_parser.hxx +0 -64
  176. data/lib/couchbase/results.rb +0 -307
@@ -0,0 +1,36 @@
1
+ # Build matrix / environment variables are explained on:
2
+ # https://www.appveyor.com/docs/appveyor-yml/
3
+ # This file can be validated on: https://ci.appveyor.com/tools/validate-yaml
4
+
5
+ version: "{build}"
6
+
7
+ environment:
8
+ matrix:
9
+ # AppVeyor currently has no custom job name feature.
10
+ # http://help.appveyor.com/discussions/questions/1623-can-i-provide-a-friendly-name-for-jobs
11
+ - JOB: Visual Studio 2019
12
+ APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
13
+ CMAKE_GENERATOR: Visual Studio 16 2019
14
+
15
+ platform:
16
+ - x86
17
+ - x64
18
+
19
+ configuration:
20
+ - RelWithDebInfo
21
+ - Debug
22
+
23
+ build_script:
24
+ - git submodule update --init --recursive
25
+ - mkdir build
26
+ - cd build
27
+ - if "%platform%"=="x86" (set CMAKE_GENERATOR_PLATFORM="Win32")
28
+ else (set CMAKE_GENERATOR_PLATFORM="%platform%")
29
+ - cmake --version
30
+ - cmake .. -G "%CMAKE_GENERATOR%" -A "%CMAKE_GENERATOR_PLATFORM%"
31
+ -DCMAKE_CONFIGURATION_TYPES="%CONFIGURATION%" -DSNAPPY_REQUIRE_AVX2=ON
32
+ - cmake --build . --config %CONFIGURATION%
33
+ - cd ..
34
+
35
+ test_script:
36
+ - build\%CONFIGURATION%\snappy_unittest
@@ -0,0 +1,8 @@
1
+ # Editors.
2
+ *.sw*
3
+ .vscode
4
+ .DS_Store
5
+
6
+ # Build directory.
7
+ build/
8
+ out/
@@ -0,0 +1,98 @@
1
+ # Build matrix / environment variables are explained on:
2
+ # http://about.travis-ci.org/docs/user/build-configuration/
3
+ # This file can be validated on: http://lint.travis-ci.org/
4
+
5
+ language: cpp
6
+ dist: bionic
7
+ osx_image: xcode11.3
8
+
9
+ compiler:
10
+ - gcc
11
+ - clang
12
+ os:
13
+ - linux
14
+ - osx
15
+
16
+ env:
17
+ - BUILD_TYPE=Debug CPU_LEVEL=AVX
18
+ - BUILD_TYPE=Debug CPU_LEVEL=AVX2
19
+ - BUILD_TYPE=RelWithDebInfo CPU_LEVEL=AVX
20
+ - BUILD_TYPE=RelWithDebInfo CPU_LEVEL=AVX2
21
+
22
+ jobs:
23
+ exclude:
24
+ # Travis OSX servers seem to run on pre-Haswell CPUs. Attempting to use AVX2
25
+ # results in crashes.
26
+ - env: BUILD_TYPE=Debug CPU_LEVEL=AVX2
27
+ os: osx
28
+ - env: BUILD_TYPE=RelWithDebInfo CPU_LEVEL=AVX2
29
+ os: osx
30
+ allow_failures:
31
+ # Homebrew's GCC is currently broken on XCode 11.
32
+ - compiler: gcc
33
+ os: osx
34
+
35
+ addons:
36
+ apt:
37
+ sources:
38
+ - sourceline: 'deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-10 main'
39
+ key_url: 'https://apt.llvm.org/llvm-snapshot.gpg.key'
40
+ - sourceline: 'ppa:ubuntu-toolchain-r/test'
41
+ packages:
42
+ - clang-10
43
+ - cmake
44
+ - gcc-9
45
+ - g++-9
46
+ - ninja-build
47
+ homebrew:
48
+ packages:
49
+ - cmake
50
+ - gcc@9
51
+ - llvm@10
52
+ - ninja
53
+ update: true
54
+
55
+ install:
56
+ # The following Homebrew packages aren't linked by default, and need to be
57
+ # prepended to the path explicitly.
58
+ - if [ "$TRAVIS_OS_NAME" = "osx" ]; then
59
+ export PATH="$(brew --prefix llvm)/bin:$PATH";
60
+ fi
61
+ # Fuzzing is only supported on Clang. Perform fuzzing on Debug builds.
62
+ - if [ "$CXX" = "clang++" ] && [ "$BUILD_TYPE" = "Debug" ]; then
63
+ export FUZZING=1;
64
+ else
65
+ export FUZZING=0;
66
+ fi
67
+ # /usr/bin/gcc points to an older compiler on both Linux and macOS.
68
+ - if [ "$CXX" = "g++" ]; then export CXX="g++-9" CC="gcc-9"; fi
69
+ # /usr/bin/clang points to an older compiler on both Linux and macOS.
70
+ #
71
+ # Homebrew's llvm package doesn't ship a versioned clang++ binary, so the values
72
+ # below don't work on macOS. Fortunately, the path change above makes the
73
+ # default values (clang and clang++) resolve to the correct compiler on macOS.
74
+ - if [ "$TRAVIS_OS_NAME" = "linux" ]; then
75
+ if [ "$CXX" = "clang++" ]; then export CXX="clang++-10" CC="clang-10"; fi;
76
+ fi
77
+ - echo ${CC}
78
+ - echo ${CXX}
79
+ - ${CXX} --version
80
+ - cmake --version
81
+
82
+ before_script:
83
+ - mkdir -p build && cd build
84
+ - cmake .. -G Ninja -DCMAKE_BUILD_TYPE=$BUILD_TYPE
85
+ -DSNAPPY_REQUIRE_${CPU_LEVEL}=ON -DSNAPPY_FUZZING_BUILD=${FUZZING}
86
+ -DCMAKE_INSTALL_PREFIX=$HOME/.local
87
+ - cmake --build .
88
+ - cd ..
89
+
90
+ script:
91
+ - build/snappy_unittest
92
+ - if [ -f build/snappy_compress_fuzzer ]; then
93
+ build/snappy_compress_fuzzer -runs=1000 -close_fd_mask=3;
94
+ fi
95
+ - if [ -f build/snappy_uncompress_fuzzer ]; then
96
+ build/snappy_uncompress_fuzzer -runs=1000 -close_fd_mask=3;
97
+ fi
98
+ - cd build && cmake --build . --target install
@@ -0,0 +1 @@
1
+ opensource@google.com
@@ -0,0 +1,345 @@
1
+ # Copyright 2019 Google Inc. All Rights Reserved.
2
+ #
3
+ # Redistribution and use in source and binary forms, with or without
4
+ # modification, are permitted provided that the following conditions are
5
+ # met:
6
+ #
7
+ # * Redistributions of source code must retain the above copyright
8
+ # notice, this list of conditions and the following disclaimer.
9
+ # * Redistributions in binary form must reproduce the above
10
+ # copyright notice, this list of conditions and the following disclaimer
11
+ # in the documentation and/or other materials provided with the
12
+ # distribution.
13
+ # * Neither the name of Google Inc. nor the names of its
14
+ # contributors may be used to endorse or promote products derived from
15
+ # this software without specific prior written permission.
16
+ #
17
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+
29
+ cmake_minimum_required(VERSION 3.1)
30
+ project(Snappy VERSION 1.1.8 LANGUAGES C CXX)
31
+
32
+ # C++ standard can be overridden when this is used as a sub-project.
33
+ if(NOT CMAKE_CXX_STANDARD)
34
+ # This project requires C++11.
35
+ set(CMAKE_CXX_STANDARD 11)
36
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
37
+ set(CMAKE_CXX_EXTENSIONS OFF)
38
+ endif(NOT CMAKE_CXX_STANDARD)
39
+
40
+ # https://github.com/izenecloud/cmake/blob/master/SetCompilerWarningAll.cmake
41
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
42
+ # Use the highest warning level for Visual Studio.
43
+ set(CMAKE_CXX_WARNING_LEVEL 4)
44
+ if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
45
+ string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
46
+ else(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
47
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
48
+ endif(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
49
+
50
+ # Disable C++ exceptions.
51
+ string(REGEX REPLACE "/EH[a-z]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
52
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHs-c-")
53
+ add_definitions(-D_HAS_EXCEPTIONS=0)
54
+
55
+ # Disable RTTI.
56
+ string(REGEX REPLACE "/GR" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
57
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR-")
58
+ else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
59
+ # Use -Wall for clang and gcc.
60
+ if(NOT CMAKE_CXX_FLAGS MATCHES "-Wall")
61
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
62
+ endif(NOT CMAKE_CXX_FLAGS MATCHES "-Wall")
63
+
64
+ # Use -Wextra for clang and gcc.
65
+ if(NOT CMAKE_CXX_FLAGS MATCHES "-Wextra")
66
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
67
+ endif(NOT CMAKE_CXX_FLAGS MATCHES "-Wextra")
68
+
69
+ # Use -Werror for clang and gcc.
70
+ if(NOT CMAKE_CXX_FLAGS MATCHES "-Werror")
71
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
72
+ endif(NOT CMAKE_CXX_FLAGS MATCHES "-Werror")
73
+
74
+ # Disable C++ exceptions.
75
+ string(REGEX REPLACE "-fexceptions" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
76
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
77
+
78
+ # Disable RTTI.
79
+ string(REGEX REPLACE "-frtti" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
80
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
81
+ endif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
82
+
83
+ # BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to make
84
+ # it prominent in the GUI.
85
+ option(BUILD_SHARED_LIBS "Build shared libraries(DLLs)." OFF)
86
+
87
+ option(SNAPPY_BUILD_TESTS "Build Snappy's own tests." ON)
88
+
89
+ option(SNAPPY_FUZZING_BUILD "Build Snappy for fuzzing." OFF)
90
+
91
+ option(SNAPPY_REQUIRE_AVX "Target processors with AVX support." OFF)
92
+
93
+ option(SNAPPY_REQUIRE_AVX2 "Target processors with AVX2 support." OFF)
94
+
95
+ option(SNAPPY_INSTALL "Install Snappy's header and library" ON)
96
+
97
+ include(TestBigEndian)
98
+ test_big_endian(SNAPPY_IS_BIG_ENDIAN)
99
+
100
+ include(CheckIncludeFile)
101
+ check_include_file("sys/mman.h" HAVE_SYS_MMAN_H)
102
+ check_include_file("sys/resource.h" HAVE_SYS_RESOURCE_H)
103
+ check_include_file("sys/time.h" HAVE_SYS_TIME_H)
104
+ check_include_file("sys/uio.h" HAVE_SYS_UIO_H)
105
+ check_include_file("unistd.h" HAVE_UNISTD_H)
106
+ check_include_file("windows.h" HAVE_WINDOWS_H)
107
+
108
+ include(CheckLibraryExists)
109
+ check_library_exists(z zlibVersion "" HAVE_LIBZ)
110
+ check_library_exists(lzo2 lzo1x_1_15_compress "" HAVE_LIBLZO2)
111
+
112
+ include(CheckCXXCompilerFlag)
113
+ CHECK_CXX_COMPILER_FLAG("/arch:AVX" HAVE_VISUAL_STUDIO_ARCH_AVX)
114
+ CHECK_CXX_COMPILER_FLAG("/arch:AVX2" HAVE_VISUAL_STUDIO_ARCH_AVX2)
115
+ CHECK_CXX_COMPILER_FLAG("-mavx" HAVE_CLANG_MAVX)
116
+ CHECK_CXX_COMPILER_FLAG("-mbmi2" HAVE_CLANG_MBMI2)
117
+ if(SNAPPY_REQUIRE_AVX2)
118
+ if(HAVE_VISUAL_STUDIO_ARCH_AVX2)
119
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2")
120
+ endif(HAVE_VISUAL_STUDIO_ARCH_AVX2)
121
+ if(HAVE_CLANG_MAVX)
122
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx")
123
+ endif(HAVE_CLANG_MAVX)
124
+ if(HAVE_CLANG_MBMI2)
125
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mbmi2")
126
+ endif(HAVE_CLANG_MBMI2)
127
+ elseif (SNAPPY_REQUIRE_AVX)
128
+ if(HAVE_VISUAL_STUDIO_ARCH_AVX)
129
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
130
+ endif(HAVE_VISUAL_STUDIO_ARCH_AVX)
131
+ if(HAVE_CLANG_MAVX)
132
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx")
133
+ endif(HAVE_CLANG_MAVX)
134
+ endif(SNAPPY_REQUIRE_AVX2)
135
+
136
+ include(CheckCXXSourceCompiles)
137
+ check_cxx_source_compiles("
138
+ int main() {
139
+ return __builtin_expect(0, 1);
140
+ }" HAVE_BUILTIN_EXPECT)
141
+
142
+ check_cxx_source_compiles("
143
+ int main() {
144
+ return __builtin_ctzll(0);
145
+ }" HAVE_BUILTIN_CTZ)
146
+
147
+ check_cxx_source_compiles("
148
+ __attribute__((always_inline)) int zero() { return 0; }
149
+
150
+ int main() {
151
+ return zero();
152
+ }" HAVE_ATTRIBUTE_ALWAYS_INLINE)
153
+
154
+ check_cxx_source_compiles("
155
+ #include <tmmintrin.h>
156
+
157
+ int main() {
158
+ const __m128i *src = 0;
159
+ __m128i dest;
160
+ const __m128i shuffle_mask = _mm_load_si128(src);
161
+ const __m128i pattern = _mm_shuffle_epi8(_mm_loadl_epi64(src), shuffle_mask);
162
+ _mm_storeu_si128(&dest, pattern);
163
+ return 0;
164
+ }" SNAPPY_HAVE_SSSE3)
165
+
166
+ check_cxx_source_compiles("
167
+ #include <immintrin.h>
168
+ int main() {
169
+ return _bzhi_u32(0, 1);
170
+ }" SNAPPY_HAVE_BMI2)
171
+
172
+ include(CheckSymbolExists)
173
+ check_symbol_exists("mmap" "sys/mman.h" HAVE_FUNC_MMAP)
174
+ check_symbol_exists("sysconf" "unistd.h" HAVE_FUNC_SYSCONF)
175
+
176
+ find_package(GTest QUIET)
177
+ if(GTEST_FOUND)
178
+ set(HAVE_GTEST 1)
179
+ endif(GTEST_FOUND)
180
+
181
+ find_package(Gflags QUIET)
182
+ if(GFLAGS_FOUND)
183
+ set(HAVE_GFLAGS 1)
184
+ endif(GFLAGS_FOUND)
185
+
186
+ configure_file(
187
+ "cmake/config.h.in"
188
+ "${PROJECT_BINARY_DIR}/config.h"
189
+ )
190
+
191
+ # We don't want to define HAVE_ macros in public headers. Instead, we use
192
+ # CMake's variable substitution with 0/1 variables, which will be seen by the
193
+ # preprocessor as constants.
194
+ set(HAVE_SYS_UIO_H_01 ${HAVE_SYS_UIO_H})
195
+ if(NOT HAVE_SYS_UIO_H_01)
196
+ set(HAVE_SYS_UIO_H_01 0)
197
+ endif(NOT HAVE_SYS_UIO_H_01)
198
+
199
+ if (SNAPPY_FUZZING_BUILD)
200
+ if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
201
+ message(WARNING "Fuzzing builds are only supported with Clang")
202
+ endif (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
203
+
204
+ if(NOT CMAKE_CXX_FLAGS MATCHES "-fsanitize=address")
205
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
206
+ endif(NOT CMAKE_CXX_FLAGS MATCHES "-fsanitize=address")
207
+
208
+ if(NOT CMAKE_CXX_FLAGS MATCHES "-fsanitize=fuzzer-no-link")
209
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer-no-link")
210
+ endif(NOT CMAKE_CXX_FLAGS MATCHES "-fsanitize=fuzzer-no-link")
211
+ endif (SNAPPY_FUZZING_BUILD)
212
+
213
+ configure_file(
214
+ "snappy-stubs-public.h.in"
215
+ "${PROJECT_BINARY_DIR}/snappy-stubs-public.h")
216
+
217
+ add_library(snappy "")
218
+ target_sources(snappy
219
+ PRIVATE
220
+ "snappy-internal.h"
221
+ "snappy-stubs-internal.h"
222
+ "snappy-c.cc"
223
+ "snappy-sinksource.cc"
224
+ "snappy-stubs-internal.cc"
225
+ "snappy.cc"
226
+ "${PROJECT_BINARY_DIR}/config.h"
227
+
228
+ # Only CMake 3.3+ supports PUBLIC sources in targets exported by "install".
229
+ $<$<VERSION_GREATER:CMAKE_VERSION,3.2>:PUBLIC>
230
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy-c.h>
231
+ $<INSTALL_INTERFACE:include/snappy-c.h>
232
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy-sinksource.h>
233
+ $<INSTALL_INTERFACE:include/snappy-sinksource.h>
234
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/snappy.h>
235
+ $<INSTALL_INTERFACE:include/snappy.h>
236
+ $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/snappy-stubs-public.h>
237
+ $<INSTALL_INTERFACE:include/snappy-stubs-public.h>
238
+ )
239
+ target_include_directories(snappy
240
+ PUBLIC
241
+ $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>
242
+ $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>
243
+ $<INSTALL_INTERFACE:include>
244
+ )
245
+ set_target_properties(snappy
246
+ PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION ${PROJECT_VERSION_MAJOR})
247
+
248
+ target_compile_definitions(snappy PRIVATE -DHAVE_CONFIG_H)
249
+ if(BUILD_SHARED_LIBS)
250
+ set_target_properties(snappy PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS ON)
251
+ endif(BUILD_SHARED_LIBS)
252
+
253
+ if(SNAPPY_BUILD_TESTS)
254
+ enable_testing()
255
+
256
+ add_executable(snappy_unittest "")
257
+ target_sources(snappy_unittest
258
+ PRIVATE
259
+ "snappy_unittest.cc"
260
+ "snappy-test.cc"
261
+ )
262
+ target_compile_definitions(snappy_unittest PRIVATE -DHAVE_CONFIG_H)
263
+ target_link_libraries(snappy_unittest snappy ${GFLAGS_LIBRARIES})
264
+
265
+ if(HAVE_LIBZ)
266
+ target_link_libraries(snappy_unittest z)
267
+ endif(HAVE_LIBZ)
268
+ if(HAVE_LIBLZO2)
269
+ target_link_libraries(snappy_unittest lzo2)
270
+ endif(HAVE_LIBLZO2)
271
+
272
+ target_include_directories(snappy_unittest
273
+ BEFORE PRIVATE
274
+ "${PROJECT_SOURCE_DIR}"
275
+ "${GTEST_INCLUDE_DIRS}"
276
+ "${GFLAGS_INCLUDE_DIRS}"
277
+ )
278
+
279
+ add_test(
280
+ NAME snappy_unittest
281
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
282
+ COMMAND "${PROJECT_BINARY_DIR}/snappy_unittest")
283
+ endif(SNAPPY_BUILD_TESTS)
284
+
285
+ if(SNAPPY_FUZZING_BUILD)
286
+ add_executable(snappy_compress_fuzzer "")
287
+ target_sources(snappy_compress_fuzzer
288
+ PRIVATE "snappy_compress_fuzzer.cc"
289
+ )
290
+ target_link_libraries(snappy_compress_fuzzer snappy)
291
+ set_target_properties(snappy_compress_fuzzer
292
+ PROPERTIES LINK_FLAGS "-fsanitize=fuzzer"
293
+ )
294
+
295
+ add_executable(snappy_uncompress_fuzzer "")
296
+ target_sources(snappy_uncompress_fuzzer
297
+ PRIVATE "snappy_uncompress_fuzzer.cc"
298
+ )
299
+ target_link_libraries(snappy_uncompress_fuzzer snappy)
300
+ set_target_properties(snappy_uncompress_fuzzer
301
+ PROPERTIES LINK_FLAGS "-fsanitize=fuzzer"
302
+ )
303
+ endif(SNAPPY_FUZZING_BUILD)
304
+
305
+ # Must be included before CMAKE_INSTALL_INCLUDEDIR is used.
306
+ include(GNUInstallDirs)
307
+
308
+ if(SNAPPY_INSTALL)
309
+ install(TARGETS snappy
310
+ EXPORT SnappyTargets
311
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
312
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
313
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
314
+ )
315
+ install(
316
+ FILES
317
+ "snappy-c.h"
318
+ "snappy-sinksource.h"
319
+ "snappy.h"
320
+ "${PROJECT_BINARY_DIR}/snappy-stubs-public.h"
321
+ DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
322
+ )
323
+
324
+ include(CMakePackageConfigHelpers)
325
+ configure_package_config_file(
326
+ "cmake/${PROJECT_NAME}Config.cmake.in"
327
+ "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake"
328
+ INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
329
+ )
330
+ write_basic_package_version_file(
331
+ "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake"
332
+ COMPATIBILITY SameMajorVersion
333
+ )
334
+ install(
335
+ EXPORT SnappyTargets
336
+ NAMESPACE Snappy::
337
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
338
+ )
339
+ install(
340
+ FILES
341
+ "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}Config.cmake"
342
+ "${PROJECT_BINARY_DIR}/cmake/${PROJECT_NAME}ConfigVersion.cmake"
343
+ DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
344
+ )
345
+ endif(SNAPPY_INSTALL)