diff mbox series

[meta-oe] fastfetch: Fix build with lld

Message ID 20261112020146.3625290-1-khem.raj@oss.qualcomm.com
State New
Headers show
Series [meta-oe] fastfetch: Fix build with lld | expand

Commit Message

Khem Raj Nov. 12, 2026, 2:01 a.m. UTC
Since the link type was switched to dynamic, fastfetch adds
-Wl,--copy-dt-needed-entries to the exe linker flags. LLD does not
support it, so every CMake check that links fails; utmpx.h is then
reported missing and the utmp.h fallback breaks the build:

error: use of undeclared identifier 'endutxent'; did you mean 'endutent'?

Only add the flag when the linker accepts it, map endutxent in the
utmp.h fallback as well, and link libxcb and libX11 explicitly since
LLD cannot pick them up through xcb-randr/xrandr DT_NEEDED entries.

Signed-off-by: Khem Raj <khem.raj@oss.qualcomm.com>
AI-Generated: Uses Claude Code
---
 ...opy-dt-needed-entries-if-the-linker-.patch | 37 +++++++++++++++
 ...ent-to-endutent-when-utmpx.h-is-unav.patch | 29 ++++++++++++
 ...cb-and-libX11-explicitly-when-not-us.patch | 45 +++++++++++++++++++
 .../fastfetch/fastfetch_2.71.0.bb             |  6 ++-
 4 files changed, 116 insertions(+), 1 deletion(-)
 create mode 100644 meta-oe/recipes-support/fastfetch/fastfetch/0001-CMake-Only-use-copy-dt-needed-entries-if-the-linker-.patch
 create mode 100644 meta-oe/recipes-support/fastfetch/fastfetch/0002-users-Map-endutxent-to-endutent-when-utmpx.h-is-unav.patch
 create mode 100644 meta-oe/recipes-support/fastfetch/fastfetch/0003-CMake-links-libxcb-and-libX11-explicitly-when-not-us.patch
diff mbox series

Patch

