diff --git a/CMakeLists.txt b/CMakeLists.txt index 3948bc4b09a0619a1b2969e74a3e0aa200393e1b..f81f5dbaa055727da466772966e8c78effbfb279 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,38 @@ cmake_minimum_required(VERSION 3.11) + +set( + CMAKE_TOOLCHAIN_FILE + "${CMAKE_CURRENT_LIST_DIR}/toolchain.cmake" + CACHE + FILEPATH + "Default toolchain" +) + + +option(HUNTER_ENABLED "Enable Hunter package manager" OFF) +include("cmake/HunterGate.cmake") +#set(HUNTER_ENABLED OFF) +HunterGate( + URL "https://github.com/cpp-pm/hunter/archive/v0.23.242.tar.gz" + SHA1 "503b149d0ebdbc598e498f1669ae828a2136b838" +) + +option(USE_BUNDLED_BOOST "Use the bundled version of Boost." ${HUNTER_ENABLED}) +option(USE_BUNDLED_SPDLOG "Use the bundled version of spdlog." + ${HUNTER_ENABLED}) +option(USE_BUNDLED_OLM "Use the bundled version of libolm." ${HUNTER_ENABLED}) +option(USE_BUNDLED_GTEST "Use the bundled version of Google Test." + ${HUNTER_ENABLED}) +option(USE_BUNDLED_JSON "Use the bundled version of nlohmann json." + ${HUNTER_ENABLED}) +option(USE_BUNDLED_OPENSSL "Use the bundled version of OpenSSL." + ${HUNTER_ENABLED}) +option(USE_BUNDLED_SODIUM "Use the bundled version of libsodium." + ${HUNTER_ENABLED}) +option(USE_BUNDLED_ZLIB "Use the bundled version of zlib." + ${HUNTER_ENABLED}) + project(matrix_client VERSION 0.3.0 LANGUAGES CXX C) option(ASAN "Compile with address sanitizers" OFF) @@ -9,10 +42,7 @@ option(COVERAGE "Calculate test coverage" OFF) option(IWYU "Check headers with include-what-you-use" OFF) option(BUILD_SHARED_LIBS "Specifies whether to build mtxclient as a shared library lib or not" ON) -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${CMAKE_CURRENT_SOURCE_DIR}/cmake") if(NOT MSVC) set( @@ -43,13 +73,19 @@ endif() include(FeatureSummary) -find_package(OpenSSL) +if(USE_BUNDLED_OPENSSL) + hunter_add_package(OpenSSL) +endif() +find_package(OpenSSL REQUIRED) set_package_properties(OpenSSL PROPERTIES DESCRIPTION "Open source SSL and TLS implementation and cryptographic library" URL "https://www.openssl.org/" TYPE REQUIRED ) +if(USE_BUNDLED_ZLIB) + hunter_add_package(ZLIB) +endif() find_package(ZLIB) set_package_properties(ZLIB PROPERTIES DESCRIPTION "A free compression library unencumbered by patents" @@ -57,20 +93,37 @@ set_package_properties(ZLIB PROPERTIES TYPE REQUIRED ) -find_package(Olm 2) +if(USE_BUNDLED_OLM) + include(FetchContent) + FetchContent_Declare( + Olm + GIT_REPOSITORY https://gitlab.matrix.org/matrix-org/olm.git + GIT_TAG 3.1.4 + ) + FetchContent_MakeAvailable(Olm) +endif() +find_package(Olm 3) set_package_properties(Olm PROPERTIES DESCRIPTION "An implementation of the Double Ratchet cryptographic ratchet" URL "https://git.matrix.org/git/olm/about/" TYPE REQUIRED ) -find_package(sodium 1.0.14) -set_package_properties(sodium PROPERTIES - DESCRIPTION "A modern, portable, easy to use crypto library" - URL "https://github.com/jedisct1/libsodium" - TYPE REQUIRED -) +if(USE_BUNDLED_SODIUM) + hunter_add_package(libsodium) + find_package(libsodium 1.0.14) +else() + find_package(sodium 1.0.14) + set_package_properties(sodium PROPERTIES + DESCRIPTION "A modern, portable, easy to use crypto library" + URL "https://github.com/jedisct1/libsodium" + TYPE REQUIRED + ) +endif() +if(USE_BUNDLED_JSON) + hunter_add_package(nlohmann_json) +endif() find_package(nlohmann_json 3.2.0) set_package_properties(nlohmann_json PROPERTIES DESCRIPTION "JSON for Modern C++, a C++11 header-only JSON class" @@ -78,90 +131,108 @@ set_package_properties(nlohmann_json PROPERTIES TYPE REQUIRED ) -set(Boost_USE_STATIC_LIBS OFF) -set(Boost_USE_STATIC_RUNTIME OFF) -set(Boost_USE_MULTITHREADED ON) +if(USE_BUNDLED_BOOST) + hunter_add_package(Boost + COMPONENTS atomic + chrono + date_time + iostreams + random + regex + system + thread) +endif() +#set(Boost_USE_STATIC_LIBS OFF) +#set(Boost_USE_STATIC_RUNTIME OFF) +#set(Boost_USE_MULTITHREADED ON) find_package(Boost 1.70 - COMPONENTS atomic - chrono - date_time - iostreams - random - regex - system - thread) + COMPONENTS atomic + chrono + date_time + iostreams + random + regex + system + thread) set_package_properties(Boost PROPERTIES - DESCRIPTION "Free peer-reviewed portable C++ source libraries" - URL "https://www.boost.org/" - TYPE REQUIRED +DESCRIPTION "Free peer-reviewed portable C++ source libraries" +URL "https://www.boost.org/" +TYPE REQUIRED ) add_library(matrix_client - lib/http/client.cpp - lib/http/session.cpp - lib/crypto/client.cpp - lib/crypto/utils.cpp - lib/utils.cpp - lib/log.cpp - lib/structs/common.cpp - lib/structs/errors.cpp - lib/structs/events.cpp - lib/structs/requests.cpp - lib/structs/events/aliases.cpp - lib/structs/events/avatar.cpp - lib/structs/events/canonical_alias.cpp - lib/structs/events/common.cpp - lib/structs/events/collections.cpp - lib/structs/events/create.cpp - lib/structs/events/encrypted.cpp - lib/structs/events/encryption.cpp - lib/structs/events/guest_access.cpp - lib/structs/events/history_visibility.cpp - lib/structs/events/join_rules.cpp - lib/structs/events/member.cpp - lib/structs/events/name.cpp - lib/structs/events/pinned_events.cpp - lib/structs/events/power_levels.cpp - lib/structs/events/redaction.cpp - lib/structs/events/tag.cpp - lib/structs/events/tombstone.cpp - lib/structs/events/topic.cpp - lib/structs/events/messages/audio.cpp - lib/structs/events/messages/emote.cpp - lib/structs/events/messages/file.cpp - lib/structs/events/messages/image.cpp - lib/structs/events/messages/notice.cpp - lib/structs/events/messages/text.cpp - lib/structs/events/messages/video.cpp - lib/structs/responses/common.cpp - lib/structs/responses/create_room.cpp - lib/structs/responses/crypto.cpp - lib/structs/responses/empty.cpp - lib/structs/responses/login.cpp - lib/structs/responses/media.cpp - lib/structs/responses/messages.cpp - lib/structs/responses/notifications.cpp - lib/structs/responses/profile.cpp - lib/structs/responses/register.cpp - lib/structs/responses/sync.cpp - lib/structs/responses/version.cpp - lib/structs/responses/well-known.cpp) + lib/http/client.cpp + lib/http/session.cpp + lib/crypto/client.cpp + lib/crypto/utils.cpp + lib/utils.cpp + lib/log.cpp + lib/structs/common.cpp + lib/structs/errors.cpp + lib/structs/events.cpp + lib/structs/requests.cpp + lib/structs/events/aliases.cpp + lib/structs/events/avatar.cpp + lib/structs/events/canonical_alias.cpp + lib/structs/events/common.cpp + lib/structs/events/collections.cpp + lib/structs/events/create.cpp + lib/structs/events/encrypted.cpp + lib/structs/events/encryption.cpp + lib/structs/events/guest_access.cpp + lib/structs/events/history_visibility.cpp + lib/structs/events/join_rules.cpp + lib/structs/events/member.cpp + lib/structs/events/name.cpp + lib/structs/events/pinned_events.cpp + lib/structs/events/power_levels.cpp + lib/structs/events/redaction.cpp + lib/structs/events/tag.cpp + lib/structs/events/tombstone.cpp + lib/structs/events/topic.cpp + lib/structs/events/messages/audio.cpp + lib/structs/events/messages/emote.cpp + lib/structs/events/messages/file.cpp + lib/structs/events/messages/image.cpp + lib/structs/events/messages/notice.cpp + lib/structs/events/messages/text.cpp + lib/structs/events/messages/video.cpp + lib/structs/responses/common.cpp + lib/structs/responses/create_room.cpp + lib/structs/responses/crypto.cpp + lib/structs/responses/empty.cpp + lib/structs/responses/login.cpp + lib/structs/responses/media.cpp + lib/structs/responses/messages.cpp + lib/structs/responses/notifications.cpp + lib/structs/responses/profile.cpp + lib/structs/responses/register.cpp + lib/structs/responses/sync.cpp + lib/structs/responses/version.cpp + lib/structs/responses/well-known.cpp) add_library(MatrixClient::MatrixClient ALIAS matrix_client) target_include_directories(matrix_client - SYSTEM - PUBLIC - ${Boost_INCLUDE_DIRS} - ${OPENSSL_INCLUDE_DIR} - ${sodium_INCLUDE_DIR}) + SYSTEM + PUBLIC + ${Boost_INCLUDE_DIRS} + ${OPENSSL_INCLUDE_DIR} + ${sodium_INCLUDE_DIR}) target_include_directories( - matrix_client - PUBLIC - $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> - $<INSTALL_INTERFACE:include>) +matrix_client +PUBLIC +$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> +$<INSTALL_INTERFACE:include>) target_link_libraries(matrix_client - PUBLIC - ${Boost_LIBRARIES} - ${sodium_LIBRARY_RELEASE} + PUBLIC + Boost::atomic + Boost::chrono + Boost::date_time + Boost::iostreams + Boost::random + Boost::regex + Boost::system + Boost::thread + libsodium::libsodium OpenSSL::Crypto OpenSSL::SSL Olm::Olm @@ -176,11 +247,11 @@ if(COVERAGE) include(CodeCoverage) add_custom_target(ctest COMMAND ${CMAKE_CTEST_COMMAND}) target_compile_options(matrix_client PUBLIC - -O0 # no optimization - -g # generate debug info - --coverage # sets all required flags - -fprofile-arcs -ftest-coverage # just to be sure, for clang! - ) + -O0 # no optimization + -g # generate debug info + --coverage # sets all required flags + -fprofile-arcs -ftest-coverage # just to be sure, for clang! + ) target_link_options(matrix_client PUBLIC --coverage) setup_target_for_coverage(test_coverage ctest coverage) endif() @@ -256,6 +327,9 @@ set_property(TARGET matrix_client PROPERTY SOVERSION ${PROJECT_VERSION}) if(BUILD_LIB_TESTS) enable_testing() + if(USE_BUNDLED_GTEST) + hunter_add_package(GTest) + endif() find_package(GTest REQUIRED) file(COPY tests/fixtures DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/cmake/FindOlm.cmake b/cmake/FindOlm.cmake deleted file mode 100644 index aaccdb0c108e847531b087a756db5fba5f87b991..0000000000000000000000000000000000000000 --- a/cmake/FindOlm.cmake +++ /dev/null @@ -1,40 +0,0 @@ -# -# CMake module to search for the olm library -# -# On success, the macro sets the following variables: -# OLM_FOUND = if the library found -# OLM_LIBRARY = full path to the library -# OLM_INCLUDE_DIR = where to find the library headers -# - -find_path(OLM_INCLUDE_DIR - NAMES olm/olm.h - PATHS /usr/include - /usr/local/include - $ENV{LIB_DIR}/include - $ENV{LIB_DIR}/include/olm) - -find_library(OLM_LIBRARY - NAMES olm - PATHS /usr/lib /usr/local/lib $ENV{LIB_DIR}/lib) - -if(OLM_FOUND) - set(OLM_INCLUDE_DIRS ${OLM_INCLUDE_DIR}) - - if(NOT OLM_LIBRARIES) - set(OLM_LIBRARIES ${OLM_LIBRARY}) - endif() -endif() - -if(NOT TARGET Olm::Olm) - add_library(Olm::Olm UNKNOWN IMPORTED) - set_target_properties(Olm::Olm - PROPERTIES INTERFACE_INCLUDE_DIRECTORIES - ${OLM_INCLUDE_DIR}) - set_property(TARGET Olm::Olm APPEND PROPERTY IMPORTED_LOCATION ${OLM_LIBRARY}) -endif() - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(OLM DEFAULT_MSG OLM_INCLUDE_DIR OLM_LIBRARY) - -mark_as_advanced(OLM_LIBRARY OLM_INCLUDE_DIR) diff --git a/cmake/Findsodium.cmake b/cmake/Findsodium.cmake index c469c3f542e3408f7faae218541bab202d56816a..e061079c54f1f84ddf77a6e13dacd3581ced2f3c 100644 --- a/cmake/Findsodium.cmake +++ b/cmake/Findsodium.cmake @@ -17,13 +17,13 @@ # # Once done the following variables will be defined: # -# sodium_FOUND -# sodium_INCLUDE_DIR -# sodium_LIBRARY_DEBUG -# sodium_LIBRARY_RELEASE +# libsodium_FOUND +# libsodium_INCLUDE_DIR +# libsodium_LIBRARY_DEBUG +# libsodium_LIBRARY_RELEASE # # -# Furthermore an imported "sodium" target is created. +# Furthermore an imported "libsodium" target is created. # if (CMAKE_C_COMPILER_ID STREQUAL "GNU" @@ -32,16 +32,16 @@ if (CMAKE_C_COMPILER_ID STREQUAL "GNU" endif() # static library option -if (NOT DEFINED sodium_USE_STATIC_LIBS) - option(sodium_USE_STATIC_LIBS "enable to statically link against sodium" OFF) +if (NOT DEFINED libsodium_USE_STATIC_LIBS) + option(libsodium_USE_STATIC_LIBS "enable to statically link against libsodium" OFF) endif() -if(NOT (sodium_USE_STATIC_LIBS EQUAL sodium_USE_STATIC_LIBS_LAST)) - unset(sodium_LIBRARY CACHE) - unset(sodium_LIBRARY_DEBUG CACHE) - unset(sodium_LIBRARY_RELEASE CACHE) - unset(sodium_DLL_DEBUG CACHE) - unset(sodium_DLL_RELEASE CACHE) - set(sodium_USE_STATIC_LIBS_LAST ${sodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable") +if(NOT (libsodium_USE_STATIC_LIBS EQUAL libsodium_USE_STATIC_LIBS_LAST)) + unset(libsodium_LIBRARY CACHE) + unset(libsodium_LIBRARY_DEBUG CACHE) + unset(libsodium_LIBRARY_RELEASE CACHE) + unset(libsodium_DLL_DEBUG CACHE) + unset(libsodium_DLL_RELEASE CACHE) + set(libsodium_USE_STATIC_LIBS_LAST ${libsodium_USE_STATIC_LIBS} CACHE INTERNAL "internal change tracking variable") endif() @@ -51,39 +51,39 @@ if (UNIX) # import pkg-config find_package(PkgConfig QUIET) if (PKG_CONFIG_FOUND) - pkg_check_modules(sodium_PKG QUIET libsodium) + pkg_check_modules(libsodium_PKG QUIET libsodium) endif() - if(sodium_USE_STATIC_LIBS) - foreach(_libname ${sodium_PKG_STATIC_LIBRARIES}) + if(libsodium_USE_STATIC_LIBS) + foreach(_libname ${libsodium_PKG_STATIC_LIBRARIES}) if (NOT _libname MATCHES "^lib.*\\.a$") # ignore strings already ending with .a - list(INSERT sodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a") + list(INSERT libsodium_PKG_STATIC_LIBRARIES 0 "lib${_libname}.a") endif() endforeach() - list(REMOVE_DUPLICATES sodium_PKG_STATIC_LIBRARIES) + list(REMOVE_DUPLICATES libsodium_PKG_STATIC_LIBRARIES) # if pkgconfig for libsodium doesn't provide # static lib info, then override PKG_STATIC here.. - if (sodium_PKG_STATIC_LIBRARIES STREQUAL "") - set(sodium_PKG_STATIC_LIBRARIES libsodium.a) + if (libsodium_PKG_STATIC_LIBRARIES STREQUAL "") + set(libsodium_PKG_STATIC_LIBRARIES libsodium.a) endif() - set(XPREFIX sodium_PKG_STATIC) + set(XPREFIX libsodium_PKG_STATIC) else() - if (sodium_PKG_LIBRARIES STREQUAL "") - set(sodium_PKG_LIBRARIES sodium) + if (libsodium_PKG_LIBRARIES STREQUAL "") + set(libsodium_PKG_LIBRARIES sodium) endif() - set(XPREFIX sodium_PKG) + set(XPREFIX libsodium_PKG) endif() - find_path(sodium_INCLUDE_DIR sodium.h + find_path(libsodium_INCLUDE_DIR sodium.h HINTS ${${XPREFIX}_INCLUDE_DIRS} ) - find_library(sodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} + find_library(libsodium_LIBRARY_DEBUG NAMES ${${XPREFIX}_LIBRARIES} HINTS ${${XPREFIX}_LIBRARY_DIRS} ) - find_library(sodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} + find_library(libsodium_LIBRARY_RELEASE NAMES ${${XPREFIX}_LIBRARIES} HINTS ${${XPREFIX}_LIBRARY_DIRS} ) @@ -91,11 +91,11 @@ if (UNIX) ######################################################################## # Windows elseif (WIN32) - set(sodium_DIR "$ENV{sodium_DIR}" CACHE FILEPATH "sodium install directory") - mark_as_advanced(sodium_DIR) + set(libsodium_DIR "$ENV{libsodium_DIR}" CACHE FILEPATH "libsodium install directory") + mark_as_advanced(libsodium_DIR) - find_path(sodium_INCLUDE_DIR sodium.h - HINTS ${sodium_DIR} + find_path(libsodium_INCLUDE_DIR sodium.h + HINTS ${libsodium_DIR} PATH_SUFFIXES include ) @@ -131,7 +131,7 @@ elseif (WIN32) endif() string(APPEND _PLATFORM_PATH "/v${_VS_VERSION}") - if (sodium_USE_STATIC_LIBS) + if (libsodium_USE_STATIC_LIBS) string(APPEND _PLATFORM_PATH "/static") else() string(APPEND _PLATFORM_PATH "/dynamic") @@ -140,59 +140,59 @@ elseif (WIN32) string(REPLACE "$$CONFIG$$" "Debug" _DEBUG_PATH_SUFFIX "${_PLATFORM_PATH}") string(REPLACE "$$CONFIG$$" "Release" _RELEASE_PATH_SUFFIX "${_PLATFORM_PATH}") - find_library(sodium_LIBRARY_DEBUG libsodium.lib - HINTS ${sodium_DIR} + find_library(libsodium_LIBRARY_DEBUG libsodium.lib + HINTS ${libsodium_DIR} PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX} ) - find_library(sodium_LIBRARY_RELEASE libsodium.lib - HINTS ${sodium_DIR} + find_library(libsodium_LIBRARY_RELEASE libsodium.lib + HINTS ${libsodium_DIR} PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX} ) - if (NOT sodium_USE_STATIC_LIBS) + if (NOT libsodium_USE_STATIC_LIBS) set(CMAKE_FIND_LIBRARY_SUFFIXES_BCK ${CMAKE_FIND_LIBRARY_SUFFIXES}) set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll") - find_library(sodium_DLL_DEBUG libsodium - HINTS ${sodium_DIR} + find_library(libsodium_DLL_DEBUG libsodium + HINTS ${libsodium_DIR} PATH_SUFFIXES ${_DEBUG_PATH_SUFFIX} ) - find_library(sodium_DLL_RELEASE libsodium - HINTS ${sodium_DIR} + find_library(libsodium_DLL_RELEASE libsodium + HINTS ${libsodium_DIR} PATH_SUFFIXES ${_RELEASE_PATH_SUFFIX} ) set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_BCK}) endif() elseif(_GCC_COMPATIBLE) - if (sodium_USE_STATIC_LIBS) - find_library(sodium_LIBRARY_DEBUG libsodium.a - HINTS ${sodium_DIR} + if (libsodium_USE_STATIC_LIBS) + find_library(libsodium_LIBRARY_DEBUG libsodium.a + HINTS ${libsodium_DIR} PATH_SUFFIXES lib ) - find_library(sodium_LIBRARY_RELEASE libsodium.a - HINTS ${sodium_DIR} + find_library(libsodium_LIBRARY_RELEASE libsodium.a + HINTS ${libsodium_DIR} PATH_SUFFIXES lib ) else() - find_library(sodium_LIBRARY_DEBUG libsodium.dll.a - HINTS ${sodium_DIR} + find_library(libsodium_LIBRARY_DEBUG libsodium.dll.a + HINTS ${libsodium_DIR} PATH_SUFFIXES lib ) - find_library(sodium_LIBRARY_RELEASE libsodium.dll.a - HINTS ${sodium_DIR} + find_library(libsodium_LIBRARY_RELEASE libsodium.dll.a + HINTS ${libsodium_DIR} PATH_SUFFIXES lib ) file(GLOB _DLL LIST_DIRECTORIES false - RELATIVE "${sodium_DIR}/bin" - "${sodium_DIR}/bin/libsodium*.dll" + RELATIVE "${libsodium_DIR}/bin" + "${libsodium_DIR}/bin/libsodium*.dll" ) - find_library(sodium_DLL_DEBUG ${_DLL} libsodium - HINTS ${sodium_DIR} + find_library(libsodium_DLL_DEBUG ${_DLL} libsodium + HINTS ${libsodium_DIR} PATH_SUFFIXES bin ) - find_library(sodium_DLL_RELEASE ${_DLL} libsodium - HINTS ${sodium_DIR} + find_library(libsodium_DLL_RELEASE ${_DLL} libsodium + HINTS ${libsodium_DIR} PATH_SUFFIXES bin ) endif() @@ -211,14 +211,14 @@ endif() ######################################################################## # common stuff -# extract sodium version -if (sodium_INCLUDE_DIR) - set(_VERSION_HEADER "${sodium_INCLUDE_DIR}/sodium/version.h") +# extract libsodium version +if (libsodium_INCLUDE_DIR) + set(_VERSION_HEADER "${libsodium_INCLUDE_DIR}/sodium/version.h") if (EXISTS "${_VERSION_HEADER}") file(READ "${_VERSION_HEADER}" _VERSION_HEADER_CONTENT) string(REGEX REPLACE ".*#[ \t]*define[ \t]*SODIUM_VERSION_STRING[ \t]*\"([^\n]*)\".*" "\\1" - sodium_VERSION "${_VERSION_HEADER_CONTENT}") - set(sodium_VERSION "${sodium_VERSION}") + libsodium_VERSION "${_VERSION_HEADER_CONTENT}") + set(libsodium_VERSION "${libsodium_VERSION}") endif() endif() @@ -226,62 +226,63 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(sodium REQUIRED_VARS - sodium_LIBRARY_RELEASE - sodium_LIBRARY_DEBUG - sodium_INCLUDE_DIR + libsodium_LIBRARY_RELEASE + libsodium_LIBRARY_DEBUG + libsodium_INCLUDE_DIR VERSION_VAR - sodium_VERSION + libsodium_VERSION ) # mark file paths as advanced -mark_as_advanced(sodium_INCLUDE_DIR) -mark_as_advanced(sodium_LIBRARY_DEBUG) -mark_as_advanced(sodium_LIBRARY_RELEASE) +mark_as_advanced(libsodium_INCLUDE_DIR) +mark_as_advanced(libsodium_LIBRARY_DEBUG) +mark_as_advanced(libsodium_LIBRARY_RELEASE) if (WIN32) - mark_as_advanced(sodium_DLL_DEBUG) - mark_as_advanced(sodium_DLL_RELEASE) + mark_as_advanced(libsodium_DLL_DEBUG) + mark_as_advanced(libsodium_DLL_RELEASE) endif() # create imported target -if(sodium_USE_STATIC_LIBS) +if(libsodium_USE_STATIC_LIBS) set(_LIB_TYPE STATIC) else() set(_LIB_TYPE SHARED) endif() -add_library(sodium ${_LIB_TYPE} IMPORTED) +add_library(libsodium ${_LIB_TYPE} IMPORTED GLOBAL) -set_target_properties(sodium PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${sodium_INCLUDE_DIR}" +set_target_properties(libsodium PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${libsodium_INCLUDE_DIR}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" ) +add_library(libsodium::libsodium ALIAS libsodium) -if (sodium_USE_STATIC_LIBS) - set_target_properties(sodium PROPERTIES +if (libsodium_USE_STATIC_LIBS) + set_target_properties(libsodium PROPERTIES INTERFACE_COMPILE_DEFINITIONS "SODIUM_STATIC" - IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}" - IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}" + IMPORTED_LOCATION "${libsodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${libsodium_LIBRARY_DEBUG}" ) else() if (UNIX) - set_target_properties(sodium PROPERTIES - IMPORTED_LOCATION "${sodium_LIBRARY_RELEASE}" - IMPORTED_LOCATION_DEBUG "${sodium_LIBRARY_DEBUG}" + set_target_properties(libsodium PROPERTIES + IMPORTED_LOCATION "${libsodium_LIBRARY_RELEASE}" + IMPORTED_LOCATION_DEBUG "${libsodium_LIBRARY_DEBUG}" ) elseif (WIN32) - set_target_properties(sodium PROPERTIES - IMPORTED_IMPLIB "${sodium_LIBRARY_RELEASE}" - IMPORTED_IMPLIB_DEBUG "${sodium_LIBRARY_DEBUG}" + set_target_properties(libsodium PROPERTIES + IMPORTED_IMPLIB "${libsodium_LIBRARY_RELEASE}" + IMPORTED_IMPLIB_DEBUG "${libsodium_LIBRARY_DEBUG}" ) - if (NOT (sodium_DLL_DEBUG MATCHES ".*-NOTFOUND")) - set_target_properties(sodium PROPERTIES - IMPORTED_LOCATION_DEBUG "${sodium_DLL_DEBUG}" + if (NOT (libsodium_DLL_DEBUG MATCHES ".*-NOTFOUND")) + set_target_properties(libsodium PROPERTIES + IMPORTED_LOCATION_DEBUG "${libsodium_DLL_DEBUG}" ) endif() - if (NOT (sodium_DLL_RELEASE MATCHES ".*-NOTFOUND")) - set_target_properties(sodium PROPERTIES - IMPORTED_LOCATION_RELWITHDEBINFO "${sodium_DLL_RELEASE}" - IMPORTED_LOCATION_MINSIZEREL "${sodium_DLL_RELEASE}" - IMPORTED_LOCATION_RELEASE "${sodium_DLL_RELEASE}" + if (NOT (libsodium_DLL_RELEASE MATCHES ".*-NOTFOUND")) + set_target_properties(libsodium PROPERTIES + IMPORTED_LOCATION_RELWITHDEBINFO "${libsodium_DLL_RELEASE}" + IMPORTED_LOCATION_MINSIZEREL "${libsodium_DLL_RELEASE}" + IMPORTED_LOCATION_RELEASE "${libsodium_DLL_RELEASE}" ) endif() endif() diff --git a/cmake/HunterGate.cmake b/cmake/HunterGate.cmake new file mode 100644 index 0000000000000000000000000000000000000000..e78d3e8912a0dcce1a2f22763690e574d5c00e74 --- /dev/null +++ b/cmake/HunterGate.cmake @@ -0,0 +1,528 @@ +# Copyright (c) 2013-2019, Ruslan Baratov +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * 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 HOLDER 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. + +# This is a gate file to Hunter package manager. +# Include this file using `include` command and add package you need, example: +# +# cmake_minimum_required(VERSION 3.2) +# +# include("cmake/HunterGate.cmake") +# HunterGate( +# URL "https://github.com/path/to/hunter/archive.tar.gz" +# SHA1 "798501e983f14b28b10cda16afa4de69eee1da1d" +# ) +# +# project(MyProject) +# +# hunter_add_package(Foo) +# hunter_add_package(Boo COMPONENTS Bar Baz) +# +# Projects: +# * https://github.com/hunter-packages/gate/ +# * https://github.com/ruslo/hunter + +option(HUNTER_ENABLED "Enable Hunter package manager support" ON) + +if(HUNTER_ENABLED) + if(CMAKE_VERSION VERSION_LESS "3.2") + message( + FATAL_ERROR + "At least CMake version 3.2 required for Hunter dependency management." + " Update CMake or set HUNTER_ENABLED to OFF." + ) + endif() +endif() + +include(CMakeParseArguments) # cmake_parse_arguments + +option(HUNTER_STATUS_PRINT "Print working status" ON) +option(HUNTER_STATUS_DEBUG "Print a lot info" OFF) +option(HUNTER_TLS_VERIFY "Enable/disable TLS certificate checking on downloads" ON) + +set(HUNTER_ERROR_PAGE "https://docs.hunter.sh/en/latest/reference/errors") + +function(hunter_gate_status_print) + if(HUNTER_STATUS_PRINT OR HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + message(STATUS "[hunter] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_status_debug) + if(HUNTER_STATUS_DEBUG) + foreach(print_message ${ARGV}) + string(TIMESTAMP timestamp) + message(STATUS "[hunter *** DEBUG *** ${timestamp}] ${print_message}") + endforeach() + endif() +endfunction() + +function(hunter_gate_error_page error_page) + message("------------------------------ ERROR ------------------------------") + message(" ${HUNTER_ERROR_PAGE}/${error_page}.html") + message("-------------------------------------------------------------------") + message("") + message(FATAL_ERROR "") +endfunction() + +function(hunter_gate_internal_error) + message("") + foreach(print_message ${ARGV}) + message("[hunter ** INTERNAL **] ${print_message}") + endforeach() + message("[hunter ** INTERNAL **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("error.internal") +endfunction() + +function(hunter_gate_fatal_error) + cmake_parse_arguments(hunter "" "ERROR_PAGE" "" "${ARGV}") + if("${hunter_ERROR_PAGE}" STREQUAL "") + hunter_gate_internal_error("Expected ERROR_PAGE") + endif() + message("") + foreach(x ${hunter_UNPARSED_ARGUMENTS}) + message("[hunter ** FATAL ERROR **] ${x}") + endforeach() + message("[hunter ** FATAL ERROR **] [Directory:${CMAKE_CURRENT_LIST_DIR}]") + message("") + hunter_gate_error_page("${hunter_ERROR_PAGE}") +endfunction() + +function(hunter_gate_user_error) + hunter_gate_fatal_error(${ARGV} ERROR_PAGE "error.incorrect.input.data") +endfunction() + +function(hunter_gate_self root version sha1 result) + string(COMPARE EQUAL "${root}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("root is empty") + endif() + + string(COMPARE EQUAL "${version}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("version is empty") + endif() + + string(COMPARE EQUAL "${sha1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("sha1 is empty") + endif() + + string(SUBSTRING "${sha1}" 0 7 archive_id) + + set( + hunter_self + "${root}/_Base/Download/Hunter/${version}/${archive_id}/Unpacked" + ) + + set("${result}" "${hunter_self}" PARENT_SCOPE) +endfunction() + +# Set HUNTER_GATE_ROOT cmake variable to suitable value. +function(hunter_gate_detect_root) + # Check CMake variable + string(COMPARE NOTEQUAL "${HUNTER_ROOT}" "" not_empty) + if(not_empty) + set(HUNTER_GATE_ROOT "${HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by cmake variable") + return() + endif() + + # Check environment variable + string(COMPARE NOTEQUAL "$ENV{HUNTER_ROOT}" "" not_empty) + if(not_empty) + set(HUNTER_GATE_ROOT "$ENV{HUNTER_ROOT}" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT detected by environment variable") + return() + endif() + + # Check HOME environment variable + string(COMPARE NOTEQUAL "$ENV{HOME}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{HOME}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug("HUNTER_ROOT set using HOME environment variable") + return() + endif() + + # Check SYSTEMDRIVE and USERPROFILE environment variable (windows only) + if(WIN32) + string(COMPARE NOTEQUAL "$ENV{SYSTEMDRIVE}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{SYSTEMDRIVE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using SYSTEMDRIVE environment variable" + ) + return() + endif() + + string(COMPARE NOTEQUAL "$ENV{USERPROFILE}" "" result) + if(result) + set(HUNTER_GATE_ROOT "$ENV{USERPROFILE}/.hunter" PARENT_SCOPE) + hunter_gate_status_debug( + "HUNTER_ROOT set using USERPROFILE environment variable" + ) + return() + endif() + endif() + + hunter_gate_fatal_error( + "Can't detect HUNTER_ROOT" + ERROR_PAGE "error.detect.hunter.root" + ) +endfunction() + +function(hunter_gate_download dir) + string( + COMPARE + NOTEQUAL + "$ENV{HUNTER_DISABLE_AUTOINSTALL}" + "" + disable_autoinstall + ) + if(disable_autoinstall AND NOT HUNTER_RUN_INSTALL) + hunter_gate_fatal_error( + "Hunter not found in '${dir}'" + "Set HUNTER_RUN_INSTALL=ON to auto-install it from '${HUNTER_GATE_URL}'" + "Settings:" + " HUNTER_ROOT: ${HUNTER_GATE_ROOT}" + " HUNTER_SHA1: ${HUNTER_GATE_SHA1}" + ERROR_PAGE "error.run.install" + ) + endif() + string(COMPARE EQUAL "${dir}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("Empty 'dir' argument") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_SHA1 empty") + endif() + + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" is_bad) + if(is_bad) + hunter_gate_internal_error("HUNTER_GATE_URL empty") + endif() + + set(done_location "${dir}/DONE") + set(sha1_location "${dir}/SHA1") + + set(build_dir "${dir}/Build") + set(cmakelists "${dir}/CMakeLists.txt") + + hunter_gate_status_debug("Locking directory: ${dir}") + file(LOCK "${dir}" DIRECTORY GUARD FUNCTION) + hunter_gate_status_debug("Lock done") + + if(EXISTS "${done_location}") + # while waiting for lock other instance can do all the job + hunter_gate_status_debug("File '${done_location}' found, skip install") + return() + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(MAKE_DIRECTORY "${build_dir}") # check directory permissions + + # Disabling languages speeds up a little bit, reduces noise in the output + # and avoids path too long windows error + file( + WRITE + "${cmakelists}" + "cmake_minimum_required(VERSION 3.2)\n" + "project(HunterDownload LANGUAGES NONE)\n" + "include(ExternalProject)\n" + "ExternalProject_Add(\n" + " Hunter\n" + " URL\n" + " \"${HUNTER_GATE_URL}\"\n" + " URL_HASH\n" + " SHA1=${HUNTER_GATE_SHA1}\n" + " DOWNLOAD_DIR\n" + " \"${dir}\"\n" + " TLS_VERIFY\n" + " ${HUNTER_TLS_VERIFY}\n" + " SOURCE_DIR\n" + " \"${dir}/Unpacked\"\n" + " CONFIGURE_COMMAND\n" + " \"\"\n" + " BUILD_COMMAND\n" + " \"\"\n" + " INSTALL_COMMAND\n" + " \"\"\n" + ")\n" + ) + + if(HUNTER_STATUS_DEBUG) + set(logging_params "") + else() + set(logging_params OUTPUT_QUIET) + endif() + + hunter_gate_status_debug("Run generate") + + # Need to add toolchain file too. + # Otherwise on Visual Studio + MDD this will fail with error: + # "Could not find an appropriate version of the Windows 10 SDK installed on this machine" + if(EXISTS "${CMAKE_TOOLCHAIN_FILE}") + get_filename_component(absolute_CMAKE_TOOLCHAIN_FILE "${CMAKE_TOOLCHAIN_FILE}" ABSOLUTE) + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=${absolute_CMAKE_TOOLCHAIN_FILE}") + else() + # 'toolchain_arg' can't be empty + set(toolchain_arg "-DCMAKE_TOOLCHAIN_FILE=") + endif() + + string(COMPARE EQUAL "${CMAKE_MAKE_PROGRAM}" "" no_make) + if(no_make) + set(make_arg "") + else() + # Test case: remove Ninja from PATH but set it via CMAKE_MAKE_PROGRAM + set(make_arg "-DCMAKE_MAKE_PROGRAM=${CMAKE_MAKE_PROGRAM}") + endif() + + execute_process( + COMMAND + "${CMAKE_COMMAND}" + "-H${dir}" + "-B${build_dir}" + "-G${CMAKE_GENERATOR}" + "${toolchain_arg}" + ${make_arg} + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error( + "Configure project failed." + "To reproduce the error run: ${CMAKE_COMMAND} -H${dir} -B${build_dir} -G${CMAKE_GENERATOR} ${toolchain_arg} ${make_arg}" + "In directory ${dir}" + ) + endif() + + hunter_gate_status_print( + "Initializing Hunter workspace (${HUNTER_GATE_SHA1})" + " ${HUNTER_GATE_URL}" + " -> ${dir}" + ) + execute_process( + COMMAND "${CMAKE_COMMAND}" --build "${build_dir}" + WORKING_DIRECTORY "${dir}" + RESULT_VARIABLE download_result + ${logging_params} + ) + + if(NOT download_result EQUAL 0) + hunter_gate_internal_error("Build project failed") + endif() + + file(REMOVE_RECURSE "${build_dir}") + file(REMOVE_RECURSE "${cmakelists}") + + file(WRITE "${sha1_location}" "${HUNTER_GATE_SHA1}") + file(WRITE "${done_location}" "DONE") + + hunter_gate_status_debug("Finished") +endfunction() + +# Must be a macro so master file 'cmake/Hunter' can +# apply all variables easily just by 'include' command +# (otherwise PARENT_SCOPE magic needed) +macro(HunterGate) + if(HUNTER_GATE_DONE) + # variable HUNTER_GATE_DONE set explicitly for external project + # (see `hunter_download`) + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() + + # First HunterGate command will init Hunter, others will be ignored + get_property(_hunter_gate_done GLOBAL PROPERTY HUNTER_GATE_DONE SET) + + if(NOT HUNTER_ENABLED) + # Empty function to avoid error "unknown function" + function(hunter_add_package) + endfunction() + + set( + _hunter_gate_disabled_mode_dir + "${CMAKE_CURRENT_LIST_DIR}/cmake/Hunter/disabled-mode" + ) + if(EXISTS "${_hunter_gate_disabled_mode_dir}") + hunter_gate_status_debug( + "Adding \"disabled-mode\" modules: ${_hunter_gate_disabled_mode_dir}" + ) + list(APPEND CMAKE_PREFIX_PATH "${_hunter_gate_disabled_mode_dir}") + endif() + elseif(_hunter_gate_done) + hunter_gate_status_debug("Secondary HunterGate (use old settings)") + hunter_gate_self( + "${HUNTER_CACHED_ROOT}" + "${HUNTER_VERSION}" + "${HUNTER_SHA1}" + _hunter_self + ) + include("${_hunter_self}/cmake/Hunter") + else() + set(HUNTER_GATE_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}") + + string(COMPARE NOTEQUAL "${PROJECT_NAME}" "" _have_project_name) + if(_have_project_name) + hunter_gate_fatal_error( + "Please set HunterGate *before* 'project' command. " + "Detected project: ${PROJECT_NAME}" + ERROR_PAGE "error.huntergate.before.project" + ) + endif() + + cmake_parse_arguments( + HUNTER_GATE "LOCAL" "URL;SHA1;GLOBAL;FILEPATH" "" ${ARGV} + ) + + string(COMPARE EQUAL "${HUNTER_GATE_SHA1}" "" _empty_sha1) + string(COMPARE EQUAL "${HUNTER_GATE_URL}" "" _empty_url) + string( + COMPARE + NOTEQUAL + "${HUNTER_GATE_UNPARSED_ARGUMENTS}" + "" + _have_unparsed + ) + string(COMPARE NOTEQUAL "${HUNTER_GATE_GLOBAL}" "" _have_global) + string(COMPARE NOTEQUAL "${HUNTER_GATE_FILEPATH}" "" _have_filepath) + + if(_have_unparsed) + hunter_gate_user_error( + "HunterGate unparsed arguments: ${HUNTER_GATE_UNPARSED_ARGUMENTS}" + ) + endif() + if(_empty_sha1) + hunter_gate_user_error("SHA1 suboption of HunterGate is mandatory") + endif() + if(_empty_url) + hunter_gate_user_error("URL suboption of HunterGate is mandatory") + endif() + if(_have_global) + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has GLOBAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has GLOBAL)") + endif() + endif() + if(HUNTER_GATE_LOCAL) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has LOCAL)") + endif() + if(_have_filepath) + hunter_gate_user_error("Unexpected FILEPATH (already has LOCAL)") + endif() + endif() + if(_have_filepath) + if(_have_global) + hunter_gate_user_error("Unexpected GLOBAL (already has FILEPATH)") + endif() + if(HUNTER_GATE_LOCAL) + hunter_gate_user_error("Unexpected LOCAL (already has FILEPATH)") + endif() + endif() + + hunter_gate_detect_root() # set HUNTER_GATE_ROOT + + # Beautify path, fix probable problems with windows path slashes + get_filename_component( + HUNTER_GATE_ROOT "${HUNTER_GATE_ROOT}" ABSOLUTE + ) + hunter_gate_status_debug("HUNTER_ROOT: ${HUNTER_GATE_ROOT}") + if(NOT HUNTER_ALLOW_SPACES_IN_PATH) + string(FIND "${HUNTER_GATE_ROOT}" " " _contain_spaces) + if(NOT _contain_spaces EQUAL -1) + hunter_gate_fatal_error( + "HUNTER_ROOT (${HUNTER_GATE_ROOT}) contains spaces." + "Set HUNTER_ALLOW_SPACES_IN_PATH=ON to skip this error" + "(Use at your own risk!)" + ERROR_PAGE "error.spaces.in.hunter.root" + ) + endif() + endif() + + string( + REGEX + MATCH + "[0-9]+\\.[0-9]+\\.[0-9]+[-_a-z0-9]*" + HUNTER_GATE_VERSION + "${HUNTER_GATE_URL}" + ) + string(COMPARE EQUAL "${HUNTER_GATE_VERSION}" "" _is_empty) + if(_is_empty) + set(HUNTER_GATE_VERSION "unknown") + endif() + + hunter_gate_self( + "${HUNTER_GATE_ROOT}" + "${HUNTER_GATE_VERSION}" + "${HUNTER_GATE_SHA1}" + _hunter_self + ) + + set(_master_location "${_hunter_self}/cmake/Hunter") + get_filename_component(_archive_id_location "${_hunter_self}/.." ABSOLUTE) + set(_done_location "${_archive_id_location}/DONE") + set(_sha1_location "${_archive_id_location}/SHA1") + + # Check Hunter already downloaded by HunterGate + if(NOT EXISTS "${_done_location}") + hunter_gate_download("${_archive_id_location}") + endif() + + if(NOT EXISTS "${_done_location}") + hunter_gate_internal_error("hunter_gate_download failed") + endif() + + if(NOT EXISTS "${_sha1_location}") + hunter_gate_internal_error("${_sha1_location} not found") + endif() + file(READ "${_sha1_location}" _sha1_value) + string(COMPARE EQUAL "${_sha1_value}" "${HUNTER_GATE_SHA1}" _is_equal) + if(NOT _is_equal) + hunter_gate_internal_error( + "Short SHA1 collision:" + " ${_sha1_value} (from ${_sha1_location})" + " ${HUNTER_GATE_SHA1} (HunterGate)" + ) + endif() + if(NOT EXISTS "${_master_location}") + hunter_gate_user_error( + "Master file not found:" + " ${_master_location}" + "try to update Hunter/HunterGate" + ) + endif() + include("${_master_location}") + set_property(GLOBAL PROPERTY HUNTER_GATE_DONE YES) + endif() +endmacro() diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt deleted file mode 100644 index d669e8a975e642e908ca1fd80b927af94ff7874b..0000000000000000000000000000000000000000 --- a/deps/CMakeLists.txt +++ /dev/null @@ -1,92 +0,0 @@ -cmake_minimum_required(VERSION 3.11) -project(MTXCLIENT_DEPS) - -# Point CMake at any custom modules we may ship -list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") - -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -set(DEPS_INSTALL_DIR "${CMAKE_BINARY_DIR}/usr" - CACHE PATH "Dependencies install directory.") -set(DEPS_BIN_DIR "${DEPS_INSTALL_DIR}/bin" - CACHE PATH "Dependencies binary install directory.") -set(DEPS_LIB_DIR "${DEPS_INSTALL_DIR}/lib" - CACHE PATH "Dependencies library install directory.") -set(DEPS_BUILD_DIR "${CMAKE_BINARY_DIR}/build" - CACHE PATH "Dependencies build directory.") -set(DEPS_DOWNLOAD_DIR "${DEPS_BUILD_DIR}/downloads" - CACHE PATH "Dependencies download directory.") - -option(USE_BUNDLED "Use bundled dependencies." ON) - -option(USE_BUNDLED_BOOST "Use the bundled version of Boost." ${USE_BUNDLED}) -option(USE_BUNDLED_SPDLOG "Use the bundled version of spdlog." ${USE_BUNDLED}) -option(USE_BUNDLED_OLM "Use the bundled version of libolm." ${USE_BUNDLED}) -option(USE_BUNDLED_GTEST "Use the bundled version of Google Test." - ${USE_BUNDLED}) -option(USE_BUNDLED_JSON "Use the bundled version of nlohmann json." ${USE_BUNDLED}) - -option(USE_EXISTING_SRC_DIR - "Skip download of deps sources in case of existing source directory." - OFF) - -include(ExternalProject) - -if(USE_BUNDLED_BOOST) - # bundled boost is 1.70, which requires CMake 3.15 or greater. - cmake_minimum_required(VERSION 3.15) -endif() - -set(BOOST_URL - https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.bz2) -set(BOOST_SHA256 - 430ae8354789de4fd19ee52f3b1f739e1fba576f0aded0897c3c2bc00fb38778) - -set(GTEST_URL https://github.com/google/googletest/archive/release-1.8.0.tar.gz) -set(GTEST_SHA1 e7e646a6204638fe8e87e165292b8dd9cd4c36ed) - -set(OLM_URL https://git.matrix.org/git/olm.git) -set(OLM_TAG 4065c8e11a33ba41133a086ed3de4da94dcb6bae) - -set(SPDLOG_URL https://github.com/gabime/spdlog/archive/v1.1.0.tar.gz) -set(SPDLOG_HASH - 3dbcbfd8c07e25f5e0d662b194d3a7772ef214358c49ada23c044c4747ce8b19) - -set(JSON_URL - https://github.com/nlohmann/json.git) -set(JSON_TAG - v3.2.0) - -if(USE_BUNDLED_JSON) - include(Json) -endif() - -if(USE_BUNDLED_BOOST) - include(Boost) -endif() - -if(USE_BUNDLED_SPDLOG) - include(SpdLog) -endif() - -if(USE_BUNDLED_OLM) - include(Olm) -endif() - -if(USE_BUNDLED_GTEST) - include(GoogleTest) -endif() - -if(WIN32) - if("${TARGET_ARCH}" STREQUAL "X86_64") - set(TARGET_ARCH x64) - elseif(TARGET_ARCH STREQUAL "X86") - set(TARGET_ARCH ia32) - endif() -endif() - -add_custom_target(third-party ALL - COMMAND ${CMAKE_COMMAND} -E touch .third-party - DEPENDS ${THIRD_PARTY_DEPS}) diff --git a/deps/cmake/Boost.cmake b/deps/cmake/Boost.cmake deleted file mode 100644 index bfa3813dc3305a790be68971d53c9707353a0b2f..0000000000000000000000000000000000000000 --- a/deps/cmake/Boost.cmake +++ /dev/null @@ -1,23 +0,0 @@ -if(WIN32) - message(STATUS "Building Boost in Windows is not supported (skipping)") - return() -endif() - -ExternalProject_Add( - Boost - - URL ${BOOST_URL} - URL_HASH SHA256=${BOOST_SHA256} - DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/boost - DOWNLOAD_NO_PROGRESS 0 - - BUILD_IN_SOURCE 1 - SOURCE_DIR ${DEPS_BUILD_DIR}/boost - CONFIGURE_COMMAND ${DEPS_BUILD_DIR}/boost/bootstrap.sh - --with-libraries=random,thread,system,iostreams,atomic,chrono,date_time,regex - --prefix=${DEPS_INSTALL_DIR} - BUILD_COMMAND ${DEPS_BUILD_DIR}/boost/b2 -d0 cxxstd=17 variant=release link=shared runtime-link=shared threading=multi --layout=system - INSTALL_COMMAND ${DEPS_BUILD_DIR}/boost/b2 -d0 install -) - -list(APPEND THIRD_PARTY_DEPS Boost) diff --git a/deps/cmake/GoogleTest.cmake b/deps/cmake/GoogleTest.cmake deleted file mode 100644 index 631d5939341bffa0a10abc3e9cdfc70a3a0c740f..0000000000000000000000000000000000000000 --- a/deps/cmake/GoogleTest.cmake +++ /dev/null @@ -1,24 +0,0 @@ -if(WIN32) - message(STATUS "Building gtest in Windows is not supported (skipping)") - return() -endif() - -ExternalProject_Add( - GTest - - URL ${GTEST_URL} - URL_HASH SHA1=${GTEST_SHA1} - DOWNLOAD_DIR ${DEPS_DOWNLOAD_DIR}/gtest - DOWNLOAD_NO_PROGRESS 0 - - BUILD_IN_SOURCE 1 - SOURCE_DIR ${DEPS_BUILD_DIR}/gtest - CONFIGURE_COMMAND ${CMAKE_COMMAND} - -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR} - -DCMAKE_BUILD_TYPE=Release - ${DEPS_BUILD_DIR}/gtest - BUILD_COMMAND ${CMAKE_COMMAND} - --build ${DEPS_BUILD_DIR}/gtest - --config Release) - -list(APPEND THIRD_PARTY_DEPS GTest) diff --git a/deps/cmake/Json.cmake b/deps/cmake/Json.cmake deleted file mode 100644 index c5e66cea2bbf47d4f0fb157bac0ec75d4d26fa8d..0000000000000000000000000000000000000000 --- a/deps/cmake/Json.cmake +++ /dev/null @@ -1,19 +0,0 @@ -ExternalProject_Add( - Json - - GIT_REPOSITORY ${JSON_URL} - GIT_TAG ${JSON_TAG} - - BUILD_IN_SOURCE 1 - SOURCE_DIR ${DEPS_BUILD_DIR}/json - - CONFIGURE_COMMAND ${CMAKE_COMMAND} - -DJSON_BuildTests=OFF - -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR} - -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE} - - BUILD_COMMAND ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR}/json - INSTALL_COMMAND ${CMAKE_COMMAND} --build ${DEPS_BUILD_DIR}/json --target install -) - -list(APPEND THIRD_PARTY_DEPS Json) diff --git a/deps/cmake/Olm.cmake b/deps/cmake/Olm.cmake deleted file mode 100644 index a5b8be76e34380ec066c866f82e1d1bc58da20b5..0000000000000000000000000000000000000000 --- a/deps/cmake/Olm.cmake +++ /dev/null @@ -1,34 +0,0 @@ -set(WINDOWS_FLAGS "") - -if(MSVC) - set(WINDOWS_FLAGS "-DCMAKE_GENERATOR_PLATFORM=x64") -endif() - -ExternalProject_Add( - Olm - - GIT_REPOSITORY ${OLM_URL} - GIT_TAG ${OLM_TAG} - - BUILD_IN_SOURCE 1 - SOURCE_DIR ${DEPS_BUILD_DIR}/olm - CONFIGURE_COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/OlmCMakeLists.txt - ${DEPS_BUILD_DIR}/olm/CMakeLists.txt - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/cmake/OlmConfig.cmake.in - ${DEPS_BUILD_DIR}/olm/cmake/OlmConfig.cmake.in - COMMAND ${CMAKE_COMMAND} - -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR} - -DCMAKE_BUILD_TYPE=Release - ${DEPS_BUILD_DIR}/olm - ${WINDOWS_FLAGS} - BUILD_COMMAND ${CMAKE_COMMAND} - --build ${DEPS_BUILD_DIR}/olm - --config Release - INSTALL_COMMAND ${CMAKE_COMMAND} - --build ${DEPS_BUILD_DIR}/olm - --config Release - --target install) - -list(APPEND THIRD_PARTY_DEPS Olm) diff --git a/deps/cmake/OlmCMakeLists.txt b/deps/cmake/OlmCMakeLists.txt deleted file mode 100644 index 4e96e1b2f5ee48f2e7931009d7819bf9fa2f0230..0000000000000000000000000000000000000000 --- a/deps/cmake/OlmCMakeLists.txt +++ /dev/null @@ -1,106 +0,0 @@ -cmake_minimum_required(VERSION 3.1) - -project(olm VERSION 2.2.2 LANGUAGES CXX C) - -add_definitions(-DOLMLIB_VERSION_MAJOR=${PROJECT_VERSION_MAJOR}) -add_definitions(-DOLMLIB_VERSION_MINOR=${PROJECT_VERSION_MINOR}) -add_definitions(-DOLMLIB_VERSION_PATCH=${PROJECT_VERSION_PATCH}) - -set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) -set(CMAKE_CXX_STANDARD 11) -set(CMAKE_CXX_STANDARD_REQUIRED ON) -set(CMAKE_C_STANDARD 99) -set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) - -if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release) -endif() - -add_library(olm - src/account.cpp - src/base64.cpp - src/cipher.cpp - src/crypto.cpp - src/memory.cpp - src/message.cpp - src/pickle.cpp - src/ratchet.cpp - src/session.cpp - src/utility.cpp - - src/ed25519.c - src/error.c - src/inbound_group_session.c - src/megolm.c - src/olm.cpp - src/outbound_group_session.c - src/pickle_encoding.c - - lib/crypto-algorithms/aes.c - lib/crypto-algorithms/sha256.c - lib/curve25519-donna/curve25519-donna.c) -add_library(Olm::Olm ALIAS olm) - -target_include_directories(olm - PUBLIC - $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include> - $<INSTALL_INTERFACE:include> - PRIVATE - ${CMAKE_CURRENT_SOURCE_DIR}/lib) - -set_target_properties(olm PROPERTIES - SOVERSION ${PROJECT_VERSION_MAJOR} - VERSION ${PROJECT_VERSION}) - -set_target_properties(olm PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR} - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR} - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) - -# -# Installation -# -include(GNUInstallDirs) -set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/Olm) -install(TARGETS olm - EXPORT olm-targets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - -# The exported target will be named Olm. -set_target_properties(olm PROPERTIES EXPORT_NAME Olm) -install(FILES - ${CMAKE_SOURCE_DIR}/include/olm/olm.h - ${CMAKE_SOURCE_DIR}/include/olm/outbound_group_session.h - ${CMAKE_SOURCE_DIR}/include/olm/inbound_group_session.h - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/olm) - -# Export the targets to a script. -install(EXPORT olm-targets - FILE OlmTargets.cmake - NAMESPACE Olm:: - DESTINATION ${INSTALL_CONFIGDIR}) - -# Create a ConfigVersion.cmake file. -include(CMakePackageConfigHelpers) -configure_package_config_file( - ${CMAKE_CURRENT_LIST_DIR}/cmake/OlmConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/OlmConfig.cmake - INSTALL_DESTINATION ${INSTALL_CONFIGDIR}) -write_basic_package_version_file( - ${CMAKE_CURRENT_BINARY_DIR}/OlmConfigVersion.cmake - VERSION ${PROJECT_VERSION} - COMPATIBILITY SameMajorVersion) - -#Install the config & configversion. -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/OlmConfig.cmake - ${CMAKE_CURRENT_BINARY_DIR}/OlmConfigVersion.cmake - DESTINATION ${INSTALL_CONFIGDIR}) - -# Register package in user's package registry -export(EXPORT olm-targets - FILE ${CMAKE_CURRENT_BINARY_DIR}/OlmTargets.cmake - NAMESPACE Olm::) -export(PACKAGE Olm) diff --git a/deps/cmake/OlmConfig.cmake.in b/deps/cmake/OlmConfig.cmake.in deleted file mode 100644 index b670fe85104dbaf360f4b42e37536b2e747c24d2..0000000000000000000000000000000000000000 --- a/deps/cmake/OlmConfig.cmake.in +++ /dev/null @@ -1,11 +0,0 @@ -get_filename_component(Olm_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) -include(CMakeFindDependencyMacro) - -list(APPEND CMAKE_MODULE_PATH ${Olm_CMAKE_DIR}) -list(REMOVE_AT CMAKE_MODULE_PATH -1) - -if(NOT TARGET Olm::Olm) - include("${Olm_CMAKE_DIR}/OlmTargets.cmake") -endif() - -set(Olm_LIBRARIES Olm::Olm) diff --git a/deps/cmake/SpdLog.cmake b/deps/cmake/SpdLog.cmake deleted file mode 100644 index 7726d88c7fc0284c2f94d9e0df3a34b9e8d83d18..0000000000000000000000000000000000000000 --- a/deps/cmake/SpdLog.cmake +++ /dev/null @@ -1,17 +0,0 @@ -ExternalProject_Add( - SpdLog - - URL ${SPDLOG_URL} - URL_HASH SHA256=${SPDLOG_HASH} - - BUILD_IN_SOURCE 1 - SOURCE_DIR ${DEPS_BUILD_DIR}/spdlog - CONFIGURE_COMMAND ${CMAKE_COMMAND} - -DCMAKE_INSTALL_PREFIX=${DEPS_INSTALL_DIR} - -DCMAKE_BUILD_TYPE=Release - -DSPDLOG_BUILD_EXAMPLES=0 - -DSPDLOG_BUILD_TESTING=0 - ${DEPS_BUILD_DIR}/spdlog -) - -list(APPEND THIRD_PARTY_DEPS SpdLog) diff --git a/toolchain.cmake b/toolchain.cmake new file mode 100644 index 0000000000000000000000000000000000000000..85571957a9f28e1d4aac456d6ce94074edf67187 --- /dev/null +++ b/toolchain.cmake @@ -0,0 +1,3 @@ +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_POSITION_INDEPENDENT_CODE ON)