/* vim:set ts=2 sw=2 sts=2 et: */
/**
* \author Marcus Holland-Moritz (github@mhxnet.de)
* \copyright Copyright (c) Marcus Holland-Moritz
*
* This file is part of dwarfs.
*
* dwarfs is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* dwarfs is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with dwarfs. If not, see .
*/
#include
#include
#include
#include
#include
#include
#include
#ifdef DWARFS_USE_JEMALLOC
#include
#endif
#include
#include
namespace dwarfs {
namespace {
std::string version_to_string(uint64_t version, version_format fmt) {
switch (fmt) {
case version_format::maj_min_patch_dec_100:
return fmt::format("{}.{}.{}", version / 10000, (version / 100) % 100,
version % 100);
case version_format::boost:
return fmt::format("{}.{}.{}", version / 100000, (version / 100) % 1000,
version % 100);
}
throw std::invalid_argument("unsupported version format");
}
#ifdef DWARFS_USE_JEMALLOC
std::string get_jemalloc_version() {
char const* j;
#ifdef __APPLE__
j = JEMALLOC_VERSION;
#else
size_t s = sizeof(j);
::mallctl("version", &j, &s, nullptr, 0);
#endif
std::string rv{j};
if (auto pos = rv.find('-'); pos != std::string::npos) {
rv.erase(pos, std::string::npos);
}
return rv;
}
#endif
} // namespace
std::string library_dependencies::common_as_string() {
library_dependencies deps;
deps.add_common_libraries();
return deps.as_string();
}
void library_dependencies::add_library(std::string const& name_version_string) {
auto tmp = name_version_string;
if (tmp.starts_with("lib")) {
tmp.erase(0, 3);
}
std::replace(tmp.begin(), tmp.end(), ' ', '-');
deps_.insert(tmp);
}
void library_dependencies::add_library(std::string const& library_name,
std::string const& version_string) {
add_library(fmt::format("{}-{}", library_name, version_string));
}
void library_dependencies::add_library(std::string const& library_name,
uint64_t version, version_format fmt) {
add_library(library_name, version_to_string(version, fmt));
}
void library_dependencies::add_library(std::string const& library_name,
unsigned major, unsigned minor,
unsigned patch) {
add_library(library_name, fmt::format("{}.{}.{}", major, minor, patch));
}
void library_dependencies::add_common_libraries() {
add_library("libxxhash", ::XXH_versionNumber(),
version_format::maj_min_patch_dec_100);
add_library("libfmt", FMT_VERSION, version_format::maj_min_patch_dec_100);
add_library("libcrypto", OPENSSL_version_major(), OPENSSL_version_minor(),
OPENSSL_version_patch());
add_library("libboost", BOOST_VERSION, version_format::boost);
#ifdef DWARFS_USE_JEMALLOC
add_library("libjemalloc", get_jemalloc_version());
#endif
add_library("phmap", PHMAP_VERSION_MAJOR, PHMAP_VERSION_MINOR,
PHMAP_VERSION_PATCH);
compression_registry::instance().for_each_algorithm(
[this](compression_type, compression_info const& info) {
for (auto const& lib : info.library_dependencies()) {
add_library(lib);
}
});
}
std::string library_dependencies::as_string() const {
static constexpr size_t width{80};
static constexpr std::string_view prefix{"using: "};
std::string rv{prefix};
size_t col = prefix.size();
bool first{true};
for (auto const& dep : deps_) {
if (col + dep.size() + 2 > width) {
rv += ",\n";
rv.append(prefix.size(), ' ');
col = prefix.size();
} else if (!first) {
rv += ", ";
col += 2;
}
rv += dep;
col += dep.size();
first = false;
}
return rv;
}
} // namespace dwarfs