|
|
@@ -0,0 +1,363 @@
|
|
|
+/* 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
|