Skip to content

Commit fc6ab30

Browse files
committed
Robust LLVM detection with fallback and VM compilation fix
1 parent 66d5ca1 commit fc6ab30

2 files changed

Lines changed: 48 additions & 5 deletions

File tree

CMakeLists.txt

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,34 @@ endif()
6969
if(WIN32)
7070
# Try to find LLVM, but don't require it on Windows
7171
find_package(LLVM CONFIG QUIET)
72+
73+
# Fallback for Windows if config not found (common with official installers)
74+
if(NOT LLVM_FOUND)
75+
message(STATUS "LLVM Config not found. Attempting manual detection via llvm-config...")
76+
find_program(LLVM_CONFIG_EXE NAMES llvm-config llvm-config.exe
77+
HINTS
78+
"${LLVM_ROOT}/bin"
79+
"$ENV{LLVM_ROOT}/bin"
80+
"C:/LLVM/bin"
81+
"C:/Program Files/LLVM/bin"
82+
)
83+
84+
if(LLVM_CONFIG_EXE)
85+
message(STATUS "Found llvm-config at: ${LLVM_CONFIG_EXE}")
86+
execute_process(COMMAND ${LLVM_CONFIG_EXE} --includedir OUTPUT_VARIABLE LLVM_INCLUDE_DIRS OUTPUT_STRIP_TRAILING_WHITESPACE)
87+
execute_process(COMMAND ${LLVM_CONFIG_EXE} --libdir OUTPUT_VARIABLE LLVM_LIBRARY_DIRS OUTPUT_STRIP_TRAILING_WHITESPACE)
88+
execute_process(COMMAND ${LLVM_CONFIG_EXE} --version OUTPUT_VARIABLE LLVM_PACKAGE_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
89+
90+
# Convert to CMake paths
91+
file(TO_CMAKE_PATH "${LLVM_INCLUDE_DIRS}" LLVM_INCLUDE_DIRS)
92+
file(TO_CMAKE_PATH "${LLVM_LIBRARY_DIRS}" LLVM_LIBRARY_DIRS)
93+
94+
set(LLVM_FOUND TRUE)
95+
set(LLVM_VERSION ${LLVM_PACKAGE_VERSION})
96+
# Note: llvm_map_components_to_libnames will still fail if not found.
97+
# We'll handle that below by providing a simplified list if needed.
98+
endif()
99+
endif()
72100
else()
73101
# LLVM is required on Unix platforms
74102
find_package(LLVM CONFIG REQUIRED)
@@ -114,7 +142,18 @@ if(LLVM_FOUND)
114142
include_directories(SYSTEM ${LLVM_INCLUDE_DIRS})
115143
add_definitions(${LLVM_DEFINITIONS})
116144
link_directories(${LLVM_LIBRARY_DIRS})
117-
llvm_map_components_to_libnames(llvm_libs core support executionengine native ipo analysis transformutils bitwriter)
145+
146+
if(COMMAND llvm_map_components_to_libnames)
147+
llvm_map_components_to_libnames(llvm_libs core support executionengine native ipo analysis transformutils bitwriter)
148+
elseif(LLVM_CONFIG_EXE)
149+
# Fallback for when LLVMConfig.cmake is missing but llvm-config works
150+
execute_process(COMMAND ${LLVM_CONFIG_EXE} --libnames core support executionengine native ipo analysis transformutils bitwriter
151+
OUTPUT_VARIABLE llvm_libs OUTPUT_STRIP_TRAILING_WHITESPACE)
152+
string(REPLACE " " ";" llvm_libs "${llvm_libs}")
153+
else()
154+
# Final fallback: just try common library names
155+
set(llvm_libs LLVMCore LLVMSupport LLVMExecutionEngine LLVMAnalysis LLVMTarget)
156+
endif()
118157
endif()
119158

120159
# Export symbols for Windows DLL

scripts/setup_llvm_windows.ps1

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,18 +65,22 @@ function Resolve-LLVMLayout {
6565
"share\cmake\llvm",
6666
"share\cmake"
6767
)
68+
$bestCMakeDir = $null
6869
foreach ($suffix in $cmakeSuffixes) {
6970
$cmakeDir = Join-Path $root $suffix
7071
if (Test-Path $cmakeDir) {
7172
Write-Host "Checking suffix dir: $cmakeDir"
7273
if (Test-Path (Join-Path $cmakeDir "LLVMConfig.cmake")) {
7374
return @{ Root = $root; CMakeDir = $cmakeDir; BinDir = $binDir }
7475
}
75-
if (Test-Path (Join-Path $cmakeDir "llvm-config.cmake")) {
76-
return @{ Root = $root; CMakeDir = $cmakeDir; BinDir = $binDir }
77-
}
76+
# Store the first valid-looking cmake dir as a fallback
77+
if (-not $bestCMakeDir) { $bestCMakeDir = $cmakeDir }
7878
}
7979
}
80+
# Partial success: binaries found but no LLVMConfig.cmake
81+
# We return it anyway so LLVM_ROOT can be exported
82+
Write-Host "Found LLVM binaries at $root but no LLVMConfig.cmake found."
83+
return @{ Root = $root; CMakeDir = $bestCMakeDir; BinDir = $binDir }
8084
}
8185
}
8286
}
@@ -165,7 +169,7 @@ if ($layout) {
165169
Write-Host "Resolved BinDir: $binDir"
166170

167171
if ($env:GITHUB_ENV) {
168-
Add-Content $env:GITHUB_ENV "LLVM_DIR=$cmakeDir"
172+
if ($cmakeDir) { Add-Content $env:GITHUB_ENV "LLVM_DIR=$cmakeDir" }
169173
Add-Content $env:GITHUB_ENV "LLVM_ROOT=$llvmRoot"
170174
Add-Content $env:GITHUB_ENV "CMAKE_PREFIX_PATH=$llvmRoot"
171175
}

0 commit comments

Comments
 (0)