├── .appveyor.yml ├── .gitignore ├── .travis.yml ├── CMakeLists.txt ├── README.md └── cryptopp-config.cmake /.appveyor.yml: -------------------------------------------------------------------------------- 1 | # Written and placed in public domain by Jeffrey Walton 2 | 3 | version: '{build}' 4 | #branches: 5 | # only: 6 | # - master 7 | 8 | clone_folder: c:\projects\cryptopp-cmake 9 | 10 | image: 11 | - Visual Studio 2013 12 | - Visual Studio 2015 13 | - Visual Studio 2017 14 | - Visual Studio 2019 15 | - Visual Studio 2022 16 | 17 | configuration: 18 | - Release 19 | - Debug 20 | 21 | platform: 22 | - x64 23 | 24 | environment: 25 | matrix: 26 | - arch: Win64 27 | - arch: ARM 28 | 29 | matrix: 30 | fast_finish: true 31 | 32 | # skip unsupported combinations 33 | init: 34 | - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2022" ( set generator="Visual Studio 17 2022 %arch%" ) 35 | - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2019" ( set generator="Visual Studio 16 2019 %arch%" ) 36 | - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2017" ( set generator="Visual Studio 15 2017 %arch%" ) 37 | - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2015" ( set generator="Visual Studio 14 2015 %arch%" ) 38 | - if "%APPVEYOR_BUILD_WORKER_IMAGE%"=="Visual Studio 2013" ( set generator="Visual Studio 12 2013 %arch%" ) 39 | - echo "=======================================================" 40 | - echo APPVEYOR_BUILD_WORKER_IMAGE %APPVEYOR_BUILD_WORKER_IMAGE% 41 | - echo generator %generator% 42 | - echo "=======================================================" 43 | 44 | before_build: 45 | - cmd: |- 46 | c: 47 | cd \projects 48 | git clone https://github.com/weidai11/cryptopp.git 49 | cp cryptopp-cmake/cryptopp-config.cmake cryptopp 50 | cp cryptopp-cmake/CMakeLists.txt cryptopp 51 | cd cryptopp 52 | mkdir _build 53 | cmake --version 54 | 55 | build: 56 | parallel: true 57 | 58 | build_script: 59 | - cd _build 60 | - cmake .. -A %arch% -G %generator% 61 | - cmake --build . --config "%CONFIGURATION%" 62 | 63 | test_script: 64 | - if not "%arch%"=="ARM" ( ctest -V -C "%CONFIGURATION%" ) 65 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Visual Studio 2015/2017 cache/options directory 2 | .vs/ 3 | .idea/ 4 | 5 | # Build directories 6 | build/ 7 | _build/ 8 | cmake-build*/ 9 | 10 | # Mac garbage 11 | .DS_Store 12 | 13 | #vagrant 14 | .vagrant 15 | 16 | #vscode 17 | .vscode 18 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: cpp 2 | dist: bionic 3 | 4 | git: 5 | depth: 5 6 | 7 | jobs: 8 | include: 9 | # Ubuntu Bionic 10 | - name: Ubuntu Bionic, GCC, CMake 3.12.4 11 | os: linux 12 | compiler: gcc 13 | dist: bionic 14 | 15 | - name: Ubuntu Bionic, Clang, CMake 3.12.4 16 | os: linux 17 | compiler: clang 18 | dist: bionic 19 | 20 | # Ubuntu Xenial 21 | - name: Ubuntu Xenial, GCC, CMake 3.9.2 22 | os: linux 23 | compiler: gcc 24 | dist: xenial 25 | 26 | - name: Ubuntu Xenial, Clang, CMake 3.9.2 27 | os: linux 28 | compiler: clang 29 | dist: xenial 30 | 31 | # Ubuntu Trusty 32 | - name: Ubuntu Trusty, GCC, CMake 2.8.12 33 | os: linux 34 | compiler: gcc 35 | dist: trusty 36 | 37 | - name: Ubuntu Trusty, Clang, CMake 2.8.12 38 | os: linux 39 | compiler: clang 40 | dist: trusty 41 | 42 | # ARM64 43 | - name: Ubuntu Bionic, GCC, ARM64, CMake 3.10.2 44 | os: linux 45 | arch: arm64 46 | compiler: gcc 47 | dist: bionic 48 | 49 | - name: Ubuntu Bionic, Clang, ARM64, CMake 3.10.2 50 | os: linux 51 | arch: arm64 52 | compiler: clang 53 | dist: bionic 54 | 55 | # PPC64 56 | - name: Ubuntu Bionic, GCC, PPC64, CMake 3.5.1 57 | os: linux 58 | arch: ppc64le 59 | compiler: gcc 60 | dist: bionic 61 | 62 | - name: Ubuntu Bionic, Clang, PPC64, CMake 3.10.2 63 | os: linux 64 | arch: ppc64le 65 | compiler: clang 66 | dist: bionic 67 | env: 68 | - CC=clang-8 69 | - CXX=clang++-8 70 | 71 | # s390x 72 | - name: Ubuntu Bionic, GCC, s390x, CMake 3.5.1 73 | os: linux 74 | arch: s390x 75 | compiler: gcc 76 | dist: bionic 77 | 78 | - name: Ubuntu Bionic, Clang, s390x, CMake 3.10.2 79 | os: linux 80 | arch: s390x 81 | compiler: clang 82 | dist: bionic 83 | env: 84 | - CC=clang-8 85 | - CXX=clang++-8 86 | 87 | # Newest Xcode available 88 | - name: OS X 10.14, Clang, XCode 11.2, CMake 3.17.0 89 | os: osx 90 | osx_image: xcode11.2 91 | arch: amd64 92 | 93 | - name: OS X 10.13, Clang, XCode 9.4, CMake 3.15.5 94 | os: osx 95 | osx_image: xcode9.4 96 | arch: amd64 97 | 98 | # Oldest Xcode available 99 | - name: OS X 10.11, Clang, XCode 7.3, CMake 3.2.2 100 | os: osx 101 | osx_image: xcode7.3 102 | arch: amd64 103 | 104 | # Ubuntu Bionic, GCC, No-asm 105 | - name: Ubuntu Bionic, GCC, No-Asm 106 | os: linux 107 | compiler: gcc 108 | dist: bionic 109 | script: 110 | # Override the default script 111 | - cmake -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" -DDISABLE_ASM=1 ../ 112 | - make -k -j 2 VERBOSE=1 113 | - ctest --output-on-failure 114 | - ./cryptest.exe v 115 | 116 | # Ubuntu Bionic, Clang, No-asm 117 | - name: Ubuntu Bionic, Clang, No-Asm 118 | os: linux 119 | compiler: clang 120 | dist: bionic 121 | script: 122 | # Override the default script 123 | - cmake -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" -DDISABLE_ASM=1 ../ 124 | - make -k -j 2 VERBOSE=1 125 | - ctest --output-on-failure 126 | - ./cryptest.exe v 127 | 128 | allow_failures: 129 | # Clang 7.0 and below will likely have trouble due to 130 | # https://bugs.llvm.org/show_bug.cgi?id=39704 131 | - arch: ppc64le 132 | compiler: clang 133 | # Clang has a fair amount of trouble 134 | # on platforms Apple does not support 135 | - arch: s390x 136 | compiler: clang 137 | 138 | # 139 | # Build Dependencies 140 | # 141 | before_install: 142 | - | 143 | # Clang 7 compiler is completely broken on PPC64 and s390x 144 | if [[ "$TRAVIS_CPU_ARCH" == "ppc64le" ]] || [[ "$TRAVIS_CPU_ARCH" == "s390x" ]]; then 145 | if [[ "$TRAVIS_OS_NAME" == "linux" ]] && [[ "$TRAVIS_COMPILER" == "clang" ]]; then 146 | # https://github.com/travis-ci/travis-ci/issues/9037 147 | sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A145 148 | sudo apt-get -qq -y install --no-install-recommends clang-8 149 | fi 150 | fi 151 | 152 | before_script: 153 | # Clone Crypto++, prepare build with Cmake 154 | - | 155 | cd .. 156 | git clone https://github.com/weidai11/cryptopp.git cryptopp 157 | cp cryptopp-cmake/*.* cryptopp 158 | cd cryptopp 159 | mkdir cmake_build 160 | cd cmake_build 161 | 162 | script: 163 | # CMake is being run from .../cryptopp/cmake_build/ directory 164 | - cmake -DCMAKE_C_COMPILER="$CC" -DCMAKE_CXX_COMPILER="$CXX" ../ 165 | - make -k -j 2 VERBOSE=1 166 | - ctest --output-on-failure 167 | - ./cryptest.exe v 168 | 169 | addons: 170 | - sonarcloud: false 171 | 172 | # Whitelist branches to avoid testing feature branches twice 173 | branches: 174 | only: 175 | - master 176 | - /\/ci$/ 177 | 178 | notifications: 179 | email: 180 | recipients: 181 | - cryptopp-build@googlegroups.com 182 | on_success: always # default: change 183 | on_failure: always # default: always 184 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Please ensure your changes or patch meets minimum requirements. 2 | # The minimum requirements are 2.8.6. It roughly equates to 3 | # Ubuntu 14.05 LTS or Solaris 11.3. Please do not check in something 4 | # for 3.5.0 or higher because it will break LTS operating systems 5 | # and a number of developer boards used for testing. To test your 6 | # changes, please set up a Ubuntu 14.05 LTS system. 7 | 8 | # Should we be setting things like this? We are not a C project 9 | # so nothing should be done with the C compiler. But there is 10 | # no reliable way to tell CMake we are C++. 11 | # Cannot set this... Breaks Linux PowerPC with Clang: 12 | # SET(CMAKE_C_COMPILER ${CMAKE_CXX_COMPILER}) 13 | # # error "The CMAKE_C_COMPILER is set to a C++ compiler" 14 | 15 | if(NOT DEFINED cryptopp_DISPLAY_CMAKE_SUPPORT_WARNING) 16 | set(cryptopp_DISPLAY_CMAKE_SUPPORT_WARNING 1) 17 | endif() 18 | if(cryptopp_DISPLAY_CMAKE_SUPPORT_WARNING) 19 | message( STATUS 20 | "*************************************************************************\n" 21 | "The Crypto++ library does not officially support CMake. CMake support is a\n" 22 | "community effort, and the library works with the folks using CMake to help\n" 23 | "improve it. If you find an issue then please fix it or report it at\n" 24 | "https://github.com/noloader/cryptopp-cmake.\n" 25 | "-- *************************************************************************" 26 | ) 27 | endif() 28 | 29 | # Print useful information 30 | message( STATUS "CMake version ${CMAKE_VERSION}" ) 31 | message( STATUS "System ${CMAKE_SYSTEM_NAME}" ) 32 | message( STATUS "Processor ${CMAKE_SYSTEM_PROCESSOR}" ) 33 | 34 | cmake_minimum_required(VERSION 2.8.6) 35 | if (${CMAKE_VERSION} VERSION_LESS "3.0.0") 36 | project(cryptopp) 37 | set(cryptopp_VERSION_MAJOR 8) 38 | set(cryptopp_VERSION_MINOR 7) 39 | set(cryptopp_VERSION_PATCH 0) 40 | else () 41 | cmake_policy(SET CMP0048 NEW) 42 | project(cryptopp VERSION 8.7.0) 43 | if (NOT ${CMAKE_VERSION} VERSION_LESS "3.1.0") 44 | cmake_policy(SET CMP0054 NEW) 45 | endif () 46 | endif () 47 | 48 | # Need to set SRC_DIR manually after removing the Python library code. 49 | set(CRYPTOPP_PROJECT_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "Crypto++ project directory") 50 | 51 | # Make RelWithDebInfo the default (it does e.g. add '-O2 -g -DNDEBUG' for GNU) 52 | # If not in multi-configuration environments, no explicit build type or CXX 53 | # flags are set by the user and if we are the root CMakeLists.txt file. 54 | if (NOT CMAKE_CONFIGURATION_TYPES AND 55 | NOT CMAKE_NO_BUILD_TYPE AND 56 | NOT CMAKE_BUILD_TYPE AND 57 | NOT CMAKE_CXX_FLAGS AND 58 | CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) 59 | set(CMAKE_BUILD_TYPE RelWithDebInfo) 60 | endif () 61 | 62 | include(GNUInstallDirs) 63 | include(CheckCXXCompilerFlag) 64 | 65 | # We now carry around test programs. test_cxx.cpp is the default C++ one. 66 | # Also see https://github.com/weidai11/cryptopp/issues/741. 67 | set(TEST_PROG_DIR ${CRYPTOPP_PROJECT_DIR}/TestPrograms) 68 | set(TEST_CXX_FILE ${TEST_PROG_DIR}/test_cxx.cpp) 69 | 70 | # https://github.com/noloader/cryptopp-cmake/issues/56 71 | # https://stackoverflow.com/a/40152725 72 | if (CMAKE_GENERATOR STREQUAL Xcode) 73 | set(USE_INTERMEDIATE_OBJECTS_TARGET OFF) 74 | endif() 75 | 76 | #============================================================================ 77 | # Settable options 78 | #============================================================================ 79 | 80 | option(BUILD_STATIC "Build static library" ON) 81 | option(BUILD_SHARED "Build shared library" ON) 82 | option(BUILD_TESTING "Build library tests" ON) 83 | option(BUILD_DOCUMENTATION "Use Doxygen to create the HTML based API documentation" OFF) 84 | option(USE_INTERMEDIATE_OBJECTS_TARGET "Use a common intermediate objects target for the static and shared library targets" ON) 85 | 86 | if (${CMAKE_VERSION} VERSION_GREATER "3.1") 87 | option(USE_OPENMP "Enable OpenMP to parallelize some of the algorithms. Note that this isn't always faster, see https://www.cryptopp.com/wiki/OpenMP" OFF) 88 | endif() 89 | 90 | 91 | # These are IA-32 options. 92 | option(DISABLE_ASM "Disable ASM" OFF) 93 | option(DISABLE_SSSE3 "Disable SSSE3" OFF) 94 | option(DISABLE_SSE4 "Disable SSE4" OFF) 95 | option(DISABLE_AESNI "Disable AES-NI" OFF) 96 | option(DISABLE_CLMUL "Disable CLMUL" OFF) 97 | option(DISABLE_SHA "Disable SHA" OFF) 98 | option(DISABLE_AVX "Disable AVX" OFF) 99 | option(DISABLE_AVX2 "Disable AVX2" OFF) 100 | 101 | # These are ARM A-32 options 102 | option(DISABLE_ARM_NEON "Disable NEON" OFF) 103 | 104 | # These are Aarch64 options 105 | option(DISABLE_ARM_AES "Disable ASIMD" OFF) 106 | option(DISABLE_ARM_AES "Disable AES" OFF) 107 | option(DISABLE_ARM_PMULL "Disable PMULL" OFF) 108 | option(DISABLE_ARM_SHA "Disable SHA" OFF) 109 | 110 | # These are PowerPC options 111 | option(DISABLE_ALTIVEC "Disable Altivec" OFF) 112 | option(DISABLE_POWER7 "Disable POWER7" OFF) 113 | option(DISABLE_POWER8 "Disable POWER8" OFF) 114 | option(DISABLE_POWER9 "Disable POWER9" OFF) 115 | 116 | set(CRYPTOPP_DATA_DIR ${CRYPTOPP_PROJECT_DIR}/TestData CACHE PATH "Crypto++ test data directory") 117 | 118 | #============================================================================ 119 | # Compiler options 120 | #============================================================================ 121 | 122 | set(CRYPTOPP_COMPILE_DEFINITIONS) 123 | set(CRYPTOPP_COMPILE_OPTIONS) 124 | 125 | # Stop hiding the damn output... 126 | # set(CMAKE_VERBOSE_MAKEFILE ON) 127 | 128 | # Stop CMake complaining... 129 | if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") 130 | set(MACOSX_RPATH FALSE) 131 | endif() 132 | 133 | # Always 1 ahead in Master. Also see http://groups.google.com/forum/#!topic/cryptopp-users/SFhqLDTQPG4 134 | set(LIB_VER ${cryptopp_VERSION_MAJOR}${cryptopp_VERSION_MINOR}${cryptopp_VERSION_PATCH}) 135 | 136 | if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") 137 | list(APPEND CRYPTOPP_COMPILE_OPTIONS -wd68 -wd186 -wd279 -wd327 -wd161 -wd3180) 138 | endif () 139 | 140 | # Also see http://github.com/weidai11/cryptopp/issues/395 141 | if (DISABLE_ASM) 142 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_ASM) 143 | endif () 144 | if (DISABLE_SSSE3) 145 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_SSSE3) 146 | endif () 147 | if (DISABLE_SSE4) 148 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_SSSE4) 149 | endif () 150 | if (DISABLE_CLMUL) 151 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_CLMUL) 152 | endif () 153 | if (DISABLE_AESNI) 154 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_AESNI) 155 | endif () 156 | if (DISABLE_RDRAND) 157 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_RDRAND) 158 | endif () 159 | if (DISABLE_RDSEED) 160 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_RDSEED) 161 | endif () 162 | if (DISABLE_AVX) 163 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_AVX) 164 | endif () 165 | if (DISABLE_AVX2) 166 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_AVX2) 167 | endif () 168 | if (DISABLE_SHA) 169 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_SHA) 170 | endif () 171 | if (DISABLE_ARM_NEON) 172 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_ARM_NEON) 173 | endif () 174 | if (DISABLE_ARM_ASIMD) 175 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_ARM_ASIMD) 176 | endif () 177 | if (DISABLE_ARM_AES) 178 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_ARM_AES) 179 | endif () 180 | if (DISABLE_ARM_PMULL) 181 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_ARM_PMULL) 182 | endif () 183 | if (DISABLE_ARM_SHA) 184 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_ARM_SHA) 185 | endif () 186 | if (DISABLE_ALTIVEC) 187 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_ALTIVEC) 188 | endif () 189 | if (DISABLE_POWER7) 190 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_POWER7) 191 | endif () 192 | if (DISABLE_POWER8) 193 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_POWER8) 194 | endif () 195 | if (DISABLE_POWER9) 196 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS CRYPTOPP_DISABLE_POWER9) 197 | endif () 198 | if (NOT CRYPTOPP_DATA_DIR STREQUAL "") 199 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "CRYPTOPP_DATA_DIR=${CRYPTOPP_DATA_DIR}") 200 | endif () 201 | 202 | ############################################################################### 203 | 204 | # Try to find a Posix compatible grep and sed. Solaris, Digital Unix, 205 | # Tru64, HP-UX and a few others need tweaking 206 | 207 | if (EXISTS /usr/xpg4/bin/grep) 208 | set(GREP_CMD /usr/xpg4/bin/grep) 209 | elseif (EXISTS /usr/gnu/bin/grep) 210 | set(GREP_CMD /usr/gnu/bin/grep) 211 | elseif (EXISTS /usr/linux/bin/grep) 212 | set(GREP_CMD /usr/linux/bin/grep) 213 | else () 214 | set(GREP_CMD grep) 215 | endif () 216 | 217 | if (EXISTS /usr/xpg4/bin/sed) 218 | set(SED_CMD /usr/xpg4/bin/sed) 219 | elseif (EXISTS /usr/gnu/bin/sed) 220 | set(SED_CMD /usr/gnu/bin/sed) 221 | elseif (EXISTS /usr/linux/bin/sed) 222 | set(SED_CMD /usr/linux/bin/sed) 223 | else () 224 | set(SED_CMD sed) 225 | endif () 226 | 227 | ############################################################################### 228 | 229 | function(CheckCompileOption opt var) 230 | 231 | if (MSVC) 232 | 233 | # TODO: improve this... 234 | CHECK_CXX_COMPILER_FLAG(${opt} ${var}) 235 | 236 | elseif (CMAKE_CXX_COMPILER_ID MATCHES "SunPro") 237 | 238 | message(STATUS "Performing Test ${var}") 239 | execute_process( 240 | COMMAND sh -c "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${opt} -c ${TEST_CXX_FILE} 2>&1" 241 | COMMAND ${GREP_CMD} -i -c -E "illegal value ignored" 242 | RESULT_VARIABLE COMMAND_RESULT 243 | OUTPUT_VARIABLE COMMAND_OUTPUT 244 | OUTPUT_STRIP_TRAILING_WHITESPACE) 245 | 246 | # No dereference below. Thanks for the warning, CMake (not!). 247 | if (COMMAND_RESULT AND NOT COMMAND_OUTPUT) 248 | set(${var} 1 PARENT_SCOPE) 249 | message(STATUS "Performing Test ${var} - Success") 250 | else () 251 | set(${var} 0 PARENT_SCOPE) 252 | message(STATUS "Performing Test ${var} - Failed") 253 | endif () 254 | 255 | # Must use CMAKE_CXX_COMPILER here due to XLC 13.1 and LLVM front-end. 256 | elseif (CMAKE_CXX_COMPILER MATCHES "xlC") 257 | 258 | message(STATUS "Performing Test ${var}") 259 | execute_process( 260 | COMMAND sh -c "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${opt} -c ${TEST_CXX_FILE} 2>&1" 261 | COMMAND ${GREP_CMD} -i -c -E "Unrecognized value" 262 | RESULT_VARIABLE COMMAND_RESULT 263 | OUTPUT_VARIABLE COMMAND_OUTPUT 264 | OUTPUT_STRIP_TRAILING_WHITESPACE) 265 | 266 | # No dereference below. Thanks for the warning, CMake (not!). 267 | if (COMMAND_RESULT AND NOT COMMAND_OUTPUT) 268 | set(${var} 1 PARENT_SCOPE) 269 | message(STATUS "Performing Test ${var} - Success") 270 | else () 271 | set(${var} 0 PARENT_SCOPE) 272 | message(STATUS "Performing Test ${var} - Failed") 273 | endif () 274 | 275 | else () 276 | 277 | CHECK_CXX_COMPILER_FLAG(${opt} ${var}) 278 | 279 | endif () 280 | 281 | endfunction(CheckCompileOption) 282 | 283 | function(CheckCompileLinkOption opt var prog) 284 | 285 | if (MSVC) 286 | 287 | # TODO: improve this... 288 | CHECK_CXX_COMPILER_FLAG(${opt} ${var}) 289 | 290 | elseif (APPLE) 291 | 292 | message(STATUS "Performing Test ${var}") 293 | try_compile(COMMAND_SUCCESS ${CMAKE_BINARY_DIR} ${prog} COMPILE_DEFINITIONS ${opt}) 294 | if (COMMAND_SUCCESS) 295 | set(${var} 1 PARENT_SCOPE) 296 | message(STATUS "Performing Test ${var} - Success") 297 | else () 298 | set(${var} 0 PARENT_SCOPE) 299 | message(STATUS "Performing Test ${var} - Failed") 300 | endif () 301 | 302 | else () 303 | 304 | message(STATUS "Performing Test ${var}") 305 | try_compile(COMMAND_SUCCESS ${CMAKE_BINARY_DIR} ${prog} COMPILE_DEFINITIONS ${opt}) 306 | if (COMMAND_SUCCESS) 307 | set(${var} 1 PARENT_SCOPE) 308 | message(STATUS "Performing Test ${var} - Success") 309 | else () 310 | set(${var} 0 PARENT_SCOPE) 311 | message(STATUS "Performing Test ${var} - Failed") 312 | endif () 313 | 314 | endif () 315 | 316 | endfunction(CheckCompileLinkOption) 317 | 318 | function(AddCompileOption opt) 319 | 320 | if ("${COMMAND_OUTPUT}" NOT STREQUAL "") 321 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "${opt}") 322 | endif () 323 | 324 | endfunction(AddCompileOption) 325 | 326 | ############################################################################### 327 | 328 | function(DumpMachine output pattern) 329 | 330 | if (MSVC) 331 | 332 | # CMake does not provide a generic shell/terminal mechanism 333 | # and Microsoft environments don't know what 'sh' is. 334 | set(${output} 0 PARENT_SCOPE) 335 | 336 | else () 337 | execute_process( 338 | COMMAND sh -c "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 339 | COMMAND ${GREP_CMD} -i -c -E "${pattern}" 340 | OUTPUT_VARIABLE ${output} 341 | OUTPUT_STRIP_TRAILING_WHITESPACE) 342 | set(${output} "${${output}}" PARENT_SCOPE) 343 | endif() 344 | 345 | endfunction(DumpMachine) 346 | 347 | # Thanks to Anonimal for MinGW; see http://github.com/weidai11/cryptopp/issues/466 348 | DumpMachine(CRYPTOPP_AMD64 "(x86_64|AMD64|amd64)") 349 | DumpMachine(CRYPTOPP_I386 "^i.86$") 350 | DumpMachine(CRYPTOPP_MINGW32 "^mingw32") 351 | DumpMachine(CRYPTOPP_MINGW64 "(w64-mingw32|mingw64)") 352 | DumpMachine(CRYPTOPP_ARMV8 "(armv8|arm64|aarch32|aarch64)") 353 | DumpMachine(CRYPTOPP_ARM32 "(arm|armhf|arm7l|eabihf)") 354 | DumpMachine(CRYPTOPP_PPC32 "^(powerpc|ppc)") 355 | DumpMachine(CRYPTOPP_PPC64 "^ppc64") 356 | 357 | # Cleanup 32/64 bit 358 | if (CRYPTOPP_AMD64) 359 | set (CRYPTOPP_I386 0) 360 | endif () 361 | 362 | if (CRYPTOPP_ARMV8) 363 | set (CRYPTOPP_ARM32 0) 364 | endif () 365 | 366 | if (CRYPTOPP_PPC64) 367 | set (CRYPTOPP_PPC32 0) 368 | endif () 369 | 370 | 371 | ############################################################################### 372 | 373 | # Test SunCC for a string like 'CC: Sun C++ 5.13 SunOS_i386' 374 | if (NOT CRYPTOPP_SOLARIS AND NOT MSVC) 375 | execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} -V 2>&1" 376 | COMMAND ${GREP_CMD} -i -c "SunOS" 377 | OUTPUT_VARIABLE CRYPTOPP_SOLARIS 378 | OUTPUT_STRIP_TRAILING_WHITESPACE) 379 | endif () 380 | 381 | # Test GCC for a string like 'i386-pc-solaris2.11' 382 | if (NOT CRYPTOPP_SOLARIS AND NOT MSVC) 383 | execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} -dumpmachine 2>&1" 384 | COMMAND ${GREP_CMD} -i -c "Solaris" 385 | OUTPUT_VARIABLE CRYPTOPP_SOLARIS 386 | OUTPUT_STRIP_TRAILING_WHITESPACE) 387 | endif () 388 | 389 | # Fixup PowerPC. If both 32-bit and 64-bit use 64-bit. 390 | if (CRYPTOPP_PPC32 AND CRYPTOPP_PPC64) 391 | unset(CRYPTOPP_PPC32) 392 | endif () 393 | 394 | # Fixup for xlC compiler. -dumpmachine fails so we miss PowerPC 395 | # TODO: something better than proxying the platform via compiler 396 | # Must use CMAKE_CXX_COMPILER here due to XLC 13.1 and LLVM front-end. 397 | if (CMAKE_CXX_COMPILER MATCHES "xlC") 398 | message ("-- Fixing platform due to IBM xlC") 399 | set(CRYPTOPP_PPC64 1) 400 | endif () 401 | 402 | # DumpMachine SunCC style 403 | if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") 404 | 405 | # SunCC is 32-bit, but it builds both 32 and 64 bit. Use 406 | execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} -V 2>&1" 407 | COMMAND ${GREP_CMD} -i -c "Sparc" 408 | OUTPUT_VARIABLE CRYPTOPP_SPARC 409 | OUTPUT_STRIP_TRAILING_WHITESPACE) 410 | 411 | execute_process(COMMAND sh -c "${CMAKE_CXX_COMPILER} -V 2>&1" 412 | COMMAND ${GREP_CMD} -i -c -E "i386|i86" 413 | OUTPUT_VARIABLE CRYPTOPP_I386 414 | OUTPUT_STRIP_TRAILING_WHITESPACE) 415 | 416 | execute_process(COMMAND isainfo -k 417 | COMMAND ${GREP_CMD} -i -c "i386" 418 | OUTPUT_VARIABLE KERNEL_I386 419 | OUTPUT_STRIP_TRAILING_WHITESPACE) 420 | 421 | execute_process(COMMAND isainfo -k 422 | COMMAND ${GREP_CMD} -i -c "amd64" 423 | OUTPUT_VARIABLE KERNEL_AMD64 424 | OUTPUT_STRIP_TRAILING_WHITESPACE) 425 | 426 | execute_process(COMMAND isainfo -k 427 | COMMAND ${GREP_CMD} -i -c "Sparc" 428 | OUTPUT_VARIABLE KERNEL_SPARC 429 | OUTPUT_STRIP_TRAILING_WHITESPACE) 430 | 431 | execute_process(COMMAND isainfo -k 432 | COMMAND ${GREP_CMD} -i -c -E "UltraSarc|Sparc64|SparcV9" 433 | OUTPUT_VARIABLE KERNEL_SPARC64 434 | OUTPUT_STRIP_TRAILING_WHITESPACE) 435 | 436 | endif () 437 | 438 | ############################################################################### 439 | 440 | # TODO: what about ICC and LLVM on Windows? 441 | if (MSVC) 442 | if (CMAKE_SYSTEM_VERSION MATCHES "10\\.0.*") 443 | # https://docs.microsoft.com/en-us/cpp/porting/modifying-winver-and-win32-winnt 444 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "_WIN32_WINNT=0x0A00") 445 | endif () 446 | # winapifamily.h is missing on AppVeyor machines 447 | INCLUDE (CheckIncludeFiles) 448 | CHECK_INCLUDE_FILES (winapifamily.h HAVE_WINAPIFAMILY_H) 449 | if (HAVE_WINAPIFAMILY_H) 450 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "/FIwinapifamily.h") 451 | endif() 452 | endif () 453 | 454 | # CMake misses a lot of options we use in the Visual Studio project 455 | # and cryptest.nmake. The missing /EHsc and C4530 is baffling... 456 | if (MSVC) 457 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "/Zi") 458 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "/TP") 459 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "/GR") 460 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "/EHsc") 461 | endif () 462 | 463 | # Enable PIC for all target machines except 32-bit i386 due to register pressures. 464 | if (NOT CRYPTOPP_I386) 465 | SET(CMAKE_POSITION_INDEPENDENT_CODE 1) 466 | endif () 467 | 468 | # IBM XLC compiler options for AIX and Linux. 469 | # Must use CMAKE_CXX_COMPILER here due to XLC 13.1 and LLVM front-end. 470 | if (CMAKE_CXX_COMPILER MATCHES "xlC") 471 | 472 | #CheckCompileLinkOption("-qxlcompatmacros" CRYPTOPP_XLC_COMPAT "${TEST_CXX_FILE}") 473 | #if (CRYPTOPP_XLC_COMPAT) 474 | # list(APPEND CRYPTOPP_COMPILE_OPTIONS "-qxlcompatmacros") 475 | #endif () 476 | 477 | CheckCompileLinkOption("-qrtti" CRYPTOPP_PPC_RTTI "${TEST_CXX_FILE}") 478 | if (CRYPTOPP_PPC_RTTI) 479 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-qrtti") 480 | endif () 481 | 482 | CheckCompileLinkOption("-qmaxmem=-1" CRYPTOPP_PPC_MAXMEM "${TEST_CXX_FILE}") 483 | if (CRYPTOPP_PPC_MAXMEM) 484 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-qmaxmem=-1") 485 | endif () 486 | 487 | CheckCompileLinkOption("-qthreaded" CRYPTOPP_PPC_THREADED "${TEST_CXX_FILE}") 488 | if (CRYPTOPP_PPC_THREADED) 489 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-qthreaded") 490 | endif () 491 | endif () 492 | 493 | # Solaris specific 494 | if (CRYPTOPP_SOLARIS) 495 | 496 | # SunCC needs -template=no%extdef 497 | if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") 498 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-template=no%extdef") 499 | endif () 500 | 501 | # SunCC needs -xregs=no%appl on Sparc (not x86) for libraries (not test program) 502 | # TODO: wire this up properly 503 | if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro" AND (CRYPTOPP_SPARC OR CRYPTOPP_SPARC64)) 504 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-xregs=no%appl") 505 | endif () 506 | 507 | # GCC needs to enable use of '/' for division in the assembler 508 | if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") 509 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-Wa,--divide") 510 | endif () 511 | 512 | endif () 513 | 514 | #============================================================================ 515 | # Sources & headers 516 | #============================================================================ 517 | 518 | # Library headers 519 | file(GLOB cryptopp_HEADERS ${CRYPTOPP_PROJECT_DIR}/*.h) 520 | 521 | # Remove headers used to build test suite 522 | list(REMOVE_ITEM cryptopp_HEADERS 523 | ${CRYPTOPP_PROJECT_DIR}/bench.h 524 | ${CRYPTOPP_PROJECT_DIR}/validate.h 525 | ) 526 | 527 | # Test sources. You can use the GNUmakefile to generate the list: `make sources`. 528 | set(cryptopp_SOURCES_TEST 529 | ${CRYPTOPP_PROJECT_DIR}/test.cpp 530 | ${CRYPTOPP_PROJECT_DIR}/bench1.cpp 531 | ${CRYPTOPP_PROJECT_DIR}/bench2.cpp 532 | ${CRYPTOPP_PROJECT_DIR}/bench3.cpp 533 | ${CRYPTOPP_PROJECT_DIR}/validat0.cpp 534 | ${CRYPTOPP_PROJECT_DIR}/validat1.cpp 535 | ${CRYPTOPP_PROJECT_DIR}/validat2.cpp 536 | ${CRYPTOPP_PROJECT_DIR}/validat3.cpp 537 | ${CRYPTOPP_PROJECT_DIR}/validat4.cpp 538 | ${CRYPTOPP_PROJECT_DIR}/validat5.cpp 539 | ${CRYPTOPP_PROJECT_DIR}/validat6.cpp 540 | ${CRYPTOPP_PROJECT_DIR}/validat7.cpp 541 | ${CRYPTOPP_PROJECT_DIR}/validat8.cpp 542 | ${CRYPTOPP_PROJECT_DIR}/validat9.cpp 543 | ${CRYPTOPP_PROJECT_DIR}/validat10.cpp 544 | ${CRYPTOPP_PROJECT_DIR}/regtest1.cpp 545 | ${CRYPTOPP_PROJECT_DIR}/regtest2.cpp 546 | ${CRYPTOPP_PROJECT_DIR}/regtest3.cpp 547 | ${CRYPTOPP_PROJECT_DIR}/regtest4.cpp 548 | ${CRYPTOPP_PROJECT_DIR}/datatest.cpp 549 | ${CRYPTOPP_PROJECT_DIR}/fipsalgt.cpp 550 | ${CRYPTOPP_PROJECT_DIR}/fipstest.cpp 551 | ${CRYPTOPP_PROJECT_DIR}/dlltest.cpp 552 | #${CRYPTOPP_PROJECT_DIR}/adhoc.cpp 553 | ) 554 | 555 | # Library sources. You can use the GNUmakefile to generate the list: `make sources`. 556 | # Makefile sorted them at http://github.com/weidai11/cryptopp/pull/426. 557 | file(GLOB cryptopp_SOURCES ${CRYPTOPP_PROJECT_DIR}/*.cpp) 558 | list(SORT cryptopp_SOURCES) 559 | list(REMOVE_ITEM cryptopp_SOURCES 560 | ${CRYPTOPP_PROJECT_DIR}/cryptlib.cpp 561 | ${CRYPTOPP_PROJECT_DIR}/cpu.cpp 562 | ${CRYPTOPP_PROJECT_DIR}/integer.cpp 563 | ${CRYPTOPP_PROJECT_DIR}/pch.cpp 564 | ${CRYPTOPP_PROJECT_DIR}/simple.cpp 565 | ${CRYPTOPP_PROJECT_DIR}/adhoc.cpp 566 | ${cryptopp_SOURCES_TEST} 567 | ) 568 | set(cryptopp_SOURCES 569 | ${CRYPTOPP_PROJECT_DIR}/cryptlib.cpp 570 | ${CRYPTOPP_PROJECT_DIR}/cpu.cpp 571 | ${CRYPTOPP_PROJECT_DIR}/integer.cpp 572 | ${cryptopp_SOURCES} 573 | ) 574 | 575 | if(ANDROID) 576 | include_directories(${ANDROID_NDK}/sources/android/cpufeatures) 577 | list(APPEND cryptopp_SOURCES ${ANDROID_NDK}/sources/android/cpufeatures/cpu-features.c) 578 | endif() 579 | 580 | set(cryptopp_SOURCES_ASM) 581 | 582 | if (MSVC AND NOT DISABLE_ASM) 583 | if (${CMAKE_GENERATOR} MATCHES ".*ARM") 584 | message(STATUS "Disabling ASM because ARM is specified as target platform.") 585 | else () 586 | enable_language(ASM_MASM) 587 | if (NOT DISABLE_RDRAND) 588 | list(APPEND cryptopp_SOURCES_ASM 589 | ${CRYPTOPP_PROJECT_DIR}/rdrand.asm 590 | ) 591 | endif() 592 | if (NOT DISABLE_RDSEED) 593 | list(APPEND cryptopp_SOURCES_ASM 594 | ${CRYPTOPP_PROJECT_DIR}/rdseed.asm 595 | ) 596 | endif() 597 | if (CMAKE_SIZEOF_VOID_P EQUAL 8) 598 | list(APPEND cryptopp_SOURCES_ASM 599 | ${CRYPTOPP_PROJECT_DIR}/x64dll.asm 600 | ${CRYPTOPP_PROJECT_DIR}/x64masm.asm 601 | ) 602 | set_source_files_properties(${cryptopp_SOURCES_ASM} PROPERTIES COMPILE_DEFINITIONS "_M_X64") 603 | else () 604 | set_source_files_properties(${cryptopp_SOURCES_ASM} PROPERTIES COMPILE_DEFINITIONS "_M_X86" COMPILE_FLAGS "/safeseh") 605 | endif () 606 | set_source_files_properties(${cryptopp_SOURCES_ASM} PROPERTIES LANGUAGE ASM_MASM) 607 | endif () 608 | endif () 609 | 610 | #============================================================================ 611 | # Architecture flags 612 | #============================================================================ 613 | 614 | # TODO: Android, AIX, IBM xlC, iOS and a few other profiles are missing. 615 | 616 | # New as of Pull Request 461, http://github.com/weidai11/cryptopp/pull/461. 617 | # Must use CMAKE_CXX_COMPILER here due to XLC 13.1 and LLVM front-end. 618 | if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Intel" OR CMAKE_CXX_COMPILER MATCHES "xlC") 619 | 620 | if (CRYPTOPP_AMD64 OR CRYPTOPP_I386) 621 | 622 | # For Darwin and a GCC port compiler, we need to check for -Wa,-q first. -Wa,-q 623 | # is a GCC option, and it tells GCC to use the Clang Integrated Assembler. We 624 | # need LLVM's assembler because GAS is too old on Apple platforms. GAS will 625 | # not assemble modern ISA, like AVX or AVX2. 626 | if (CMAKE_SYSTEM_NAME STREQUAL "Darwin") 627 | CheckCompileLinkOption("-Wa,-q" CRYPTOPP_X86_WAQ 628 | "${TEST_PROG_DIR}/test_x86_sse2.cpp") 629 | 630 | if (CRYPTOPP_X86_WAQ) 631 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-Wa,-q") 632 | endif () 633 | endif () 634 | 635 | # Now we can move on to normal feature testing. 636 | CheckCompileLinkOption("-msse2" CRYPTOPP_X86_SSE2 637 | "${TEST_PROG_DIR}/test_x86_sse2.cpp") 638 | CheckCompileLinkOption("-mssse3" CRYPTOPP_X86_SSSE3 639 | "${TEST_PROG_DIR}/test_x86_ssse3.cpp") 640 | CheckCompileLinkOption("-msse4.1" CRYPTOPP_X86_SSE41 641 | "${TEST_PROG_DIR}/test_x86_sse41.cpp") 642 | CheckCompileLinkOption("-msse4.2" CRYPTOPP_X86_SSE42 643 | "${TEST_PROG_DIR}/test_x86_sse42.cpp") 644 | CheckCompileLinkOption("-mssse3 -mpclmul" CRYPTOPP_X86_CLMUL 645 | "${TEST_PROG_DIR}/test_x86_clmul.cpp") 646 | CheckCompileLinkOption("-msse4.1 -maes" CRYPTOPP_X86_AES 647 | "${TEST_PROG_DIR}/test_x86_aes.cpp") 648 | CheckCompileLinkOption("-mavx" CRYPTOPP_X86_AVX 649 | "${TEST_PROG_DIR}/test_x86_avx.cpp") 650 | CheckCompileLinkOption("-mavx2" CRYPTOPP_X86_AVX2 651 | "${TEST_PROG_DIR}/test_x86_avx2.cpp") 652 | CheckCompileLinkOption("-msse4.2 -msha" CRYPTOPP_X86_SHA 653 | "${TEST_PROG_DIR}/test_x86_sha.cpp") 654 | if (EXISTS "${TEST_PROG_DIR}/test_asm_mixed.cpp") 655 | CheckCompileLinkOption("" CRYPTOPP_MIXED_ASM 656 | "${TEST_PROG_DIR}/test_asm_mixed.cpp") 657 | else () 658 | CheckCompileLinkOption("" CRYPTOPP_MIXED_ASM 659 | "${TEST_PROG_DIR}/test_mixed_asm.cpp") 660 | endif () 661 | 662 | # https://github.com/weidai11/cryptopp/issues/756 663 | if (NOT CRYPTOPP_MIXED_ASM) 664 | list(APPEND CRYPTOPP_COMPILE_OPTIONS "-DCRYPTOPP_DISABLE_MIXED_ASM") 665 | endif () 666 | 667 | if (NOT CRYPTOPP_X86_SSE2 AND NOT DISABLE_ASM) 668 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ASM") 669 | elseif (CRYPTOPP_X86_SSE2 AND NOT DISABLE_ASM) 670 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sse_simd.cpp PROPERTIES COMPILE_FLAGS "-msse2") 671 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/chacha_simd.cpp PROPERTIES COMPILE_FLAGS "-msse2") 672 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/donna_sse.cpp PROPERTIES COMPILE_FLAGS "-msse2") 673 | endif () 674 | if (NOT CRYPTOPP_X86_SSSE3 AND NOT DISABLE_SSSE3) 675 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_SSSE3") 676 | elseif (CRYPTOPP_X86_SSSE3 AND NOT DISABLE_SSSE3) 677 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aria_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 678 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/cham_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 679 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/keccak_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 680 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lea_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 681 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lsh256_sse.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 682 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lsh512_sse.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 683 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/simon128_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 684 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/speck128_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3") 685 | if (NOT CRYPTOPP_X86_SSE41 AND NOT DISABLE_SSE4) 686 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_SSE4") 687 | elseif (CRYPTOPP_X86_SSE41 AND NOT DISABLE_SSE4) 688 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2s_simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.1") 689 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2b_simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.1") 690 | endif () 691 | if (NOT CRYPTOPP_X86_SSE42 AND NOT DISABLE_SSE4) 692 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_SSE4") 693 | elseif (CRYPTOPP_X86_SSE42 AND NOT DISABLE_SSE4) 694 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/crc_simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.2") 695 | if (NOT CRYPTOPP_X86_CLMUL AND NOT DISABLE_CLMUL) 696 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_CLMUL") 697 | elseif (CRYPTOPP_X86_CLMUL AND NOT DISABLE_CLMUL) 698 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gcm_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3 -mpclmul") 699 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gf2n_simd.cpp PROPERTIES COMPILE_FLAGS "-mpclmul") 700 | endif () 701 | if (NOT CRYPTOPP_X86_AES AND NOT DISABLE_AES) 702 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_AESNI") 703 | elseif (CRYPTOPP_X86_AES AND NOT DISABLE_AES) 704 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/rijndael_simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.1 -maes") 705 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sm4_simd.cpp PROPERTIES COMPILE_FLAGS "-mssse3 -maes") 706 | endif () 707 | if (NOT CRYPTOPP_X86_AVX2 AND NOT DISABLE_AVX2) 708 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_AVX2") 709 | elseif (CRYPTOPP_X86_AVX2 AND NOT DISABLE_AVX2) 710 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/chacha_avx.cpp PROPERTIES COMPILE_FLAGS "-mavx2") 711 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lsh256_avx.cpp PROPERTIES COMPILE_FLAGS "-mavx2") 712 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lsh512_avx.cpp PROPERTIES COMPILE_FLAGS "-mavx2") 713 | endif () 714 | if (NOT CRYPTOPP_X86_SHA AND NOT DISABLE_SHA) 715 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_SHANI") 716 | elseif (CRYPTOPP_X86_SHA AND NOT DISABLE_SHA) 717 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha_simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.2 -msha") 718 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/shacal2_simd.cpp PROPERTIES COMPILE_FLAGS "-msse4.2 -msha") 719 | endif () 720 | endif () 721 | endif () 722 | 723 | elseif (CRYPTOPP_ARMV8) 724 | 725 | # This checks for 726 | CheckCompileLinkOption("-march=armv8-a" CRYPTOPP_ARM_ACLE_HEADER 727 | "${TEST_PROG_DIR}/test_arm_acle_header.cpp") 728 | 729 | # Use if available 730 | if (CRYPTOPP_ARM_NEON_HEADER) 731 | CheckCompileOption("-march=armv8-a -DCRYPTOPP_ARM_ACLE_HEADER=1" CRYPTOPP_ARMV8A_ASIMD) 732 | CheckCompileOption("-march=armv8-a+crc -DCRYPTOPP_ARM_ACLE_HEADER=1" CRYPTOPP_ARMV8A_CRC) 733 | CheckCompileOption("-march=armv8-a+crypto -DCRYPTOPP_ARM_ACLE_HEADER=1" CRYPTOPP_ARMV8A_CRYPTO) 734 | else () 735 | CheckCompileOption("-march=armv8-a" CRYPTOPP_ARMV8A_ASIMD) 736 | CheckCompileOption("-march=armv8-a+crc" CRYPTOPP_ARMV8A_CRC) 737 | CheckCompileOption("-march=armv8-a+crypto" CRYPTOPP_ARMV8A_CRYPTO) 738 | endif () 739 | 740 | if (CRYPTOPP_ARMV8A_ASIMD) 741 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aria_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 742 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2s_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 743 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2b_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 744 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/chacha_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 745 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/cham_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 746 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lea_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 747 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/neon_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 748 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/simon128_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 749 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/speck128_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a") 750 | else () 751 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ARM_ASIMD") 752 | endif () 753 | if (CRYPTOPP_ARMV8A_CRC) 754 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/crc_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crc") 755 | else () 756 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ARM_CRC32") 757 | endif () 758 | if (CRYPTOPP_ARMV8A_CRYPTO) 759 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gcm_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto") 760 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gf2n_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto") 761 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/rijndael_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto") 762 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto") 763 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/shacal2_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv8-a+crypto") 764 | else () 765 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ARM_AES") 766 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ARM_PMULL") 767 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ARM_SHA") 768 | endif () 769 | 770 | elseif (CRYPTOPP_ARM32) 771 | 772 | # This checks for 773 | CheckCompileLinkOption("-march=armv7-a -mfpu=neon" CRYPTOPP_ARM_NEON_HEADER 774 | "${TEST_PROG_DIR}/test_arm_neon_header.cpp") 775 | 776 | # Use if available 777 | if (CRYPTOPP_ARM_NEON_HEADER) 778 | CheckCompileLinkOption("-march=armv7-a -mfpu=neon -DCRYPTOPP_ARM_NEON_HEADER=1" CRYPTOPP_ARMV7A_NEON 779 | "${TEST_PROG_DIR}/test_arm_neon.cpp") 780 | else () 781 | CheckCompileLinkOption("-march=armv7-a -mfpu=neon" CRYPTOPP_ARMV7A_NEON 782 | "${TEST_PROG_DIR}/test_arm_neon.cpp") 783 | endif () 784 | 785 | if (CRYPTOPP_ARM32) 786 | 787 | # Add Cryptogams ASM files for ARM on Linux. Linux is required due to GNU Assembler. 788 | # AES requires -mthumb under Clang. Do not add -mthumb for SHA for any files. 789 | if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR CMAKE_SYSTEM_NAME STREQUAL "Android") 790 | list(APPEND cryptopp_SOURCES ${CRYPTOPP_PROJECT_DIR}/aes_armv4.S) 791 | list(APPEND cryptopp_SOURCES ${CRYPTOPP_PROJECT_DIR}/sha1_armv4.S) 792 | list(APPEND cryptopp_SOURCES ${CRYPTOPP_PROJECT_DIR}/sha256_armv4.S) 793 | list(APPEND cryptopp_SOURCES ${CRYPTOPP_PROJECT_DIR}/sha512_armv4.S) 794 | 795 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aes_armv4.S PROPERTIES LANGUAGE CXX) 796 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha1_armv4.S PROPERTIES LANGUAGE CXX) 797 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha256_armv4.S PROPERTIES LANGUAGE CXX) 798 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha512_armv4.S PROPERTIES LANGUAGE CXX) 799 | 800 | endif () 801 | 802 | if (CRYPTOPP_ARMV7A_NEON) 803 | 804 | if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") 805 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aes_armv4.S PROPERTIES COMPILE_FLAGS "-march=armv7-a -mthumb -mfpu=neon -Wa,--noexecstack") 806 | else () 807 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aes_armv4.S PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon -Wa,--noexecstack") 808 | endif () 809 | 810 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha1_armv4.S PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon -Wa,--noexecstack") 811 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha256_armv4.S PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon -Wa,--noexecstack") 812 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha512_armv4.S PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon -Wa,--noexecstack") 813 | endif () 814 | 815 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aria_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 816 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2s_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 817 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2b_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 818 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/chacha_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 819 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/cham_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 820 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/crc_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 821 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lea_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 822 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gcm_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 823 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/rijndael_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 824 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/neon_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 825 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 826 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/simon128_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 827 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/speck128_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 828 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sm4_simd.cpp PROPERTIES COMPILE_FLAGS "-march=armv7-a -mfpu=neon") 829 | else () 830 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ARM_NEON") 831 | endif () 832 | 833 | elseif (CRYPTOPP_PPC32 OR CRYPTOPP_PPC64) 834 | 835 | # XLC requires -qaltivec in addition to Arch or CPU option 836 | # Disable POWER9 due to https://github.com/weidai11/cryptopp/issues/986. 837 | if (CMAKE_CXX_COMPILER MATCHES "xlC") 838 | set(CRYPTOPP_ALTIVEC_FLAGS "-qaltivec") 839 | set(CRYPTOPP_POWER4_FLAGS "-qarch=pwr4 -qaltivec") 840 | set(CRYPTOPP_POWER5_FLAGS "-qarch=pwr5 -qaltivec") 841 | set(CRYPTOPP_POWER6_FLAGS "-qarch=pwr6 -qaltivec") 842 | set(CRYPTOPP_POWER7_VSX_FLAG "-qarch=pwr7 -qvsx -qaltivec") 843 | set(CRYPTOPP_POWER7_PWR_FLAGS "-qarch=pwr7 -qaltivec") 844 | set(CRYPTOPP_POWER8_FLAGS "-qarch=pwr8 -qaltivec") 845 | #set(CRYPTOPP_POWER9_FLAGS "-qarch=pwr9 -qaltivec") 846 | else () 847 | set(CRYPTOPP_ALTIVEC_FLAGS "-maltivec") 848 | set(CRYPTOPP_POWER7_VSX_FLAGS "-mcpu=power7 -mvsx") 849 | set(CRYPTOPP_POWER7_PWR_FLAGS "-mcpu=power7") 850 | set(CRYPTOPP_POWER8_FLAGS "-mcpu=power8") 851 | #set(CRYPTOPP_POWER9_FLAGS "-mcpu=power9") 852 | endif () 853 | 854 | CheckCompileLinkOption("${CRYPTOPP_ALTIVEC_FLAGS}" PPC_ALTIVEC_FLAG 855 | "${TEST_PROG_DIR}/test_ppc_altivec.cpp") 856 | 857 | # Hack for XLC. Find the lowest PWR architecture. 858 | if (CMAKE_CXX_COMPILER MATCHES "xlC") 859 | if (NOT PPC_ALTIVEC_FLAG) 860 | CheckCompileLinkOption("${CRYPTOPP_POWER4_FLAGS}" PPC_POWER4_FLAG 861 | "${TEST_PROG_DIR}/test_ppc_altivec.cpp") 862 | if (PPC_POWER4_FLAG) 863 | set(PPC_ALTIVEC_FLAG 1) 864 | set(CRYPTOPP_ALTIVEC_FLAGS "${CRYPTOPP_POWER4_FLAGS}") 865 | endif () 866 | endif () 867 | if (NOT PPC_ALTIVEC_FLAG) 868 | CheckCompileLinkOption("${CRYPTOPP_POWER5_FLAGS}" PPC_POWER5_FLAG 869 | "${TEST_PROG_DIR}/test_ppc_altivec.cpp") 870 | if (PPC_POWER5_FLAG) 871 | set(PPC_ALTIVEC_FLAG 1) 872 | set(CRYPTOPP_ALTIVEC_FLAGS "${CRYPTOPP_POWER5_FLAGS}") 873 | endif () 874 | endif () 875 | if (NOT PPC_ALTIVEC_FLAG) 876 | CheckCompileLinkOption("${CRYPTOPP_POWER6_FLAGS}" PPC_POWER6_FLAG 877 | "${TEST_PROG_DIR}/test_ppc_altivec.cpp") 878 | if (PPC_POWER6_FLAG) 879 | set(PPC_ALTIVEC_FLAG 1) 880 | set(CRYPTOPP_ALTIVEC_FLAGS "${CRYPTOPP_POWER6_FLAGS}") 881 | endif () 882 | endif () 883 | endif () 884 | 885 | # Hack for XLC and GCC. Find the right combination for PWR7 and the VSX unit. 886 | CheckCompileLinkOption("${CRYPTOPP_POWER7_VSX_FLAGS}" PPC_POWER7_FLAG 887 | "${TEST_PROG_DIR}/test_ppc_power7.cpp") 888 | if (PPC_POWER7_FLAG) 889 | set (CRYPTOPP_POWER7_FLAGS "${CRYPTOPP_POWER7_VSX_FLAGS}") 890 | else () 891 | CheckCompileLinkOption("${CRYPTOPP_POWER7_PWR_FLAGS}" PPC_POWER7_FLAG 892 | "${TEST_PROG_DIR}/test_ppc_power7.cpp") 893 | if (PPC_POWER7_FLAG) 894 | set (CRYPTOPP_POWER7_FLAGS "${CRYPTOPP_POWER7_PWR_FLAGS}") 895 | endif () 896 | endif () 897 | 898 | CheckCompileLinkOption("${CRYPTOPP_POWER8_FLAGS}" PPC_POWER8_FLAG 899 | "${TEST_PROG_DIR}/test_ppc_power8.cpp") 900 | 901 | # Disable POWER9 due to https://github.com/weidai11/cryptopp/issues/986. 902 | #CheckCompileLinkOption("${CRYPTOPP_POWER9_FLAGS}" PPC_POWER9_FLAG 903 | # "${TEST_PROG_DIR}/test_ppc_power9.cpp") 904 | 905 | if (PPC_POWER8_FLAG AND NOT DISABLE_POWER8) 906 | #set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aria_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 907 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2b_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 908 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/cham_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 909 | #set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/crc_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 910 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gcm_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 911 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gf2n_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 912 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lea_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 913 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/rijndael_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 914 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 915 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/shacal2_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 916 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/simon128_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 917 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/speck128_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_POWER8_FLAGS}) 918 | endif () 919 | 920 | if (PPC_ALTIVEC_FLAG AND NOT DISABLE_ALTIVEC) 921 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/ppc_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_ALTIVEC_FLAGS}) 922 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2s_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_ALTIVEC_FLAGS}) 923 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/chacha_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_ALTIVEC_FLAGS}) 924 | endif () 925 | 926 | # Drop to Altivec if Power8 unavailable 927 | if (NOT PPC_POWER8_FLAG) 928 | if (PPC_ALTIVEC_FLAG) 929 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gcm_simd.cpp PROPERTIES COMPILE_FLAGS ${CRYPTOPP_ALTIVEC_FLAGS}) 930 | endif () 931 | endif () 932 | 933 | if (NOT PPC_ALTIVEC_FLAG) 934 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_ALTIVEC") 935 | elseif (NOT PPC_POWER7_FLAG) 936 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_POWER7") 937 | elseif (NOT PPC_POWER8_FLAG) 938 | list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_POWER8") 939 | #elseif (NOT PPC_POWER9_FLAG) 940 | # list(APPEND CRYPTOPP_COMPILE_DEFINITIONS "-DCRYPTOPP_DISABLE_POWER9") 941 | endif () 942 | 943 | endif () 944 | endif () 945 | 946 | # New as of Pull Request 461, http://github.com/weidai11/cryptopp/pull/461. 947 | if (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro") 948 | 949 | if (CRYPTOPP_AMD64 OR CRYPTOPP_I386) 950 | 951 | CheckCompileLinkOption("-xarch=sse2" CRYPTOPP_X86_SSE2 952 | "${TEST_PROG_DIR}/test_x86_sse2.cpp") 953 | CheckCompileLinkOption("-xarch=ssse3" CRYPTOPP_X86_SSSE3 954 | "${TEST_PROG_DIR}/test_x86_ssse3.cpp") 955 | CheckCompileLinkOption("-xarch=sse4_1" CRYPTOPP_X86_SSE41 956 | "${TEST_PROG_DIR}/test_x86_sse41.cpp") 957 | CheckCompileLinkOption("-xarch=sse4_2" CRYPTOPP_X86_SSE42 958 | "${TEST_PROG_DIR}/test_x86_sse42.cpp") 959 | CheckCompileLinkOption("-xarch=aes" CRYPTOPP_X86_CLMUL 960 | "${TEST_PROG_DIR}/test_x86_clmul.cpp") 961 | CheckCompileLinkOption("-xarch=aes" CRYPTOPP_X86_AES 962 | "${TEST_PROG_DIR}/test_x86_aes.cpp") 963 | CheckCompileLinkOption("-xarch=avx" CRYPTOPP_X86_AVX 964 | "${TEST_PROG_DIR}/test_x86_avx.cpp") 965 | CheckCompileLinkOption("-xarch=avx2" CRYPTOPP_X86_AVX2 966 | "${TEST_PROG_DIR}/test_x86_avx2.cpp") 967 | CheckCompileLinkOption("-xarch=sha" CRYPTOPP_X86_SHA 968 | "${TEST_PROG_DIR}/test_x86_sha.cpp") 969 | 970 | # Each -xarch=XXX options must be added to LDFLAGS if the option is used during a compile. 971 | set(XARCH_LDFLAGS "") 972 | 973 | if (CRYPTOPP_X86_SSE2 AND NOT DISABLE_ASM) 974 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sse_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sse2") 975 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/chacha_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sse2") 976 | set(XARCH_LDFLAGS "-xarch=sse2") 977 | endif () 978 | if (CRYPTOPP_X86_SSSE3 AND NOT DISABLE_SSSE3) 979 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/aria_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=ssse3") 980 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/cham_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=ssse3") 981 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/lea_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=ssse3") 982 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/simon128_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=ssse3") 983 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/speck128_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=ssse3") 984 | set(XARCH_LDFLAGS "${XARCH_LDFLAGS} -xarch=ssse3") 985 | if (CRYPTOPP_X86_SSE41 AND NOT DISABLE_SSE4) 986 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2s_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sse4_1") 987 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/blake2b_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sse4_1") 988 | set(XARCH_LDFLAGS "${XARCH_LDFLAGS} -xarch=sse4_1") 989 | endif () 990 | if (CRYPTOPP_X86_SSE42 AND NOT DISABLE_SSE4) 991 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/crc_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sse4_2") 992 | set(XARCH_LDFLAGS "${XARCH_LDFLAGS} -xarch=sse4_2") 993 | if (CRYPTOPP_X86_CLMUL AND NOT DISABLE_CLMUL) 994 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gcm_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=aes") 995 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/gf2n_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=aes") 996 | endif () 997 | if (CRYPTOPP_X86_AES AND NOT DISABLE_AES) 998 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/rijndael_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=aes") 999 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sm4_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=aes") 1000 | set(XARCH_LDFLAGS "${XARCH_LDFLAGS} -xarch=aes") 1001 | endif () 1002 | #if (CRYPTOPP_X86_AVX AND NOT DISABLE_AVX) 1003 | # set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/XXX_avx.cpp PROPERTIES COMPILE_FLAGS "-xarch=avx2") 1004 | # set(XARCH_LDFLAGS "${XARCH_LDFLAGS} -xarch=avx") 1005 | #endif () 1006 | if (CRYPTOPP_X86_AVX2 AND NOT DISABLE_AVX2) 1007 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/chacha_avx.cpp PROPERTIES COMPILE_FLAGS "-xarch=avx2") 1008 | set(XARCH_LDFLAGS "${XARCH_LDFLAGS} -xarch=avx2") 1009 | endif () 1010 | if (CRYPTOPP_X86_SHA AND NOT DISABLE_SHA) 1011 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/sha_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sha") 1012 | set_source_files_properties(${CRYPTOPP_PROJECT_DIR}/shacal2_simd.cpp PROPERTIES COMPILE_FLAGS "-xarch=sha") 1013 | set(XARCH_LDFLAGS "${XARCH_LDFLAGS} -xarch=sha") 1014 | endif () 1015 | endif () 1016 | endif () 1017 | 1018 | # https://stackoverflow.com/a/6088646/608639 1019 | set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${XARCH_LDFLAGS} -M${CRYPTOPP_PROJECT_DIR}/cryptopp.mapfile") 1020 | set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${XARCH_LDFLAGS} -M${CRYPTOPP_PROJECT_DIR}/cryptopp.mapfile") 1021 | set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${XARCH_LDFLAGS} -M${CRYPTOPP_PROJECT_DIR}/cryptopp.mapfile") 1022 | 1023 | # elseif (CRYPTOPP_SPARC OR CRYPTOPP_SPARC64) 1024 | 1025 | endif () 1026 | endif () 1027 | 1028 | #============================================================================ 1029 | # Compiler flags 1030 | #============================================================================ 1031 | 1032 | # add_compile_definitions added in CMake 3.12 1033 | if (${CMAKE_VERSION} VERSION_LESS "3.12") 1034 | # https://stackoverflow.com/q/61250087 1035 | add_definitions(${CMAKE_CPP_FLAGS} ${CRYPTOPP_COMPILE_DEFINITIONS} ${CRYPTOPP_COMPILE_OPTIONS}) 1036 | else() 1037 | # Fucking CMake blows. It does not honor add_compile_definitions. 1038 | add_compile_definitions(${CMAKE_CPP_FLAGS} ${CRYPTOPP_COMPILE_DEFINITIONS}) 1039 | add_compile_options(${CMAKE_CXX_FLAGS} ${CRYPTOPP_COMPILE_DEFINITIONS} ${CRYPTOPP_COMPILE_OPTIONS}) 1040 | endif() 1041 | 1042 | #============================================================================ 1043 | # Compile targets 1044 | #============================================================================ 1045 | 1046 | # Work around the archaic versions of cmake that do not support 1047 | # target_compile_xxxx commands 1048 | # !!! DO NOT try to use the old way for newer version - it does not work !!! 1049 | function(cryptopp_target_compile_properties target) 1050 | # CMake >= 2.8.12 1051 | if (NOT ${CMAKE_VERSION} VERSION_LESS "2.8.12") 1052 | SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CRYPTOPP_COMPILE_OPTIONS}") 1053 | else() 1054 | string (REPLACE ";" " " PROP_STR "${CRYPTOPP_COMPILE_OPTIONS}") 1055 | set_target_properties(${target} PROPERTIES COMPILE_FLAGS "${PROP_STR}") 1056 | endif() 1057 | # CMake >= 2.8.11 1058 | if (NOT ${CMAKE_VERSION} VERSION_LESS "2.8.11") 1059 | target_compile_definitions(${target} PUBLIC ${CRYPTOPP_COMPILE_DEFINITIONS}) 1060 | else() 1061 | string (REPLACE ";" " " PROP_STR "${CRYPTOPP_COMPILE_DEFINITIONS}") 1062 | set_target_properties(${target} PROPERTIES COMPILE_DEFINITIONS "${CRYPTOPP_COMPILE_DEFINITIONS}") 1063 | endif() 1064 | endfunction() 1065 | 1066 | set(cryptopp_LIBRARY_SOURCES ${cryptopp_SOURCES_ASM}) 1067 | if (USE_INTERMEDIATE_OBJECTS_TARGET AND NOT ${CMAKE_VERSION} VERSION_LESS "2.8.8") 1068 | add_library(cryptopp-object OBJECT ${cryptopp_SOURCES}) 1069 | cryptopp_target_compile_properties(cryptopp-object) 1070 | 1071 | list(APPEND cryptopp_LIBRARY_SOURCES 1072 | $ 1073 | ) 1074 | else () 1075 | list(APPEND cryptopp_LIBRARY_SOURCES 1076 | ${cryptopp_SOURCES} 1077 | ) 1078 | endif () 1079 | 1080 | if (BUILD_STATIC) 1081 | add_library(cryptopp-static STATIC ${cryptopp_LIBRARY_SOURCES}) 1082 | cryptopp_target_compile_properties(cryptopp-static) 1083 | # CMake >= 2.8.11 1084 | if (NOT ${CMAKE_VERSION} VERSION_LESS "2.8.11") 1085 | target_include_directories(cryptopp-static PUBLIC $ $) 1086 | else () 1087 | set_target_properties(cryptopp-static PROPERTIES INCLUDE_DIRECTORIES "$ $") 1088 | endif () 1089 | endif () 1090 | 1091 | if (BUILD_SHARED) 1092 | add_library(cryptopp-shared SHARED ${cryptopp_LIBRARY_SOURCES}) 1093 | cryptopp_target_compile_properties(cryptopp-shared) 1094 | if (NOT ${CMAKE_VERSION} VERSION_LESS "2.8.11") 1095 | target_include_directories(cryptopp-shared PUBLIC $ $) 1096 | else () 1097 | set_target_properties(cryptopp-shared PROPERTIES INCLUDE_DIRECTORIES "$ $") 1098 | endif () 1099 | endif () 1100 | 1101 | # Set filenames for targets to be "cryptopp" 1102 | if (NOT MSVC) 1103 | set(COMPAT_VERSION ${cryptopp_VERSION_MAJOR}.${cryptopp_VERSION_MINOR}) 1104 | 1105 | if (BUILD_STATIC) 1106 | set_target_properties(cryptopp-static 1107 | PROPERTIES 1108 | OUTPUT_NAME cryptopp) 1109 | endif () 1110 | if (BUILD_SHARED) 1111 | set_target_properties(cryptopp-shared 1112 | PROPERTIES 1113 | SOVERSION ${COMPAT_VERSION} 1114 | OUTPUT_NAME cryptopp) 1115 | endif () 1116 | endif () 1117 | 1118 | # Add alternate ways to invoke the build for the shared library that are 1119 | # similar to how the crypto++ 'make' tool works. 1120 | # see https://github.com/noloader/cryptopp-cmake/issues/32 1121 | if (BUILD_STATIC) 1122 | add_custom_target(static DEPENDS cryptopp-static) 1123 | endif () 1124 | if (BUILD_SHARED) 1125 | add_custom_target(shared DEPENDS cryptopp-shared) 1126 | add_custom_target(dynamic DEPENDS cryptopp-shared) 1127 | endif () 1128 | 1129 | #============================================================================ 1130 | # Third-party libraries 1131 | #============================================================================ 1132 | 1133 | # CMake links to a lot of libraries we don't need in Windows, like user32.lib 1134 | # gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib 1135 | if (WIN32) 1136 | if (BUILD_STATIC) 1137 | target_link_libraries(cryptopp-static kernel32) 1138 | endif () 1139 | if (BUILD_SHARED) 1140 | target_link_libraries(cryptopp-shared kernel32) 1141 | endif () 1142 | endif () 1143 | 1144 | find_package(Threads) 1145 | if (BUILD_STATIC) 1146 | target_link_libraries(cryptopp-static ${CMAKE_THREAD_LIBS_INIT}) 1147 | endif () 1148 | if (BUILD_SHARED) 1149 | target_link_libraries(cryptopp-shared ${CMAKE_THREAD_LIBS_INIT}) 1150 | endif () 1151 | 1152 | 1153 | #============================================================================ 1154 | # Setup OpenMP 1155 | #============================================================================ 1156 | if (${CMAKE_VERSION} VERSION_GREATER "3.1" AND USE_OPENMP) 1157 | find_package(OpenMP) 1158 | 1159 | if (OPENMP_FOUND OR OPENMP_CXX_FOUND) 1160 | message(STATUS "OpenMP: Found libomp without any special flags") 1161 | endif() 1162 | 1163 | # If OpenMP wasn't found, try if we can find it in the default Macports location 1164 | if((NOT OPENMP_FOUND) AND (NOT OPENMP_CXX_FOUND) AND EXISTS "/opt/local/lib/libomp/libomp.dylib") # older cmake uses OPENMP_FOUND, newer cmake also sets OPENMP_CXX_FOUND, homebrew installations seem only to get the latter set. 1165 | set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -I/opt/local/include/libomp/") 1166 | set(OpenMP_CXX_LIB_NAMES omp) 1167 | set(OpenMP_omp_LIBRARY /opt/local/lib/libomp/libomp.dylib) 1168 | 1169 | find_package(OpenMP) 1170 | if (OPENMP_FOUND OR OPENMP_CXX_FOUND) 1171 | message(STATUS "OpenMP: Found libomp in macports default location.") 1172 | else() 1173 | message(FATAL_ERROR "OpenMP: Didn't find libomp. Tried macports default location but also didn't find it.") 1174 | endif() 1175 | endif() 1176 | 1177 | # If OpenMP wasn't found, try if we can find it in the default Homebrew location 1178 | if((NOT OPENMP_FOUND) AND (NOT OPENMP_CXX_FOUND) AND EXISTS "/usr/local/opt/libomp/lib/libomp.dylib") 1179 | set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -I/usr/local/opt/libomp/include") 1180 | set(OpenMP_CXX_LIB_NAMES omp) 1181 | set(OpenMP_omp_LIBRARY /usr/local/opt/libomp/lib/libomp.dylib) 1182 | 1183 | find_package(OpenMP) 1184 | if (OPENMP_FOUND OR OPENMP_CXX_FOUND) 1185 | message(STATUS "OpenMP: Found libomp in homebrew default location.") 1186 | else() 1187 | message(FATAL_ERROR "OpenMP: Didn't find libomp. Tried homebrew default location but also didn't find it.") 1188 | endif() 1189 | endif() 1190 | 1191 | set(Additional_OpenMP_Libraries_Workaround "") 1192 | 1193 | # Workaround because older cmake on apple doesn't support FindOpenMP 1194 | if((NOT OPENMP_FOUND) AND (NOT OPENMP_CXX_FOUND)) 1195 | if((APPLE AND ((CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang"))) 1196 | AND ((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0") AND (CMAKE_VERSION VERSION_LESS "3.12.0"))) 1197 | message(STATUS "OpenMP: Applying workaround for OSX OpenMP with old cmake that doesn't have FindOpenMP") 1198 | set(OpenMP_CXX_FLAGS "-Xclang -fopenmp") 1199 | set(Additional_OpenMP_Libraries_Workaround "-lomp") 1200 | else() 1201 | message(FATAL_ERROR "OpenMP: Did not find OpenMP. Build without USE_OPENMP if you want to allow this.") 1202 | endif() 1203 | endif() 1204 | 1205 | if(NOT TARGET OpenMP::OpenMP_CXX) 1206 | # We're on cmake < 3.9, handle behavior of the old FindOpenMP implementation 1207 | message(STATUS "OpenMP: Applying workaround for old CMake that doesn't define FindOpenMP using targets") 1208 | add_library(OpenMP_TARGET INTERFACE) 1209 | add_library(OpenMP::OpenMP_CXX ALIAS OpenMP_TARGET) 1210 | target_compile_options(OpenMP_TARGET INTERFACE ${OpenMP_CXX_FLAGS}) # add to all targets depending on this 1211 | find_package(Threads REQUIRED) 1212 | target_link_libraries(OpenMP_TARGET INTERFACE Threads::Threads) 1213 | target_link_libraries(OpenMP_TARGET INTERFACE ${OpenMP_CXX_FLAGS} ${Additional_OpenMP_Libraries_Workaround}) 1214 | endif() 1215 | 1216 | if (BUILD_STATIC) 1217 | target_link_libraries(cryptopp-static ${OpenMP_CXX_FLAGS}) # Workaround for Ubuntu 18.04 that otherwise doesn't set -fopenmp for linking 1218 | target_link_libraries(cryptopp-static OpenMP::OpenMP_CXX) 1219 | endif() 1220 | if (BUILD_SHARED) 1221 | target_link_libraries(cryptopp-shared ${OpenMP_CXX_FLAGS}) # Workaround for Ubuntu 18.04 that otherwise doesn't set -fopenmp for linking 1222 | target_link_libraries(cryptopp-shared OpenMP::OpenMP_CXX) 1223 | endif() 1224 | endif() 1225 | 1226 | #============================================================================ 1227 | # Tests 1228 | #============================================================================ 1229 | 1230 | enable_testing() 1231 | if (BUILD_TESTING) 1232 | add_executable(cryptest ${cryptopp_SOURCES_TEST}) 1233 | target_link_libraries(cryptest cryptopp-static) 1234 | 1235 | # Setting "cryptest" binary name to "cryptest.exe" 1236 | if (NOT (WIN32 OR CYGWIN)) 1237 | set_target_properties(cryptest PROPERTIES OUTPUT_NAME cryptest.exe) 1238 | endif () 1239 | if (NOT TARGET cryptest.exe) 1240 | add_custom_target(cryptest.exe) 1241 | add_dependencies(cryptest.exe cryptest) 1242 | endif () 1243 | 1244 | file(COPY ${CRYPTOPP_PROJECT_DIR}/TestData DESTINATION ${PROJECT_BINARY_DIR}) 1245 | file(COPY ${CRYPTOPP_PROJECT_DIR}/TestVectors DESTINATION ${PROJECT_BINARY_DIR}) 1246 | 1247 | add_test(NAME build_cryptest COMMAND "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target cryptest) 1248 | add_test(NAME cryptest COMMAND $ v) 1249 | set_tests_properties(cryptest PROPERTIES DEPENDS build_cryptest) 1250 | endif () 1251 | 1252 | #============================================================================ 1253 | # Doxygen documentation 1254 | #============================================================================ 1255 | 1256 | if (BUILD_DOCUMENTATION) 1257 | find_package(Doxygen REQUIRED) 1258 | 1259 | set(in_source_DOCS_DIR "${CRYPTOPP_PROJECT_DIR}/html-docs") 1260 | set(out_source_DOCS_DIR "${PROJECT_BINARY_DIR}/html-docs") 1261 | 1262 | add_custom_target(docs ALL 1263 | COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile -d CRYPTOPP_DOXYGEN_PROCESSING 1264 | WORKING_DIRECTORY ${CRYPTOPP_PROJECT_DIR} 1265 | SOURCES ${CRYPTOPP_PROJECT_DIR}/Doxyfile 1266 | ) 1267 | 1268 | if (NOT ${in_source_DOCS_DIR} STREQUAL ${out_source_DOCS_DIR}) 1269 | add_custom_command( 1270 | TARGET docs POST_BUILD 1271 | COMMAND ${CMAKE_COMMAND} -E copy_directory "${in_source_DOCS_DIR}" "${out_source_DOCS_DIR}" 1272 | COMMAND ${CMAKE_COMMAND} -E remove_directory "${in_source_DOCS_DIR}" 1273 | ) 1274 | endif () 1275 | endif () 1276 | 1277 | #============================================================================ 1278 | # Install 1279 | #============================================================================ 1280 | 1281 | set(export_name "cryptopp-targets") 1282 | 1283 | # Runtime package 1284 | if (BUILD_SHARED) 1285 | export(TARGETS cryptopp-shared FILE ${export_name}.cmake ) 1286 | install( 1287 | TARGETS cryptopp-shared 1288 | EXPORT ${export_name} 1289 | DESTINATION ${CMAKE_INSTALL_LIBDIR} 1290 | RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} 1291 | LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 1292 | ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 1293 | ) 1294 | endif () 1295 | 1296 | # Development package 1297 | if (BUILD_STATIC) 1298 | export(TARGETS cryptopp-static FILE ${export_name}.cmake ) 1299 | install(TARGETS cryptopp-static EXPORT ${export_name} DESTINATION ${CMAKE_INSTALL_LIBDIR}) 1300 | endif () 1301 | install(FILES ${cryptopp_HEADERS} DESTINATION include/cryptopp) 1302 | 1303 | # CMake Package 1304 | if (NOT CMAKE_VERSION VERSION_LESS 2.8.8) 1305 | include(CMakePackageConfigHelpers) 1306 | write_basic_package_version_file("${PROJECT_BINARY_DIR}/cryptopp-config-version.cmake" VERSION ${cryptopp_VERSION_MAJOR}.${cryptopp_VERSION_MINOR}.${cryptopp_VERSION_PATCH} COMPATIBILITY SameMajorVersion) 1307 | install(FILES cryptopp-config.cmake ${PROJECT_BINARY_DIR}/cryptopp-config-version.cmake DESTINATION "lib/cmake/cryptopp") 1308 | install(EXPORT ${export_name} DESTINATION "lib/cmake/cryptopp") 1309 | endif () 1310 | 1311 | # Tests 1312 | if (BUILD_TESTING) 1313 | install(TARGETS cryptest DESTINATION ${CMAKE_INSTALL_BINDIR}) 1314 | install(DIRECTORY ${CRYPTOPP_PROJECT_DIR}/TestData DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cryptopp) 1315 | install(DIRECTORY ${CRYPTOPP_PROJECT_DIR}/TestVectors DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/cryptopp) 1316 | endif () 1317 | 1318 | # Documentation 1319 | if (BUILD_DOCUMENTATION) 1320 | install(DIRECTORY "${out_source_DOCS_DIR}" DESTINATION ${CMAKE_INSTALL_DOCDIR}) 1321 | endif () 1322 | 1323 | # Print a configuration summary. We want CXX and CXXFLAGS, but they are not includd in ALL. 1324 | if (CRYPTOPP_I386) 1325 | message(STATUS "Platform: i386/i686") 1326 | elseif (CRYPTOPP_AMD64) 1327 | message(STATUS "Platform: x86_64") 1328 | elseif (CRYPTOPP_ARM32) 1329 | message(STATUS "Platform: ARM-32") 1330 | elseif (CRYPTOPP_ARMV8) 1331 | message(STATUS "Platform: ARMv8") 1332 | elseif (CRYPTOPP_SPARC) 1333 | message(STATUS "Platform: Sparc") 1334 | elseif (CRYPTOPP_SPARC64) 1335 | message(STATUS "Platform: Sparc64") 1336 | elseif (CRYPTOPP_PPC32) 1337 | message(STATUS "Platform: PowerPC") 1338 | elseif (CRYPTOPP_PPC64) 1339 | message(STATUS "Platform: PowerPC-64") 1340 | elseif (CRYPTOPP_MINGW32) 1341 | message(STATUS "Platform: MinGW-32") 1342 | elseif (CRYPTOPP_MINGW64) 1343 | message(STATUS "Platform: MinGW-64") 1344 | endif () 1345 | if (CRYPTOPP_ARMV7A_NEON) 1346 | message(STATUS "NEON: TRUE") 1347 | endif () 1348 | message(STATUS "Compiler: ${CMAKE_CXX_COMPILER}") 1349 | message(STATUS "Compiler definitions: ${CMAKE_CPP_FLAGS} ${CRYPTOPP_COMPILE_DEFINITIONS}") 1350 | message(STATUS "Compiler options: ${CMAKE_CXX_FLAGS} ${CRYPTOPP_COMPILE_OPTIONS}") 1351 | message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") 1352 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Crypto++ CMake 2 | 3 | ## IMPORTANT 4 | 5 | > :warning: This repo's last release is **CRYPTOPP_8_6_0** and will no longer be maintained by its current maintainers. It will remain for people who want to use cmake < 2.8 and for whoever want to take that maintenance over. 6 | 7 | > **A new repo has been created at https://github.com/abdes/cryptopp-cmake** but for **modern cmake** users, i.e. cmake version >= 3.21. Feel free to move to that repo which will continue to be maintained and track crypto++ future releases. You are also welcome to become a contributor in that repo. 8 | 9 | > :warning: **This repo will soon be placed in read-only mode.** 10 | 11 | ## Old README 12 | 13 | [![Build Status](https://travis-ci.org/noloader/cryptopp-cmake.svg?branch=master)](https://travis-ci.org/noloader/cryptopp-cmake) 14 | [![Build status](https://ci.appveyor.com/api/projects/status/qximuf4lv7213v8s/branch/master?svg=true)](https://ci.appveyor.com/project/noloader/cryptopp-cmake/branch/master) 15 | 16 | This repository contains CMake files for Wei Dai's Crypto++ (https://github.com/weidai11/cryptopp). It supplies `CMakeLists.txt` and `cryptopp-config.cmake` for Crypto++ for those who want to use CMake. CMake is officialy unsupported, so use it at your own risk. 17 | 18 | The purpose of Crypto++ CMake is two-fold: 19 | 20 | 1. better support Linux distributions, like Gentoo 21 | 2. provide users with centrally maintained CMake project files 22 | 23 | The initial `cryptopp-config.cmake` and `CMakeLists.txt` were taken from the library sources when CMake support was dropped. Also see CMake on the [Crypto++ wiki](https://www.cryptopp.com/wiki/CMake) for some history and how to use CMake with Crypto++. 24 | 25 | ## Documentation 26 | 27 | The CMake project files are documented on the [Crypto++ wiki | CMake](https://www.cryptopp.com/wiki/CMake). If there is an error or ommission in the wiki article, then please fix it or open a bug report. 28 | 29 | ## Testing 30 | 31 | The CMake files are officialy unsupported, so use them at your own risk. With that said, the CMake source files are tested with Crypto++ on Linux and OS X using [Travis CI](https://github.com/weidai11/cryptopp/blob/master/.travis.yml). 32 | 33 | In June 2018 the library added `cryptest-cmake.sh` to help test the CMake gear. The script is located in Crypto++'s `TestScripts` directory. The script downloads the CMake project files, builds the library and then runs the self tests. 34 | 35 | If you want to use `cryptest-cmake.sh` to drive things then perform the following steps. 36 | 37 | cd cryptopp 38 | cp TestScripts/cryptest-cmake.sh . 39 | ./cryptest-cmake.sh 40 | 41 | ## Workflow 42 | 43 | The general workflow is clone Wei Dai's crypto++, add CMake as a submodule, and then copy the files of interest into the Crypto++ directory: 44 | 45 | git clone https://github.com/weidai11/cryptopp.git 46 | cd cryptopp 47 | 48 | wget -O CMakeLists.txt https://raw.githubusercontent.com/noloader/cryptopp-cmake/master/CMakeLists.txt 49 | wget -O cryptopp-config.cmake https://raw.githubusercontent.com/noloader/cryptopp-cmake/master/cryptopp-config.cmake 50 | 51 | Despite our efforts we have not been able to add the submodule to Crypto++ for seamless integration. If anyone knows how to add the submodule directly to the Crypto++ directory, then please provide the instructions. 52 | 53 | ## ZIP Files 54 | 55 | If you are working from a Crypto++ release zip file, then you should download the same cryptopp-cmake release zip file. Both Crypto++ and this project use the same release tags, such as CRYPTOPP_8_0_0. 56 | 57 | If you mix and match Master with a release zip file then things may not work as expected. You may find the build project files reference a source file that is not present in the Crypto++ release. 58 | 59 | ## Integration 60 | The CMake submodule integrates with the Crypto++ library. The library's `GNUmakefile` and `GNUmakefile-cross` were modified to clean the artifacts produced by CMake. To clean the directory after running CMake perform a `git checkout GNUmakefile` followed by a `make -f GNUmakefile distclean`. 61 | 62 | ## Collaboration 63 | We would like all distro maintainers to be collaborators on this repo. If you are a distro maintainer then please contact us so we can send you an invite. 64 | 65 | If you are a collaborator then make changes as you see fit. You don't need to ask for permission to make a change. Noloader is not an CMake expert so there are probably lots of opportunities for improvement. 66 | 67 | Keep in mind other distros may be using the files, so try not to break things for the other guy. We have to be mindful of lesser-used platforms and compilers, like AIX, Solaris, IBM xlC and Oracle's SunCC. 68 | 69 | ## License 70 | 71 | Everything in this repo is release under Public Domain code. If the license or terms is unpalatable for you, then don't feel obligated to use it or commit. 72 | -------------------------------------------------------------------------------- /cryptopp-config.cmake: -------------------------------------------------------------------------------- 1 | include("${CMAKE_CURRENT_LIST_DIR}/cryptopp-targets.cmake") 2 | --------------------------------------------------------------------------------