CMake: adds MODULE_<module> options to disable modules

This commit is contained in:
Carter Li
2026-05-28 15:38:18 +08:00
parent 896fe60461
commit 6b9a6fd103
7 changed files with 208 additions and 1 deletions
+19
View File
@@ -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)
+10
View File
@@ -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
+2
View File
@@ -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) {
+14
View File
@@ -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
}
}
+4 -1
View File
@@ -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
+6
View File
@@ -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)) {
+153
View File
@@ -1,69 +1,136 @@
#include "modules/modules.h"
// Note:
// FF_MODULE_<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,
};