|
1 | 1 | option(ENABLE_OPENMP "Enable building with OpenMP" ON) |
2 | 2 | option(BUILD_TESTS "Build test executables" OFF) |
| 3 | +option(BUILD_BENCHMARKS "Build performance benchmark executables" OFF) |
3 | 4 |
|
4 | 5 |
|
5 | 6 | # Set CMake policies to avoid warnings on newer CMake versions |
@@ -83,6 +84,22 @@ message( STATUS "[Helios] Last configured Helios Git commit hash: ${HELIOS_PREVI |
83 | 84 |
|
84 | 85 | if(NOT HELIOS_PREVIOUS_COMMIT STREQUAL GIT_COMMIT_HASH) |
85 | 86 | message(STATUS "[Helios] Git commit version change detected, automatically re-configuring...") |
| 87 | + |
| 88 | + # Clean CUDA object files to prevent linking issues with stale objects |
| 89 | + find_package(CUDAToolkit QUIET) |
| 90 | + if(CUDAToolkit_FOUND) |
| 91 | + message(STATUS "[Helios] Cleaning CUDA object files due to version change...") |
| 92 | + file(GLOB_RECURSE CUDA_OBJECTS |
| 93 | + "${CMAKE_BINARY_DIR}/**/*.cu.o" |
| 94 | + "${CMAKE_BINARY_DIR}/**/*.cudafe*" |
| 95 | + "${CMAKE_BINARY_DIR}/**/cmake_device_link.o" |
| 96 | + ) |
| 97 | + if(CUDA_OBJECTS) |
| 98 | + file(REMOVE ${CUDA_OBJECTS}) |
| 99 | + message(STATUS "[Helios] Removed ${CMAKE_CURRENT_LIST_SIZE} CUDA object files") |
| 100 | + endif() |
| 101 | + endif() |
| 102 | + |
86 | 103 | # update cache for next time |
87 | 104 | set(HELIOS_PREVIOUS_COMMIT "${GIT_COMMIT_HASH}" CACHE STRING "Last configured Helios Git commit" FORCE) |
88 | 105 | endif() |
@@ -164,7 +181,59 @@ endforeach(PLUGIN) |
164 | 181 | target_compile_definitions(helios PUBLIC $<$<CONFIG:Debug>:HELIOS_DEBUG> $<$<CONFIG:RelWithDebInfo>:HELIOS_DEBUG> ) |
165 | 182 |
|
166 | 183 | if( ENABLE_OPENMP ) |
167 | | - find_package(OpenMP) |
| 184 | + # First try standard OpenMP detection |
| 185 | + find_package(OpenMP QUIET) |
| 186 | + |
| 187 | + # If OpenMP not found and we're on macOS with Apple Clang, try automatic libomp configuration |
| 188 | + if(NOT OpenMP_CXX_FOUND AND CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") |
| 189 | + message(STATUS "[Helios] Configuring OpenMP for Apple Clang on macOS...") |
| 190 | + |
| 191 | + # Find Homebrew |
| 192 | + find_program(BREW NAMES brew) |
| 193 | + if(BREW) |
| 194 | + # Check if libomp is installed |
| 195 | + execute_process(COMMAND ${BREW} ls libomp |
| 196 | + RESULT_VARIABLE BREW_RESULT_CODE |
| 197 | + OUTPUT_QUIET ERROR_QUIET) |
| 198 | + |
| 199 | + if(NOT BREW_RESULT_CODE) |
| 200 | + # Get libomp prefix |
| 201 | + execute_process(COMMAND ${BREW} --prefix libomp |
| 202 | + OUTPUT_VARIABLE LIBOMP_PREFIX |
| 203 | + OUTPUT_STRIP_TRAILING_WHITESPACE) |
| 204 | + |
| 205 | + # Configure OpenMP for Apple Clang + libomp |
| 206 | + set(OpenMP_CXX_FLAGS "-Xpreprocessor;-fopenmp") |
| 207 | + set(OpenMP_CXX_LIB_NAMES "omp") |
| 208 | + set(OpenMP_omp_LIBRARY "${LIBOMP_PREFIX}/lib/libomp.dylib") |
| 209 | + set(OpenMP_CXX_INCLUDE_DIRS "${LIBOMP_PREFIX}/include") |
| 210 | + |
| 211 | + # Add include directory globally for compatibility |
| 212 | + include_directories("${LIBOMP_PREFIX}/include") |
| 213 | + |
| 214 | + # Create OpenMP target if it doesn't exist |
| 215 | + if(NOT TARGET OpenMP::OpenMP_CXX) |
| 216 | + add_library(OpenMP::OpenMP_CXX SHARED IMPORTED) |
| 217 | + set_target_properties(OpenMP::OpenMP_CXX PROPERTIES |
| 218 | + IMPORTED_LOCATION "${OpenMP_omp_LIBRARY}" |
| 219 | + INTERFACE_COMPILE_OPTIONS "-Xpreprocessor;-fopenmp" |
| 220 | + INTERFACE_INCLUDE_DIRECTORIES "${OpenMP_CXX_INCLUDE_DIRS}" |
| 221 | + INTERFACE_LINK_LIBRARIES "${OpenMP_omp_LIBRARY}") |
| 222 | + endif() |
| 223 | + |
| 224 | + set(OpenMP_FOUND TRUE) |
| 225 | + set(OpenMP_CXX_FOUND TRUE) |
| 226 | + |
| 227 | + message(STATUS "[Helios] Automatically configured OpenMP using Homebrew libomp from ${LIBOMP_PREFIX}") |
| 228 | + else() |
| 229 | + message(WARNING "[Helios] OpenMP requires libomp on macOS. Install with: brew install libomp") |
| 230 | + endif() |
| 231 | + else() |
| 232 | + message(WARNING "[Helios] OpenMP on macOS requires Homebrew. Install from https://brew.sh then run: brew install libomp") |
| 233 | + endif() |
| 234 | + endif() |
| 235 | + |
| 236 | + # Final OpenMP configuration |
168 | 237 | if (OpenMP_CXX_FOUND) |
169 | 238 | message( STATUS "[Helios] Enabling OpenMP support" ) |
170 | 239 | target_link_libraries(helios PUBLIC OpenMP::OpenMP_CXX) |
|
0 commit comments