diff --git a/CMakeLists.txt b/CMakeLists.txt index fd698f3..344aef4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -137,7 +137,11 @@ if(BUILD_VKFFT) GIT_REPOSITORY ${VkFFT_GIT_REPOSITORY} GIT_TAG ${VkFFT_GIT_TAG} ) - FetchContent_MakeAvailable(vkfft_lib) + FetchContent_GetProperties(vkfft_lib) + if(NOT vkfft_lib_POPULATED) + FetchContent_Populate(vkfft_lib) + add_subdirectory(${vkfft_lib_SOURCE_DIR} ${vkfft_lib_BINARY_DIR} EXCLUDE_FROM_ALL) + endif() set(vkfft_INCLUDE_DIR "${vkfft_lib_SOURCE_DIR}/vkFFT") else() diff --git a/itk-module-init.cmake b/itk-module-init.cmake index 8975ddc..ac65fbe 100644 --- a/itk-module-init.cmake +++ b/itk-module-init.cmake @@ -1,10 +1,34 @@ # # Find the packages required by this module # -set(VKFFT_BACKEND 3 CACHE STRING "1 - CUDA, 3 - OpenCL, 4 - Level Zero, 5 - Metal") +if(NOT DEFINED VKFFT_BACKEND) + include(CheckLanguage) + check_language(CUDA) + set(_vkfft_have_metal FALSE) + if(APPLE) + find_library(_vkfft_metal_probe Metal) + find_library(_vkfft_foundation_probe Foundation) + find_library(_vkfft_quartzcore_probe QuartzCore) + if(_vkfft_metal_probe AND _vkfft_foundation_probe AND _vkfft_quartzcore_probe) + set(_vkfft_have_metal TRUE) + endif() + endif() + if(CMAKE_CUDA_COMPILER) + set(_vkfft_backend_default 1) + elseif(_vkfft_have_metal) + set(_vkfft_backend_default 5) + else() + set(_vkfft_backend_default 3) + endif() +else() + set(_vkfft_backend_default ${VKFFT_BACKEND}) +endif() +set(VKFFT_BACKEND ${_vkfft_backend_default} CACHE STRING "1 - CUDA, 3 - OpenCL, 4 - Level Zero, 5 - Metal") if(${VKFFT_BACKEND} EQUAL 1) - find_package(CUDA 9.0 REQUIRED) - find_library(CUDA_NVRTC_LIB libnvrtc nvrtc HINTS "${CUDA_TOOLKIT_ROOT_DIR}/lib64" "${CUDA_TOOLKIT_ROOT_DIR}/lib/x64" "/usr/lib64" "/usr/local/cuda/lib64") + enable_language(CUDA) + find_package(CUDAToolkit REQUIRED) + set(CUDA_LIBRARIES CUDA::cudart) + find_library(CUDA_NVRTC_LIB libnvrtc nvrtc HINTS "${CUDAToolkit_LIBRARY_DIR}" "/usr/lib64" "/usr/local/cuda/lib64") elseif(${VKFFT_BACKEND} EQUAL 3) find_package(OpenCL REQUIRED) elseif(${VKFFT_BACKEND} EQUAL 4) @@ -19,4 +43,11 @@ elseif(${VKFFT_BACKEND} EQUAL 4) if(NOT LevelZero_INCLUDE_DIR OR NOT LevelZero_LIBRARY) message(FATAL_ERROR "VKFFT_BACKEND=4 (Level Zero) requires the oneAPI Level Zero loader (ze_loader) and headers (level_zero/ze_api.h).") endif() +elseif(${VKFFT_BACKEND} EQUAL 5) + if(NOT APPLE) + message(FATAL_ERROR "VKFFT_BACKEND=5 (Metal) requires Apple platforms (macOS/iOS, including Apple Silicon).") + endif() + find_library(METAL_FRAMEWORK Metal REQUIRED) + find_library(FOUNDATION_FRAMEWORK Foundation REQUIRED) + find_library(QUARTZCORE_FRAMEWORK QuartzCore REQUIRED) endif() diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e5b9754..08ea03a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,7 +7,7 @@ set(VkFFTBackend_SRCS itk_module_add_library(VkFFTBackend ${VkFFTBackend_SRCS}) if(${VKFFT_BACKEND} EQUAL 1) - target_link_libraries(VkFFTBackend PUBLIC ${CUDA_LIBRARIES} cuda ${CUDA_NVRTC_LIB} VkFFT half) + target_link_libraries(VkFFTBackend PUBLIC ${CUDA_LIBRARIES} CUDA::cuda_driver ${CUDA_NVRTC_LIB} VkFFT half) if(MSVC) else() set_source_files_properties(itkVkCommon.cpp PROPERTIES LANGUAGE CUDA)