From 6b9a6fd103f9be6f978afe0e1127417a24c9b441 Mon Sep 17 00:00:00 2001 From: Carter Li Date: Thu, 28 May 2026 15:38:18 +0800 Subject: [PATCH] CMake: adds `MODULE_` options to disable modules --- CMakeLists.txt | 19 ++++ src/common/impl/commandoption.c | 10 ++ src/common/impl/init.c | 2 + src/common/impl/jsonconfig.c | 14 +++ src/detection/media/media_apple.m | 5 +- src/logo/logo.c | 6 ++ src/modules/modules.c | 153 ++++++++++++++++++++++++++++++ 7 files changed, 208 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7aa83d306..d56614cb3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -116,6 +116,14 @@ if(APPLE) option(ENABLE_APPLE_MEMSIZE_USABLE "Use usable memory size as total memory size in Memory module, to match other systems" OFF) endif() +file(GLOB FF_MODULE_DIRS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/src/modules" "${CMAKE_CURRENT_SOURCE_DIR}/src/modules/*/") +foreach(FF_MODULE_DIR ${FF_MODULE_DIRS}) + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/modules/${FF_MODULE_DIR}") + string(TOUPPER "${FF_MODULE_DIR}" FF_MODULE_UPPER) + option(MODULE_${FF_MODULE_UPPER} "Enable module ${FF_MODULE_DIR}" ON) + endif() +endforeach() + set(BINARY_LINK_TYPE_OPTIONS dlopen dynamic static) set(BINARY_LINK_TYPE dlopen CACHE STRING "How to link fastfetch") set_property(CACHE BINARY_LINK_TYPE PROPERTY STRINGS ${BINARY_LINK_TYPE_OPTIONS}) @@ -1384,6 +1392,17 @@ add_library(libfastfetch OBJECT ${LIBFASTFETCH_SRC} ) +foreach(FF_MODULE_DIR ${FF_MODULE_DIRS}) + if(IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/modules/${FF_MODULE_DIR}") + string(TOUPPER "${FF_MODULE_DIR}" FF_MODULE_UPPER) + if(MODULE_${FF_MODULE_UPPER}) + target_compile_definitions(libfastfetch PUBLIC FF_MODULE_${FF_MODULE_UPPER}=1) + else() + target_compile_definitions(libfastfetch PUBLIC FF_MODULE_${FF_MODULE_UPPER}=0) + endif() + endif() +endforeach() + include(CheckCSourceCompiles) check_c_source_compiles("int main(void){int arr[1];return _Countof(arr);}" COMPILER_SUPPORTS_COUNT_OF) if(COMPILER_SUPPORTS_COUNT_OF) diff --git a/src/common/impl/commandoption.c b/src/common/impl/commandoption.c index 75ed62158..c36f5f7e3 100644 --- a/src/common/impl/commandoption.c +++ b/src/common/impl/commandoption.c @@ -70,12 +70,15 @@ void ffPrepareCommandOption(FFdata* data) { #define FF_IF_MODULE_MATCH(moduleNameConstant) if (moduleLen == strlen(moduleNameConstant) && ffStrEqualsIgnCase(moduleType, moduleNameConstant) && !ffStrbufSeparatedContainIgnCaseS(&data->structureDisabled, moduleNameConstant, ':')) switch (moduleType[0]) { + #if FF_MODULE_CPUUSAGE case 'C': case 'c': FF_IF_MODULE_MATCH(FF_CPUUSAGE_MODULE_NAME) ffPrepareCPUUsage(); break; + #endif + #if FF_MODULE_DISKIO case 'D': case 'd': FF_IF_MODULE_MATCH(FF_DISKIO_MODULE_NAME) { @@ -84,7 +87,9 @@ void ffPrepareCommandOption(FFdata* data) { ffPrepareDiskIO(&options); } break; + #endif + #if FF_MODULE_NETIO case 'N': case 'n': FF_IF_MODULE_MATCH(FF_NETIO_MODULE_NAME) { @@ -93,7 +98,9 @@ void ffPrepareCommandOption(FFdata* data) { ffPrepareNetIO(&options); } break; + #endif + #if FF_MODULE_PUBLICIP case 'P': case 'p': FF_IF_MODULE_MATCH(FF_PUBLICIP_MODULE_NAME) { @@ -102,7 +109,9 @@ void ffPrepareCommandOption(FFdata* data) { ffPreparePublicIp(&options); } break; + #endif + #if FF_MODULE_WEATHER case 'W': case 'w': FF_IF_MODULE_MATCH(FF_WEATHER_MODULE_NAME) { @@ -111,6 +120,7 @@ void ffPrepareCommandOption(FFdata* data) { ffPrepareWeather(&options); } break; + #endif } #undef FF_IF_MODULE_MATCH diff --git a/src/common/impl/init.c b/src/common/impl/init.c index d3285f952..55d52b789 100644 --- a/src/common/impl/init.c +++ b/src/common/impl/init.c @@ -29,6 +29,7 @@ static void initState(FFstate* state) { ffPlatformInit(&state->platform); state->dynamicInterval = 0; + #if FF_MODULE_TERMINALTHEME { // don't enable bright color if the terminal is in light mode FFTerminalThemeResult result; @@ -36,6 +37,7 @@ static void initState(FFstate* state) { state->terminalLightTheme = true; } } + #endif } static void defaultConfig(void) { diff --git a/src/common/impl/jsonconfig.c b/src/common/impl/jsonconfig.c index 1a30f6b5f..07e9b39d6 100644 --- a/src/common/impl/jsonconfig.c +++ b/src/common/impl/jsonconfig.c @@ -133,6 +133,7 @@ static bool parseModuleJsonObject(const char* type, yyjson_val* jsonVal, yyjson_ static void prepareModuleJsonObject(const char* type, yyjson_val* module) { switch (type[0]) { + #if FF_MODULE_CPUUSAGE case 'c': case 'C': { if (ffStrEqualsIgnCase(type, FF_CPUUSAGE_MODULE_NAME)) { @@ -147,6 +148,9 @@ static void prepareModuleJsonObject(const char* type, yyjson_val* module) { } break; } + #endif + + #if FF_MODULE_DISKIO case 'd': case 'D': { if (ffStrEqualsIgnCase(type, FF_DISKIO_MODULE_NAME)) { @@ -159,6 +163,9 @@ static void prepareModuleJsonObject(const char* type, yyjson_val* module) { } break; } + #endif + + #if FF_MODULE_NETIO case 'n': case 'N': { if (ffStrEqualsIgnCase(type, FF_NETIO_MODULE_NAME)) { @@ -171,6 +178,9 @@ static void prepareModuleJsonObject(const char* type, yyjson_val* module) { } break; } + #endif + + #if FF_MODULE_PUBLICIP case 'p': case 'P': { if (ffStrEqualsIgnCase(type, FF_PUBLICIP_MODULE_NAME)) { @@ -183,6 +193,9 @@ static void prepareModuleJsonObject(const char* type, yyjson_val* module) { } break; } + #endif + + #if FF_MODULE_WEATHER case 'w': case 'W': { if (ffStrEqualsIgnCase(type, FF_WEATHER_MODULE_NAME)) { @@ -195,6 +208,7 @@ static void prepareModuleJsonObject(const char* type, yyjson_val* module) { } break; } + #endif } } diff --git a/src/detection/media/media_apple.m b/src/detection/media/media_apple.m index e99196c86..65191cf99 100644 --- a/src/detection/media/media_apple.m +++ b/src/detection/media/media_apple.m @@ -110,7 +110,9 @@ static const char* getMediaByMediaRemote(FFMediaResult* result, bool saveCover) return error; } -__attribute__((visibility("default"), used)) int ffPrintMediaByMediaRemote(bool saveCover) { +#if FF_MODULE_MEDIA +__attribute__((visibility("default"), used)) +int ffPrintMediaByMediaRemote(bool saveCover) { FFMediaResult media = { .status = ffStrbufCreate(), .song = ffStrbufCreate(), @@ -151,6 +153,7 @@ __attribute__((visibility("default"), used)) int ffPrintMediaByMediaRemote(bool ffStrbufDestroy(&media.cover); return 0; } +#endif static const char* getMediaByAuthorizedProcess(FFMediaResult* result, bool saveCover) { // #1737 diff --git a/src/logo/logo.c b/src/logo/logo.c index 48696b1d3..9dad028ef 100644 --- a/src/logo/logo.c +++ b/src/logo/logo.c @@ -461,6 +461,7 @@ static bool updateLogoPath(void) { return true; } + #if FF_MODULE_MEDIA if (ffStrbufIgnCaseEqualS(&options->source, "media-cover")) { const FFMediaResult* media = ffDetectMedia(true); if (media->cover.length == 0) { @@ -469,6 +470,7 @@ static bool updateLogoPath(void) { ffStrbufSet(&options->source, &media->cover); return true; } + #endif FF_STRBUF_AUTO_DESTROY fullPath = ffStrbufCreateA(128); if (ffPathExpandEnv(options->source.chars, &fullPath) && ffPathExists(fullPath.chars, FF_PATHTYPE_FILE)) { @@ -637,6 +639,7 @@ void ffLogoPrint(void) { } if (!ffStrbufEndsWithIgnCaseS(&options->source, ".txt")) { + #if FF_MODULE_TERMINAL const FFTerminalResult* terminal = ffDetectTerminal(); bool supportsIterm2 = ffStrbufEqualS(&terminal->prettyName, "iTerm"); @@ -658,6 +661,9 @@ void ffLogoPrint(void) { ffStrbufIgnCaseEqualS(&terminal->processName, "warp") || #endif false; + #else + bool supportsKitty = false; + #endif // Try to load the logo as an image. If it succeeds, print it and return. if (logoPrintImageIfExists(supportsKitty ? FF_LOGO_TYPE_IMAGE_KITTY : FF_LOGO_TYPE_IMAGE_CHAFA, false)) { diff --git a/src/modules/modules.c b/src/modules/modules.c index fe72923af..a71267b6c 100644 --- a/src/modules/modules.c +++ b/src/modules/modules.c @@ -1,69 +1,136 @@ #include "modules/modules.h" +// Note: +// FF_MODULE_ only controls if the module is registered, +// the module code itself is still compiled. +// We rely `LTO` to remove the unused code (only enabled in Release mode) + static FFModuleBaseInfo* A[] = { NULL, }; static FFModuleBaseInfo* B[] = { +#if FF_MODULE_BATTERY &ffBatteryModuleInfo, +#endif +#if FF_MODULE_BIOS &ffBiosModuleInfo, +#endif +#if FF_MODULE_BLUETOOTH &ffBluetoothModuleInfo, +#endif +#if FF_MODULE_BLUETOOTHRADIO &ffBluetoothRadioModuleInfo, +#endif +#if FF_MODULE_BOARD &ffBoardModuleInfo, +#endif +#if FF_MODULE_BOOTMGR &ffBootmgrModuleInfo, +#endif +#if FF_MODULE_BREAK &ffBreakModuleInfo, +#endif +#if FF_MODULE_BRIGHTNESS &ffBrightnessModuleInfo, +#endif +#if FF_MODULE_BTRFS &ffBtrfsModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* C[] = { +#if FF_MODULE_CAMERA &ffCameraModuleInfo, +#endif +#if FF_MODULE_CHASSIS &ffChassisModuleInfo, +#endif +#if FF_MODULE_COMMAND &ffCommandModuleInfo, +#endif +#if FF_MODULE_COLORS &ffColorsModuleInfo, +#endif +#if FF_MODULE_CPU &ffCPUModuleInfo, +#endif +#if FF_MODULE_CPUCACHE &ffCPUCacheModuleInfo, +#endif +#if FF_MODULE_CPUUSAGE &ffCPUUsageModuleInfo, +#endif +#if FF_MODULE_CURSOR &ffCursorModuleInfo, +#endif +#if FF_MODULE_CUSTOM &ffCustomModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* D[] = { +#if FF_MODULE_DATETIME &ffDateTimeModuleInfo, +#endif +#if FF_MODULE_DE &ffDEModuleInfo, +#endif +#if FF_MODULE_DISPLAY &ffDisplayModuleInfo, +#endif +#if FF_MODULE_DISK &ffDiskModuleInfo, +#endif +#if FF_MODULE_DISKIO &ffDiskIOModuleInfo, +#endif +#if FF_MODULE_DNS &ffDNSModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* E[] = { +#if FF_MODULE_EDITOR &ffEditorModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* F[] = { +#if FF_MODULE_FONT &ffFontModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* G[] = { +#if FF_MODULE_GAMEPAD &ffGamepadModuleInfo, +#endif +#if FF_MODULE_GPU &ffGPUModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* H[] = { +#if FF_MODULE_HOST &ffHostModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* I[] = { +#if FF_MODULE_ICONS &ffIconsModuleInfo, +#endif +#if FF_MODULE_INITSYSTEM &ffInitSystemModuleInfo, +#endif NULL, }; @@ -72,48 +139,92 @@ static FFModuleBaseInfo* J[] = { }; static FFModuleBaseInfo* K[] = { +#if FF_MODULE_KERNEL &ffKernelModuleInfo, +#endif +#if FF_MODULE_KEYBOARD &ffKeyboardModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* L[] = { +#if FF_MODULE_LM &ffLMModuleInfo, +#endif +#if FF_MODULE_LOADAVG &ffLoadavgModuleInfo, +#endif +#if FF_MODULE_LOCALE &ffLocaleModuleInfo, +#endif +#if FF_MODULE_LOCALIP &ffLocalIPModuleInfo, +#endif +#if FF_MODULE_LOGO &ffLogoModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* M[] = { +#if FF_MODULE_MEDIA &ffMediaModuleInfo, +#endif +#if FF_MODULE_MEMORY &ffMemoryModuleInfo, +#endif +#if FF_MODULE_MONITOR &ffMonitorModuleInfo, +#endif +#if FF_MODULE_MOUSE &ffMouseModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* N[] = { +#if FF_MODULE_NETIO &ffNetIOModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* O[] = { +#if FF_MODULE_OPENCL &ffOpenCLModuleInfo, +#endif +#if FF_MODULE_OPENGL &ffOpenGLModuleInfo, +#endif +#if FF_MODULE_OS &ffOSModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* P[] = { +#if FF_MODULE_PACKAGES &ffPackagesModuleInfo, +#endif +#if FF_MODULE_PHYSICALDISK &ffPhysicalDiskModuleInfo, +#endif +#if FF_MODULE_PHYSICALMEMORY &ffPhysicalMemoryModuleInfo, +#endif +#if FF_MODULE_PLAYER &ffPlayerModuleInfo, +#endif +#if FF_MODULE_POWERADAPTER &ffPowerAdapterModuleInfo, +#endif +#if FF_MODULE_PROCESSES &ffProcessesModuleInfo, +#endif +#if FF_MODULE_PUBLICIP &ffPublicIPModuleInfo, +#endif NULL, }; @@ -126,42 +237,82 @@ static FFModuleBaseInfo* R[] = { }; static FFModuleBaseInfo* S[] = { +#if FF_MODULE_SEPARATOR &ffSeparatorModuleInfo, +#endif +#if FF_MODULE_SHELL &ffShellModuleInfo, +#endif +#if FF_MODULE_SOUND &ffSoundModuleInfo, +#endif +#if FF_MODULE_SWAP &ffSwapModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* T[] = { +#if FF_MODULE_TERMINAL &ffTerminalModuleInfo, +#endif +#if FF_MODULE_TERMINALFONT &ffTerminalFontModuleInfo, +#endif +#if FF_MODULE_TERMINALSIZE &ffTerminalSizeModuleInfo, +#endif +#if FF_MODULE_TERMINALTHEME &ffTerminalThemeModuleInfo, +#endif +#if FF_MODULE_TITLE &ffTitleModuleInfo, +#endif +#if FF_MODULE_THEME &ffThemeModuleInfo, +#endif +#if FF_MODULE_TPM &ffTPMModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* U[] = { +#if FF_MODULE_UPTIME &ffUptimeModuleInfo, +#endif +#if FF_MODULE_USERS &ffUsersModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* V[] = { +#if FF_MODULE_VERSION &ffVersionModuleInfo, +#endif +#if FF_MODULE_VULKAN &ffVulkanModuleInfo, +#endif NULL, }; static FFModuleBaseInfo* W[] = { +#if FF_MODULE_WALLPAPER &ffWallpaperModuleInfo, +#endif +#if FF_MODULE_WEATHER &ffWeatherModuleInfo, +#endif +#if FF_MODULE_WM &ffWMModuleInfo, +#endif +#if FF_MODULE_WIFI &ffWifiModuleInfo, +#endif +#if FF_MODULE_WMTHEME &ffWMThemeModuleInfo, +#endif NULL, }; @@ -174,7 +325,9 @@ static FFModuleBaseInfo* Y[] = { }; static FFModuleBaseInfo* Z[] = { +#if FF_MODULE_ZPOOL &ffZpoolModuleInfo, +#endif NULL, };