summaryrefslogtreecommitdiffstats
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt206
1 files changed, 206 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..bb6d40c
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,206 @@
+# Copyright (c) 2018-2020 Ribose Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+# POSSIBILITY OF SUCH DAMAGE.
+
+# 3.7+ for the BZip2 target in the cmake-bundled finder (basic build)
+# 3.8+ for CPACK_RPM_MAIN_COMPONENT (RPM packaging)
+# 3.10+ for CPackFreeBSD (FreeBSD packaging)
+# 3.10+ for gtest_discover_tests (parallel rnp_tests)
+# 3.12+ for NAMELINK_COMPONENT (for better RPM packaging)
+# 3.12+ for Python3 find module
+# 3.14+ for object library link dependency propagation
+# 3.18+ for OpenSSL::applink
+cmake_minimum_required(VERSION 3.18)
+
+# contact email, other info
+include(cmake/info.cmake)
+
+# determine version
+if (NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cmake")
+ file(DOWNLOAD https://raw.githubusercontent.com/rnpgp/cmake-versioning/main/version.cmake
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/version.cmake")
+endif()
+include(cmake/version.cmake)
+determine_version("${CMAKE_CURRENT_SOURCE_DIR}" RNP)
+
+# project name, etc
+project(RNP
+ VERSION "${RNP_VERSION}"
+ LANGUAGES C CXX
+ DESCRIPTION "${PACKAGE_DESCRIPTION_SHORT}"
+)
+
+# tri-state options
+set(TRISTATE_VALUES On Off Auto)
+
+# options
+option(ENABLE_COVERAGE "Enable code coverage testing.")
+option(ENABLE_SANITIZERS "Enable ASan and other sanitizers.")
+option(ENABLE_FUZZERS "Enable fuzz targets.")
+option(DOWNLOAD_GTEST "Download Googletest" On)
+# crypto components
+function(tristate_feature_auto NAME DESCRIPTION)
+ set(${NAME} Auto CACHE STRING ${DESCRIPTION})
+ set_property(CACHE ${NAME} PROPERTY STRINGS ${TRISTATE_VALUES})
+endfunction()
+set(ENABLE_SM2 Auto CACHE STRING "Enable SM2/SM3/SM4 algorithms support.")
+set_property(CACHE ENABLE_SM2 PROPERTY STRINGS ${TRISTATE_VALUES})
+set(ENABLE_AEAD Auto CACHE STRING "Enable AEAD ciphers support.")
+set_property(CACHE ENABLE_AEAD PROPERTY STRINGS ${TRISTATE_VALUES})
+set(ENABLE_TWOFISH Auto CACHE STRING "Enable Twofish cipher support.")
+set_property(CACHE ENABLE_TWOFISH PROPERTY STRINGS ${TRISTATE_VALUES})
+set(ENABLE_BRAINPOOL Auto CACHE STRING "Enable Brainpool curves support.")
+set_property(CACHE ENABLE_BRAINPOOL PROPERTY STRINGS ${TRISTATE_VALUES})
+set(ENABLE_IDEA Auto CACHE STRING "Enable IDEA algorithm support.")
+set_property(CACHE ENABLE_IDEA PROPERTY STRINGS ${TRISTATE_VALUES})
+tristate_feature_auto(ENABLE_BLOWFISH "Enable Blowfish cipher support.")
+tristate_feature_auto(ENABLE_CAST5 "Enable CAST5 cipher support.")
+tristate_feature_auto(ENABLE_RIPEMD160 "Enable RIPEMD-160 hash support.")
+
+set(ENABLE_DOC Auto CACHE STRING "Enable building documentation.")
+set_property(CACHE ENABLE_DOC PROPERTY STRINGS ${TRISTATE_VALUES})
+
+# so we can use our bundled finders
+set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/Modules")
+
+# required modules
+include(CTest)
+include(FetchContent)
+
+# default to a release build
+if (NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Release CACHE STRING
+ "Build type. Options are: None Debug Release RelWithDebInfo MinSizeRel."
+ FORCE
+ )
+endif()
+
+# crypto backend
+if (NOT CRYPTO_BACKEND)
+ set(CRYPTO_BACKEND "botan" CACHE STRING
+ "Crypto backend. Possible values are botan and openssl (under development, only for debug builds). Default is botan."
+ FORCE
+ )
+endif()
+string(TOLOWER ${CRYPTO_BACKEND} CRYPTO_BACKEND_LOWERCASE)
+if(CRYPTO_BACKEND_LOWERCASE STREQUAL "botan")
+ # Default value;
+ set(CRYPTO_BACKEND_BOTAN 1)
+elseif(CRYPTO_BACKEND_LOWERCASE STREQUAL "openssl")
+ set(CRYPTO_BACKEND_OPENSSL 1)
+else()
+ message(FATAL_ERROR "Invalid crypto backend: ${CRYPTO_BACKEND}")
+endif()
+
+# set warning flags at the top level
+if(NOT MSVC)
+ add_compile_options(
+ -Wall -Wextra
+ -Wunreachable-code -Wpointer-arith
+ -Wmissing-declarations
+ )
+# relax some warnings a bit
+ add_compile_options(
+ -Wno-pedantic
+ -Wno-ignored-qualifiers
+ -Wno-unused-parameter
+ -Wno-missing-field-initializers
+ )
+endif(NOT MSVC)
+
+# THis works both for MSVC and CL on Windows
+if(WIN32)
+ add_compile_definitions(_CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_DEPRECATE)
+endif(WIN32)
+
+# set a few other things at the top level to prevent incompatibilities
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_CXX_STANDARD 11)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+set(CMAKE_CXX_EXTENSIONS OFF)
+add_definitions(-D_GNU_SOURCE)
+
+if (ENABLE_COVERAGE OR ENABLE_SANITIZERS)
+ message("Forcing build type to Debug (for code coverage or sanitizers).")
+ set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type. Forced to Debug." FORCE)
+endif()
+
+# coverage
+if (ENABLE_COVERAGE)
+ if (NOT CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+ message(FATAL_ERROR "Coverage has only been tested with the GNU compiler.")
+ endif()
+ add_compile_options(--coverage -O0)
+ link_libraries(--coverage)
+endif()
+
+# sanitizers
+if (ENABLE_SANITIZERS)
+ if (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ message(FATAL_ERROR "Sanitizers have only been tested with the clang compiler.")
+ endif()
+ add_compile_options(-fsanitize=leak,address,undefined -fno-omit-frame-pointer -fno-common -O1)
+ link_libraries(-fsanitize=leak,address,undefined)
+endif()
+
+# adoc for man generation
+if (ENABLE_DOC)
+ include(AdocMan)
+endif()
+
+# everything else is in subdirs
+add_subdirectory(src/examples)
+if (ENABLE_FUZZERS)
+ add_subdirectory(src/fuzzing)
+ add_compile_options(-DFUZZERS_ENABLED=1)
+endif()
+add_subdirectory(src/common)
+
+set(WITH_SEXP_CLI OFF)
+set(WITH_SEXP_TESTS OFF)
+set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME development)
+add_subdirectory(src/libsexp EXCLUDE_FROM_ALL)
+
+add_subdirectory(src/lib)
+add_subdirectory(src/rnp)
+add_subdirectory(src/rnpkeys)
+
+# build tests, if desired
+if (BUILD_TESTING)
+ # Googletest source path
+ if (NOT GTEST_SOURCES)
+ set(GTEST_SOURCES "" CACHE STRING
+ "Path to the Googletest sources in case of download or linking to the precompiled library is disabled."
+ FORCE
+ )
+ else()
+ # Canonicalize path to the Googletest sources.
+ get_filename_component(GTEST_SOURCES_FULL ${GTEST_SOURCES} REALPATH)
+ set(GTEST_SOURCES ${GTEST_SOURCES_FULL})
+ endif()
+ add_subdirectory(src/tests)
+endif()
+
+
+# cpack packaging (RPM etc)
+include(cmake/packaging.cmake)