| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file LICENSE.rst or https://cmake.org/licensing for details. */ |
| #include "cmVersion.h" |
| |
| #if !defined(CMAKE_BOOTSTRAP) |
| # include <cstddef> |
| # include <string> |
| # include <utility> |
| # include <vector> |
| |
| # include <cm3p/archive.h> |
| # include <cm3p/curl/curl.h> |
| # include <cm3p/expat.h> |
| # include <cm3p/json/version.h> |
| # include <cm3p/kwiml/version.h> |
| |
| # include "cmThirdParty.h" // IWYU pragma: keep |
| |
| # ifdef CMAKE_USE_SYSTEM_LIBRHASH |
| # include <cstdint> |
| |
| # include <cm3p/rhash.h> |
| # endif |
| # include <cm3p/uv.h> |
| # include <cm3p/zlib.h> |
| |
| # include "cmStringAlgorithms.h" |
| |
| std::vector<cmVersion::DependencyInfo> const& |
| cmVersion::CollectDependencyInfo() |
| { |
| static std::vector<DependencyInfo> deps; |
| if (!deps.empty()) { |
| return deps; |
| } |
| |
| // BZIP2 is not directly used in CMake, so it is not included here |
| |
| // BZIP2 (libarchive) |
| { |
| char const* bzip2Version = archive_bzlib_version(); |
| if (bzip2Version) { |
| DependencyInfo info; |
| info.name = "bzip2"; |
| info.version = bzip2Version; |
| info.cameFrom = "libarchive"; |
| size_t pos = info.version.find(','); |
| if (pos != std::string::npos) { |
| // Convert `1.0.8, 30-Mar-2009` to `1.0.8` |
| info.version.erase(pos); |
| } |
| # if defined(CMAKE_USE_SYSTEM_BZIP2) || defined(CMAKE_USE_SYSTEM_LIBARCHIVE) |
| // System BZIP2 can be used by system or bundled libarchive |
| // System libarchive always uses system BZIP2 |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| } |
| |
| // CPPDAP |
| { |
| DependencyInfo info; |
| info.name = "cppdap"; |
| # ifdef CMAKE_USE_SYSTEM_CPPDAP |
| info.type = DependencyType::System; |
| // Cannot get runtime version from cppdap library |
| # else |
| info.type = DependencyType::Bundled; |
| // Hardcoded in protocol.h header file comments |
| info.version = "1.65.0"; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // CURL |
| { |
| curl_version_info_data* curlVersion = curl_version_info(CURLVERSION_NOW); |
| if (curlVersion) { |
| // CURL itself |
| { |
| DependencyInfo info; |
| info.name = "curl"; |
| if (curlVersion->version) { |
| info.version = curlVersion->version; |
| } |
| # ifdef CMAKE_USE_SYSTEM_CURL |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // Cannot use CURL_AT_LEAST_VERSION and CURL_VERSION_BITS macros, |
| // because they needs at least curl 7.43.0, |
| // but we support curl 7.29.0 from CentOS 7 |
| # if LIBCURL_VERSION_NUM >= 0x074200 |
| // NGHTTP2 (curl) |
| // Added in curl 7.66.0 (0x074200), CURLVERSION_SIXTH |
| if (curlVersion->age >= CURLVERSION_SIXTH && |
| curlVersion->nghttp2_version) { |
| DependencyInfo info; |
| info.name = "nghttp2"; |
| info.cameFrom = "curl"; |
| |
| info.version = curlVersion->nghttp2_version; |
| |
| # if defined(CMAKE_USE_SYSTEM_NGHTTP2) || defined(CMAKE_USE_SYSTEM_CURL) |
| // System CURL always uses system NGHTTP2 |
| // System NGHTTP2 can be used by system or bundled CURL |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| # endif |
| |
| // OPENSSL (curl) |
| if (curlVersion->ssl_version) { |
| DependencyInfo info; |
| info.name = "ssl"; |
| info.cameFrom = "curl"; |
| info.version = curlVersion->ssl_version; |
| |
| // With Multi-SSL, the version string is `OpenSSL/3.3.5, |
| // BoringSSL/3.3.5`, etc. |
| if (cmHasLiteralPrefix(info.version, "OpenSSL/") && |
| info.version.find('/', 8) == std::string::npos) { |
| info.name = "openssl"; |
| info.version.erase(0, 8); |
| } |
| // Bundled version of OpenSSL is not presented |
| // Multi-SSL can be used by system CURL only, |
| // so the SSL library is always system |
| info.type = DependencyType::System; |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // ZLIB (curl) |
| if (curlVersion->libz_version) { |
| DependencyInfo info; |
| info.name = "zlib"; |
| info.cameFrom = "curl"; |
| info.version = curlVersion->libz_version; |
| # if defined(CMAKE_USE_SYSTEM_ZLIB) || defined(CMAKE_USE_SYSTEM_CURL) |
| // System CURL always uses system ZLIB |
| // System ZLIB can be used by system or bundled CURL |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| } |
| } |
| |
| // EXPAT |
| { |
| DependencyInfo info; |
| info.name = "expat"; |
| |
| XML_Expat_Version version = XML_ExpatVersionInfo(); |
| info.version = |
| cmStrCat(version.major, '.', version.minor, '.', version.micro); |
| # ifdef CMAKE_USE_SYSTEM_EXPAT |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // FORM |
| { |
| DependencyInfo info; |
| info.name = "form"; |
| // Cannot get any version from form library |
| # ifdef CMAKE_USE_SYSTEM_FORM |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // JSONCPP |
| { |
| DependencyInfo info; |
| info.name = "jsoncpp"; |
| info.version = JSONCPP_VERSION_STRING; |
| # ifdef CMAKE_USE_SYSTEM_JSONCPP |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // KWIML |
| { |
| DependencyInfo info; |
| info.name = "kwiml"; |
| |
| // Library is header-only, so we can safely use the defined version |
| info.version = KWIML_VERSION_STRING; |
| |
| # ifdef CMAKE_USE_SYSTEM_KWIML |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // LIBARCHIVE |
| { |
| DependencyInfo info; |
| info.name = "libarchive"; |
| info.version = archive_version_string(); |
| if (cmHasLiteralPrefix(info.version, "libarchive ")) { |
| info.version.erase(0, 11); |
| } |
| # ifdef CMAKE_USE_SYSTEM_LIBARCHIVE |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // LIBLZMA is not directly used in CMake, so it is not included here |
| |
| // LIBLZMA (libarchive) |
| { |
| char const* liblzmaVersion = archive_liblzma_version(); |
| if (liblzmaVersion) { |
| DependencyInfo info; |
| info.name = "liblzma"; |
| info.cameFrom = "libarchive"; |
| info.version = liblzmaVersion; |
| # if defined(CMAKE_USE_SYSTEM_LIBLZMA) || defined(CMAKE_USE_SYSTEM_LIBARCHIVE) |
| // System LIBLZMA can be used by system or bundled libarchive |
| // System libarchive always uses system LIBLZMA |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| } |
| |
| // LIBRHASH |
| { |
| DependencyInfo info; |
| info.name = "librhash"; |
| # ifdef CMAKE_USE_SYSTEM_LIBRHASH |
| info.type = DependencyType::System; |
| std::uint64_t version = rhash_get_version(); |
| std::uint8_t major = (version >> 24) & 0xFFu; |
| std::uint8_t minor = (version >> 16) & 0xFFu; |
| std::uint8_t patch = (version >> 8) & 0xFFu; |
| info.version = cmStrCat(major, '.', minor, '.', patch); |
| # else |
| info.type = DependencyType::Bundled; |
| // Hardcoded in `update-librhash.bash` script |
| info.version = "1.4.4"; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // LIBUV |
| { |
| DependencyInfo info; |
| info.name = "libuv"; |
| info.version = uv_version_string(); |
| # ifdef CMAKE_USE_SYSTEM_LIBUV |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // OPENSSL is not directly used in CMake, so it is not included here |
| |
| # if ARCHIVE_VERSION_NUMBER >= 3008000 |
| // OPENSSL (libarchive) |
| // This function is available in libarchive 3.8.0 (3008000) and newer |
| { |
| char const* opensslVersion = archive_openssl_version(); |
| if (opensslVersion) { |
| DependencyInfo info; |
| info.name = "openssl"; |
| info.cameFrom = "libarchive"; |
| info.version = opensslVersion; |
| // Bundled version of OpenSSL is not presented |
| info.type = DependencyType::System; |
| deps.emplace_back(std::move(info)); |
| } |
| } |
| # endif |
| |
| // ZLIB |
| { |
| DependencyInfo info; |
| info.name = "zlib"; |
| info.version = zlibVersion(); |
| # ifdef CMAKE_USE_SYSTEM_ZLIB |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| |
| // ZLIB (libarchive) |
| { |
| char const* zlibVersion = archive_zlib_version(); |
| if (zlibVersion) { |
| DependencyInfo info; |
| info.name = "zlib"; |
| info.cameFrom = "libarchive"; |
| info.version = zlibVersion; |
| # if defined(CMAKE_USE_SYSTEM_ZLIB) || defined(CMAKE_USE_SYSTEM_LIBARCHIVE) |
| // System ZLIB can be used by system or bundled libarchive |
| // System libarchive always uses system ZLIB |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| } |
| |
| // ZSTD is not directly used in CMake, so it is not included here |
| |
| // ZSTD (libarchive) |
| { |
| char const* zstdVersion = archive_libzstd_version(); |
| if (zstdVersion) { |
| DependencyInfo info; |
| info.name = "zstd"; |
| info.cameFrom = "libarchive"; |
| info.version = zstdVersion; |
| # if defined(CMAKE_USE_SYSTEM_ZSTD) || defined(CMAKE_USE_SYSTEM_LIBARCHIVE) |
| // System ZSTD can be used by system or bundled libarchive |
| // System libarchive always uses system ZSTD |
| info.type = DependencyType::System; |
| # else |
| info.type = DependencyType::Bundled; |
| # endif |
| deps.emplace_back(std::move(info)); |
| } |
| } |
| |
| return deps; |
| } |
| |
| #endif |