diff --git a/meta-oe/recipes-support/fastfetch/fastfetch/0001-CMake-Only-use-copy-dt-needed-entries-if-the-linker-.patch b/meta-oe/recipes-support/fastfetch/fastfetch/0001-CMake-Only-use-copy-dt-needed-entries-if-the-linker-.patch
new file mode 100644
index 0000000000..5327a11eca
--- /dev/null
+++ b/meta-oe/recipes-support/fastfetch/fastfetch/0001-CMake-Only-use-copy-dt-needed-entries-if-the-linker-.patch
@@ -0,0 +1,37 @@ 
+From ded9ccd14cb81e19a3d9335f21f68bf76f0c5ebe Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 11 Nov 2026 17:50:38 -0800
+Subject: [PATCH 1/3] CMake: Only use --copy-dt-needed-entries if the linker
+ supports it
+
+LLD does not implement --copy-dt-needed-entries. With
+BINARY_LINK_TYPE=dynamic the flag is added to CMAKE_EXE_LINKER_FLAGS
+before the configure checks run, so every check that links (utmpx.h,
+glob, wordexp, pthread_timedjoin_np, ...) fails and fastfetch is built
+with those features silently disabled.
+
+Check that the linker accepts the flag before adding it.
+
+Upstream-Status: Submitted [https://github.com/fastfetch-cli/fastfetch/pull/2714]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ CMakeLists.txt | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index a2723050..93cb984f 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1732,7 +1732,11 @@ if(NOT BINARY_LINK_TYPE STREQUAL "dlopen")
+     message(STATUS "Enabling custom link type: ${BINARY_LINK_TYPE}")
+     target_compile_definitions(libfastfetch PUBLIC FF_DISABLE_DLOPEN=1)
+     if(NOT WIN32)
+-        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--copy-dt-needed-entries")
++        include(CheckLinkerFlag)
++        check_linker_flag(C "-Wl,--copy-dt-needed-entries" HAVE_LINKER_COPY_DT_NEEDED_ENTRIES)
++        if(HAVE_LINKER_COPY_DT_NEEDED_ENTRIES)
++            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--copy-dt-needed-entries")
++        endif()
+     endif()
+ endif()
+
diff --git a/meta-oe/recipes-support/fastfetch/fastfetch/0002-users-Map-endutxent-to-endutent-when-utmpx.h-is-unav.patch b/meta-oe/recipes-support/fastfetch/fastfetch/0002-users-Map-endutxent-to-endutent-when-utmpx.h-is-unav.patch
new file mode 100644
index 0000000000..b96285fe5f
--- /dev/null
+++ b/meta-oe/recipes-support/fastfetch/fastfetch/0002-users-Map-endutxent-to-endutent-when-utmpx.h-is-unav.patch
@@ -0,0 +1,29 @@ 
+From e1bd0ad4ce45a612db3db27687836036a3e76581 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 11 Nov 2026 17:50:39 -0800
+Subject: [PATCH 2/3] users: Map endutxent to endutent when utmpx.h is
+ unavailable
+
+The utmp.h fallback maps setutxent and getutxent but not endutxent,
+which is called unconditionally, so the build fails with:
+
+error: use of undeclared identifier 'endutxent'; did you mean 'endutent'?
+
+Upstream-Status: Submitted [https://github.com/fastfetch-cli/fastfetch/pull/2714]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ src/detection/users/users_linux.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/detection/users/users_linux.c b/src/detection/users/users_linux.c
+index e304b29c..d39fb765 100644
+--- a/src/detection/users/users_linux.c
++++ b/src/detection/users/users_linux.c
+@@ -15,6 +15,7 @@
+     #define utmpx utmp
+     #define setutxent setutent
+     #define getutxent getutent
++    #define endutxent endutent
+ #endif
+ #if __linux__ || __GNU__
+     #include <netinet/in.h>
diff --git a/meta-oe/recipes-support/fastfetch/fastfetch/0003-CMake-links-libxcb-and-libX11-explicitly-when-not-us.patch b/meta-oe/recipes-support/fastfetch/fastfetch/0003-CMake-links-libxcb-and-libX11-explicitly-when-not-us.patch
new file mode 100644
index 0000000000..5b39e94846
--- /dev/null
+++ b/meta-oe/recipes-support/fastfetch/fastfetch/0003-CMake-links-libxcb-and-libX11-explicitly-when-not-us.patch
@@ -0,0 +1,45 @@ 
+From 43d0a65e74b2198b53e66b87499e2eb73c8701c4 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Wed, 11 Nov 2026 17:57:05 -0800
+Subject: [PATCH 3/3] CMake: links libxcb and libX11 explicitly when not using
+ dlopen
+
+fastfetch calls libxcb and libX11 functions directly, but only links
+xcb-randr and xrandr, whose pkg-config files list the core libraries in
+Requires.private. GNU ld resolves them through
+--copy-dt-needed-entries; LLD has no such option and fails with
+undefined symbols such as xcb_connect and XOpenDisplay.
+
+Link libxcb and libX11 explicitly in the dynamic and static link modes.
+
+Upstream-Status: Submitted [https://github.com/fastfetch-cli/fastfetch/pull/2714]
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+ CMakeLists.txt | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 93cb984f..de6864a2 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1926,6 +1926,20 @@ ff_lib_enable(ELF
+     "libelf"
+     "libelf"
+ )
++# xcb-randr and xrandr only list libxcb and libX11 in Requires.private, but
++# fastfetch calls into them directly, so link them explicitly.
++if(NOT BINARY_LINK_TYPE STREQUAL "dlopen" AND PKG_CONFIG_FOUND)
++    if(XCB_RANDR_FOUND)
++        pkg_check_modules(XCB QUIET xcb)
++        target_link_directories(libfastfetch PRIVATE ${XCB_LIBRARY_DIRS})
++        target_link_libraries(libfastfetch PRIVATE ${XCB_LIBRARIES})
++    endif()
++    if(XRANDR_FOUND OR GLX_FOUND OR VAX11_FOUND)
++        pkg_check_modules(X11 QUIET x11)
++        target_link_directories(libfastfetch PRIVATE ${X11_LIBRARY_DIRS})
++        target_link_libraries(libfastfetch PRIVATE ${X11_LIBRARIES})
++    endif()
++endif()
+ if(ENABLE_LUA)
+     # Lua is a special case since its CMake config does not follow the usual pattern
+     find_package(Lua QUIET)
diff --git a/meta-oe/recipes-support/fastfetch/fastfetch_2.71.0.bb b/meta-oe/recipes-support/fastfetch/fastfetch_2.71.0.bb
index c9ba3519b0..359736e7c0 100644
--- a/meta-oe/recipes-support/fastfetch/fastfetch_2.71.0.bb
+++ b/meta-oe/recipes-support/fastfetch/fastfetch_2.71.0.bb
@@ -10,7 +10,11 @@  LIC_FILES_CHKSUM = "file://LICENSE;md5=2090e7d93df7ad5a3d41f6fb4226ac76"

 DEPENDS = "yyjson"

-SRC_URI = "git://github.com/fastfetch-cli/fastfetch.git;protocol=https;branch=master;tag=${PV}"
+SRC_URI = "git://github.com/fastfetch-cli/fastfetch.git;protocol=https;branch=master;tag=${PV} \
+           file://0001-CMake-Only-use-copy-dt-needed-entries-if-the-linker-.patch \
+           file://0002-users-Map-endutxent-to-endutent-when-utmpx.h-is-unav.patch \
+           file://0003-CMake-links-libxcb-and-libX11-explicitly-when-not-us.patch \
+           "
 SRCREV = "8c9d9c0449dd515e0088c4a60a38d2dc40c5ccd0"

 inherit cmake pkgconfig