From abb3efca00b13e806d991a95f38662509231c9fd Mon Sep 17 00:00:00 2001 From: Rauny Date: Sun, 8 Feb 2026 13:57:07 +0100 Subject: [PATCH] fix: prevent Homebrew dylib contamination in macOS builds (#2908) When C3_FETCH_LLVM=ON, the fetched LLVM artifact is self-contained. Two issues caused the macOS release binary to embed hardcoded /opt/homebrew paths, making it fail on systems without Homebrew: 1. /opt/homebrew/lib was unconditionally appended to LLVM_LIBRARY_DIRS, causing find_library to discover Homebrew's LLD dylibs (whose LC_ID_DYLIB points to /opt/homebrew/opt/lld/lib/...). Guard this behind NOT C3_FETCH_LLVM so it only applies when using a system-installed LLVM. 2. In the static linking block (C3_LINK_DYNAMIC=OFF), find_library NAMES listed .dylib before .a, so shared libraries were preferred even when static linking was intended. Reorder to prefer .a, keeping .dylib as a fallback for systems that only ship shared libraries. Co-authored-by: Christoffer Lerno --- CMakeLists.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bf0e2f790..4734905e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -235,7 +235,7 @@ if(C3_WITH_LLVM) endif() endif() - if (EXISTS /opt/homebrew/lib) + if (NOT C3_FETCH_LLVM AND EXISTS /opt/homebrew/lib) list(APPEND LLVM_LIBRARY_DIRS /opt/homebrew/lib) endif() @@ -311,16 +311,16 @@ if(C3_WITH_LLVM) message(STATUS "Looking for static lld libraries in ${LLVM_LIBRARY_DIRS}") # These don't seem to be reliable on windows. - find_library(LLD_COFF NAMES liblldCOFF.dylib lldCOFF.lib lldCOFF.a liblldCOFF.dll.a liblldCOFF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) - find_library(LLD_COMMON NAMES liblldCommon.dylib lldCommon.lib lldCommon.a liblldCommon.dll.a liblldCommon.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) - find_library(LLD_ELF NAMES liblldELF.dylib lldELF.lib lldELF.a liblldELF.dll.a liblldELF.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + find_library(LLD_COFF NAMES lldCOFF.a liblldCOFF.a liblldCOFF.dylib lldCOFF.lib liblldCOFF.dll.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + find_library(LLD_COMMON NAMES lldCommon.a liblldCommon.a liblldCommon.dylib lldCommon.lib liblldCommon.dll.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + find_library(LLD_ELF NAMES lldELF.a liblldELF.a liblldELF.dylib lldELF.lib liblldELF.dll.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "OpenBSD") - find_library(LLD_MACHO NAMES liblldMachO.dylib lldMachO.lib lldMachO.a liblldMachO.dll.a liblldMachO.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + find_library(LLD_MACHO NAMES lldMachO.a liblldMachO.a liblldMachO.dylib lldMachO.lib liblldMachO.dll.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) else() set(LLD_MACHO "") endif() - find_library(LLD_MINGW NAMES liblldMinGW.dylib lldMinGW.lib lldMinGW.a liblldMinGW.dll.a liblldMinGW.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) - find_library(LLD_WASM NAMES liblldWasm.dylib lldWasm.lib lldWasm.a liblldWasm.dll.a liblldWasm.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + find_library(LLD_MINGW NAMES lldMinGW.a liblldMinGW.a liblldMinGW.dylib lldMinGW.lib liblldMinGW.dll.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) + find_library(LLD_WASM NAMES lldWasm.a liblldWasm.a liblldWasm.dylib lldWasm.lib liblldWasm.dll.a PATHS ${LLVM_LIBRARY_DIRS} NO_DEFAULT_PATH REQUIRED) else() message(STATUS "Looking for shared lld libraries in ${LLVM_LIBRARY_DIRS}")