/* 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 # include # include # include # include # include # include # include # include # include "cmThirdParty.h" // IWYU pragma: keep # ifdef CMAKE_USE_SYSTEM_LIBRHASH # include # include # endif # include # include # include "cmStringAlgorithms.h" std::vector const& cmVersion::CollectDependencyInfo() { static std::vector 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