Version: print libc version used when compiling

This commit is contained in:
李通洲
2023-10-05 19:06:15 +08:00
parent 1dfa0315db
commit 23d2cc3fdc
8 changed files with 171 additions and 2 deletions
+5
View File
@@ -385,6 +385,7 @@ if(LINUX)
src/detection/gtk_qt/gtk.c
src/detection/host/host_linux.c
src/detection/icons/icons_linux.c
src/detection/libc/libc_linux.c
src/detection/lm/lm_linux.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_linux.c
@@ -433,6 +434,7 @@ elseif(ANDROID)
src/detection/gpu/gpu_nosupport.c
src/detection/host/host_android.c
src/detection/icons/icons_nosupport.c
src/detection/libc/libc_android.c
src/detection/lm/lm_nosupport.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_nosupport.c
@@ -488,6 +490,7 @@ elseif(BSD)
src/detection/host/host_bsd.c
src/detection/lm/lm_linux.c
src/detection/icons/icons_linux.c
src/detection/libc/libc_nosupport.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_bsd.c
src/detection/media/media_linux.c
@@ -537,6 +540,7 @@ elseif(APPLE)
src/detection/host/host_apple.c
src/detection/lm/lm_nosupport.c
src/detection/icons/icons_nosupport.c
src/detection/libc/libc_nosupport.c
src/detection/localip/localip_linux.c
src/detection/gamepad/gamepad_apple.c
src/detection/media/media_apple.m
@@ -585,6 +589,7 @@ elseif(WIN32)
src/detection/gpu/gpu_windows.c
src/detection/host/host_windows.c
src/detection/icons/icons_windows.c
src/detection/libc/libc_windows.cpp
src/detection/lm/lm_nosupport.c
src/detection/localip/localip_windows.c
src/detection/gamepad/gamepad_windows.c
+16
View File
@@ -0,0 +1,16 @@
#pragma once
#ifndef FF_INCLUDED_detection_libc_libc
#define FF_INCLUDED_detection_libc_libc
#include "fastfetch.h"
typedef struct FFLibcResult
{
const char* name;
const char* version;
} FFLibcResult;
const char* ffDetectLibc(FFLibcResult* result);
#endif
+25
View File
@@ -0,0 +1,25 @@
#include "libc.h"
#define FF_STR_INDIR(x) #x
#define FF_STR(x) FF_STR_INDIR(x)
#include <features.h>
const char* ffDetectLibc(FFLibcResult* result)
{
#if __ANDROID_NDK__
result->name = "ndk-bionic";
result->version = FF_STR(__NDK_MAJOR__) "." FF_STR(__NDK_MINOR__) "." FF_STR(__NDK_BUILD__)
#if __NDK_BETA__
"-beta" FF_STR(__NDK_BETA__)
#elif __NDK_CANARY__
"-canary"
#endif
;
return NULL;
#else
return "Unknown Android libc";
#endif
}
+19
View File
@@ -0,0 +1,19 @@
#include "libc.h"
#define FF_STR_INDIR(x) #x
#define FF_STR(x) FF_STR_INDIR(x)
#include <features.h>
const char* ffDetectLibc(FFLibcResult* result)
{
#ifdef __GNU_LIBRARY__
result->name = "glibc";
result->version = FF_STR(__GLIBC__) "." FF_STR(__GLIBC_MINOR__);
#else
result->name = "musl";
result->version = NULL;
#endif
return NULL;
}
+9
View File
@@ -0,0 +1,9 @@
#include "libc.h"
#define FF_STR_INDIR(x) #x
#define FF_STR(x) FF_STR_INDIR(x)
const char* ffDetectLibc(FF_MAYBE_UNUSED FFLibcResult* result)
{
return "Not supported on this platform";
}
+65
View File
@@ -0,0 +1,65 @@
extern "C"
{
#include "libc.h"
}
#ifdef __MINGW32__
#include <_mingw.h>
#endif
template<uint32_t Major, uint32_t Minor>
class version_t {
constexpr static auto buflen() noexcept {
unsigned int len = 2; // "."
if (Major == 0)
len++;
else
for (auto n = Major; n; len++, n /= 10);
if (Minor == 0)
len++;
else
for (auto n = Minor; n; len++, n /= 10);
return len;
}
char buf[buflen()] = {};
public:
constexpr version_t() noexcept {
auto ptr = buf + buflen();
*--ptr = '\0';
if (Minor == 0) {
*--ptr = '0';
} else {
for (auto n = Minor; n; n /= 10)
*--ptr = "0123456789"[n % 10];
}
*--ptr = '.';
if (Major == 0) {
*--ptr = '0';
} else {
for (auto n = Major; n; n /= 10)
*--ptr = "0123456789"[n % 10];
}
}
constexpr operator const char *() const { return buf; }
};
template<uint32_t Major, uint32_t Minor>
constexpr version_t<Major, Minor> version;
extern "C"
const char* ffDetectLibc(FFLibcResult* result)
{
#ifdef _UCRT
result->name = "ucrt";
#else
result->name = "msvcrt";
#endif
result->version = version<(__MSVCRT_VERSION__ >> 8), (__MSVCRT_VERSION__ & 8)>;
return NULL;
}
+1 -1
View File
@@ -468,7 +468,7 @@ static inline void printCommandHelp(const char* command)
}
else if(ffStrEqualsIgnCase(command, "version-format"))
{
constructAndPrintCommandHelpFormat("version", "{1} {2}{3} ({5})", 8,
constructAndPrintCommandHelpFormat("version", "{1} {2}{3} ({5})", 9,
"Project name",
"Version",
"Version tweak",
+31 -1
View File
@@ -1,10 +1,11 @@
#include "common/printing.h"
#include "common/jsonconfig.h"
#include "detection/libc/libc.h"
#include "detection/version/version.h"
#include "modules/version/version.h"
#include "util/stringUtils.h"
#define FF_VERSION_NUM_FORMAT_ARGS 8
#define FF_VERSION_NUM_FORMAT_ARGS 9
void ffPrintVersion(FFVersionOptions* options)
{
@@ -18,6 +19,18 @@ void ffPrintVersion(FFVersionOptions* options)
}
else
{
FFLibcResult libcResult;
FF_STRBUF_AUTO_DESTROY buf = ffStrbufCreate();
if (!ffDetectLibc(&libcResult))
{
ffStrbufSetS(&buf, libcResult.name);
if (libcResult.version)
{
ffStrbufAppendC(&buf, ' ');
ffStrbufAppendS(&buf, libcResult.version);
}
}
ffPrintFormat(FF_VERSION_MODULE_NAME, 0, &options->moduleArgs, FF_VERSION_NUM_FORMAT_ARGS, (FFformatarg[]){
{FF_FORMAT_ARG_TYPE_STRING, result.projectName},
{FF_FORMAT_ARG_TYPE_STRING, result.version},
@@ -27,6 +40,7 @@ void ffPrintVersion(FFVersionOptions* options)
{FF_FORMAT_ARG_TYPE_STRING, result.cmakeBuiltType},
{FF_FORMAT_ARG_TYPE_STRING, result.compileTime},
{FF_FORMAT_ARG_TYPE_STRING, result.compiler},
{FF_FORMAT_ARG_TYPE_STRBUF, &buf},
});
}
}
@@ -83,4 +97,20 @@ void ffGenerateVersionJson(FF_MAYBE_UNUSED FFVersionOptions* options, yyjson_mut
yyjson_mut_obj_add_str(doc, obj, "compileTime", result.compileTime);
yyjson_mut_obj_add_str(doc, obj, "compiler", result.compiler);
yyjson_mut_obj_add_bool(doc, obj, "debugMode", result.debugMode);
FFLibcResult libcResult;
if (ffDetectLibc(&libcResult))
{
yyjson_mut_obj_add_null(doc, obj, "libc");
}
else
{
FF_STRBUF_AUTO_DESTROY buf = ffStrbufCreateS(libcResult.name);
if (libcResult.version)
{
ffStrbufAppendC(&buf, ' ');
ffStrbufAppendS(&buf, libcResult.version);
}
yyjson_mut_obj_add_strbuf(doc, obj, "libc", &buf);
}
}