290 lines
10 KiB
CMake
290 lines
10 KiB
CMake
# ===-----------------------------------------------------------------------===#
|
|
# Distributed under the 3-Clause BSD License. See accompanying file LICENSE or
|
|
# copy at https://opensource.org/licenses/BSD-3-Clause).
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
# ===-----------------------------------------------------------------------===#
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# CMake basic options
|
|
# ------------------------------------------------------------------------------
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/cmake/cmake_minimum_required.cmake)
|
|
cmake_minimum_required(VERSION ${CRYPTOPP_MINIMUM_CMAKE_VERSION})
|
|
|
|
# List of directories specifying a search path for CMake modules to be loaded by
|
|
# the include() or find_package() commands before checking the default modules
|
|
# that come with CMake.
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
|
|
|
|
# Setup our override file, in which we may cleanup cmake's default compiler
|
|
# options, based on what we are doing.
|
|
set(CMAKE_USER_MAKE_RULES_OVERRIDE "ResetInitialCompilerOptions")
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Project description and (meta) information
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Get git revision
|
|
include(GetGitRevisionDescription)
|
|
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
|
|
string(SUBSTRING "${GIT_SHA1}" 0 12 GIT_REV)
|
|
if(NOT GIT_SHA1)
|
|
set(GIT_REV "0")
|
|
endif()
|
|
|
|
set(META_PROJECT_NAME "cryptopp-cmake")
|
|
set(META_PROJECT_DESCRIPTION "Free C++ class library of cryptographic schemes")
|
|
set(META_GITHUB_REPO "https://github.com/weidai11/cryptopp")
|
|
set(META_VERSION_MAJOR "8")
|
|
set(META_VERSION_MINOR "9")
|
|
set(META_VERSION_PATCH "0")
|
|
set(META_VERSION_REVISION "${GIT_REV}")
|
|
set(META_VERSION
|
|
"${META_VERSION_MAJOR}.${META_VERSION_MINOR}.${META_VERSION_PATCH}"
|
|
)
|
|
set(META_NAME_VERSION
|
|
"${META_PROJECT_NAME} v${META_VERSION} (${META_VERSION_REVISION})"
|
|
)
|
|
# ------------------------------------------------------------------------------
|
|
# Project Declaration
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# Declare project
|
|
project(
|
|
"${META_PROJECT_NAME}"
|
|
VERSION "${META_VERSION}"
|
|
DESCRIPTION "${META_PROJECT_DESCRIPTION}"
|
|
HOMEPAGE_URL "${META_GITHUB_REPO}"
|
|
LANGUAGES CXX C ASM
|
|
)
|
|
|
|
# cmake-format: on
|
|
|
|
message("=> Project : ${PROJECT_NAME} v${cryptopp-cmake_VERSION}")
|
|
|
|
# ============================================================================
|
|
# Settable options
|
|
# ============================================================================
|
|
|
|
function(cryptopp_deprecated_option old_name new_name description default)
|
|
if(DEFINED ${old_name})
|
|
message(
|
|
DEPRECATION
|
|
"${old_name} is a deprecated option and will be ignored after 8.8.x + 3. Use ${new_name} instead"
|
|
)
|
|
set(default ${${old_name}})
|
|
endif()
|
|
|
|
option(${new_name} ${description} ${default})
|
|
endfunction()
|
|
option(
|
|
CRYPTOPP_USE_INTERMEDIATE_OBJECTS_TARGET
|
|
"Use a common intermediate objects target for the static and shared library targets"
|
|
ON
|
|
)
|
|
|
|
if(CRYPTOPP_INCLUDE_PREFIX)
|
|
set(CRYPTOPP_INCLUDE_PREFIX
|
|
${CRYPTOPP_INCLUDE_PREFIX}
|
|
CACHE STRING
|
|
"Set the dir where the headers get installed. Defaults to cryptopp."
|
|
)
|
|
else()
|
|
set(CRYPTOPP_INCLUDE_PREFIX
|
|
"cryptopp"
|
|
CACHE STRING
|
|
"Set the dir where the headers get installed. Defaults to cryptopp."
|
|
)
|
|
endif()
|
|
|
|
if(CRYPTOPP_SOURCES)
|
|
set(CRYPTOPP_SOURCES
|
|
${CRYPTOPP_SOURCES}
|
|
CACHE PATH
|
|
"Use the provided location for crypto++ sources; do not fetch"
|
|
)
|
|
else()
|
|
set(CRYPTOPP_SOURCES
|
|
""
|
|
CACHE PATH
|
|
"Use the provided location for crypto++ sources; do not fetch"
|
|
)
|
|
endif()
|
|
|
|
cryptopp_deprecated_option(
|
|
USE_OPENMP
|
|
CRYPTOPP_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
|
|
)
|
|
|
|
# These are IA-32 options.
|
|
cryptopp_deprecated_option(DISABLE_ASM CRYPTOPP_DISABLE_ASM "Disable ASM" OFF)
|
|
cryptopp_deprecated_option(DISABLE_SSSE3 CRYPTOPP_DISABLE_SSSE3 "Disable SSSE3" OFF)
|
|
cryptopp_deprecated_option(DISABLE_SSE4 CRYPTOPP_DISABLE_SSE4 "Disable SSE4" OFF)
|
|
cryptopp_deprecated_option(DISABLE_AESNI CRYPTOPP_DISABLE_AESNI "Disable AES-NI" OFF)
|
|
cryptopp_deprecated_option(DISABLE_CLMUL CRYPTOPP_DISABLE_CLMUL "Disable CLMUL" OFF)
|
|
cryptopp_deprecated_option(DISABLE_SHA CRYPTOPP_DISABLE_SHA "Disable SHA" OFF)
|
|
cryptopp_deprecated_option(DISABLE_AVX CRYPTOPP_DISABLE_AVX "Disable AVX" OFF)
|
|
cryptopp_deprecated_option(DISABLE_AVX2 CRYPTOPP_DISABLE_AVX2 "Disable AVX2" OFF)
|
|
|
|
# These are ARM A-32 options
|
|
cryptopp_deprecated_option(DISABLE_ARM_NEON CRYPTOPP_DISABLE_ARM_NEON "Disable NEON" OFF)
|
|
|
|
# These are Aarch64 options
|
|
cryptopp_deprecated_option(DISABLE_ARM_AES CRYPTOPP_DISABLE_ARM_AES "Disable ASIMD" OFF)
|
|
cryptopp_deprecated_option(DISABLE_ARM_AES CRYPTOPP_DISABLE_ARM_AES "Disable AES" OFF)
|
|
cryptopp_deprecated_option(DISABLE_ARM_PMULL CRYPTOPP_DISABLE_ARM_PMULL "Disable PMULL" OFF)
|
|
cryptopp_deprecated_option(DISABLE_ARM_SHA CRYPTOPP_DISABLE_ARM_SHA "Disable SHA" OFF)
|
|
|
|
# These are PowerPC options
|
|
cryptopp_deprecated_option(DISABLE_ALTIVEC CRYPTOPP_DISABLE_ALTIVEC "Disable Altivec" OFF)
|
|
cryptopp_deprecated_option(DISABLE_POWER7 CRYPTOPP_DISABLE_POWER7 "Disable POWER7" OFF)
|
|
cryptopp_deprecated_option(DISABLE_POWER8 CRYPTOPP_DISABLE_POWER8 "Disable POWER8" OFF)
|
|
cryptopp_deprecated_option(DISABLE_POWER9 CRYPTOPP_DISABLE_POWER9 "Disable POWER9" OFF)
|
|
|
|
option(
|
|
CRYPTOPP_USE_MASTER_BRANCH
|
|
"Get crypto++ from the master branch, not from a release tag"
|
|
FALSE
|
|
)
|
|
option(CRYPTOPP_BUILD_TESTING "Build library tests" ON)
|
|
option(
|
|
CRYPTOPP_BUILD_DOCUMENTATION
|
|
"Use Doxygen to create the HTML-based API documentation"
|
|
OFF
|
|
)
|
|
|
|
# Override the CRYPTOPP_INSTALL option to ON/OFF to respectively force
|
|
# install/no-install behavior for cryptopp module. This is particularly useful
|
|
# when `cryptopp` is used as a sub-project with CMake and the user publicly
|
|
# depends on it and wants to have a self-contained install.
|
|
option(CRYPTOPP_INSTALL "Generate the install target for this project." ON)
|
|
|
|
# Crypto++ DOES NOT properly support DLL builds. The old DLL was the FIPS one,
|
|
# which is being abandoned. Therefore, we only allow static builds until that
|
|
# situation is solved.
|
|
#
|
|
# See https://cryptopp.com/wiki/Wrapper_DLL for a workaround.
|
|
option(CRYPTOPP_BUILD_SHARED "Build shared library" OFF)
|
|
if(${CRYPTOPP_BUILD_SHARED})
|
|
message(
|
|
FATAL_ERROR
|
|
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
|
|
"Crypto++ DOES NOT properly support DLL builds. The old DLL was the FIPS"
|
|
"one which is being abandoned.\nTherefore, we only allow static builds"
|
|
"until that situation changes.\n"
|
|
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n"
|
|
)
|
|
endif()
|
|
|
|
if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
set(CRYPTOPP_DEFAULT_BUILD_TYPE "Debug")
|
|
else()
|
|
set(CRYPTOPP_DEFAULT_BUILD_TYPE "Release")
|
|
endif(EXISTS "${CMAKE_SOURCE_DIR}/.git")
|
|
|
|
# Set the possible values of build type for cmake-gui
|
|
if(CMAKE_CONFIGURATION_TYPES)
|
|
set(CMAKE_CONFIGURATION_TYPES
|
|
"Debug;Release"
|
|
CACHE STRING
|
|
"Semicolon separated list of supported configuration types, only supports debug and release, anything else will be ignored"
|
|
FORCE
|
|
)
|
|
|
|
set_property(
|
|
CACHE CMAKE_CONFIGURATION_TYPES
|
|
PROPERTY STRINGS "Debug" "Release"
|
|
)
|
|
endif()
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
message(
|
|
STATUS
|
|
"Setting build type to '${CRYPTOPP_DEFAULT_BUILD_TYPE}' as none was specified."
|
|
)
|
|
|
|
set(CMAKE_BUILD_TYPE
|
|
"${CRYPTOPP_DEFAULT_BUILD_TYPE}"
|
|
CACHE STRING
|
|
"Choose the type of build."
|
|
FORCE
|
|
)
|
|
endif()
|
|
|
|
# ---- Speedup build using ccache (needs CPM) ----
|
|
include(cmake/FasterBuild.cmake)
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Fetch / Find crypto++
|
|
# ------------------------------------------------------------------------------
|
|
|
|
# If CMake is invoked with an explicit option (cryptopp_SOURCE_DIR), setting
|
|
# the location for user-provided sources of crypto++, or if the automatic
|
|
# download fails, we use that option value to find the sources.
|
|
find_package(Git)
|
|
|
|
if(NOT CRYPTOPP_SOURCES)
|
|
include(GetCryptoppSources)
|
|
if(EXISTS ${cryptopp_SOURCE_DIR})
|
|
message(STATUS "Crypto++ auto fetched at: ${cryptopp_SOURCE_DIR}")
|
|
else()
|
|
message(FATAL_ERROR "Crypto++ auto fetch failed; cannot continue!")
|
|
endif()
|
|
else()
|
|
if(EXISTS ${CRYPTOPP_SOURCES})
|
|
message(
|
|
STATUS
|
|
"Crypto++ from user-specified location at: ${CRYPTOPP_SOURCES}"
|
|
)
|
|
set(cryptopp_SOURCE_DIR ${CRYPTOPP_SOURCES})
|
|
else()
|
|
message(
|
|
FATAL_ERROR
|
|
"User-provided location (${CRYPTOPP_SOURCES}) for crypto++ sources does not exit!"
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(Git_FOUND)
|
|
get_filename_component(
|
|
CRYPTOPP_CMAKE_PARENT_DIR
|
|
${cryptopp-cmake_SOURCE_DIR}
|
|
DIRECTORY
|
|
)
|
|
execute_process(
|
|
COMMAND
|
|
${CMAKE_COMMAND} -E env
|
|
GIT_CEILING_DIRECTORIES="${CRYPTOPP_CMAKE_PARENT_DIR}"
|
|
${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
|
|
WORKING_DIRECTORY ${cryptopp-cmake_SOURCE_DIR}
|
|
RESULT_VARIABLE cryptopp_CMAKE_GIT_RESULT
|
|
OUTPUT_VARIABLE cryptopp_GIT_BRANCH
|
|
ERROR_QUIET
|
|
)
|
|
if(cryptopp_CMAKE_GIT_RESULT EQUAL 0)
|
|
string(STRIP ${cryptopp_GIT_BRANCH} cryptopp_GIT_BRANCH)
|
|
endif()
|
|
endif()
|
|
if(NOT cryptopp_GIT_BRANCH)
|
|
set(cryptopp_GIT_BRANCH "master")
|
|
endif()
|
|
message(STATUS "Using branch ${cryptopp_GIT_BRANCH} for tests")
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Testing
|
|
# ------------------------------------------------------------------------------
|
|
|
|
if(CRYPTOPP_BUILD_TESTING)
|
|
enable_testing()
|
|
add_subdirectory(test)
|
|
endif()
|
|
|
|
# ------------------------------------------------------------------------------
|
|
# Add cryptopp CMake subdirectory
|
|
# ------------------------------------------------------------------------------
|
|
|
|
message("=> Module : cryptopp")
|
|
add_subdirectory(cryptopp)
|