CLBlast/src/pyclblast/CMakeLists.txt

68 lines
2.1 KiB
CMake

cmake_minimum_required(VERSION 3.20)
project(${SKBUILD_PROJECT_NAME} LANGUAGES CXX)
# Find python and numpy
find_package(
Python3
REQUIRED
COMPONENTS Interpreter Development.Module NumPy
)
# Run the cython compiler
cmake_path(APPEND CMAKE_CURRENT_SOURCE_DIR "./src"
OUTPUT_VARIABLE Cython_SOURCE_DIR)
find_program(CYTHON "cython")
add_custom_command(
OUTPUT "${Cython_SOURCE_DIR}/pyclblast.cpp"
DEPENDS "${Cython_SOURCE_DIR}/pyclblast.pyx"
VERBATIM
COMMAND "${CYTHON}" -3 "${Cython_SOURCE_DIR}/pyclblast.pyx"
--output-file "${Cython_SOURCE_DIR}/pyclblast.cpp")
# Add module target
Python3_add_library(pyclblast MODULE WITH_SOABI
"${Cython_SOURCE_DIR}/pyclblast.cpp")
# Numpy libraries - NOTE: clean NPY_LIBRARIES cache (may fail for venv)
cmake_path(GET Python3_NumPy_INCLUDE_DIRS PARENT_PATH Python3_NumPy_CORE_DIR)
unset(NPY_LIBRARIES CACHE)
find_library(NPY_LIBRARIES
NAMES npymath
PATHS ${Python3_NumPy_CORE_DIR}
PATH_SUFFIXES lib
DOC "Numpy math library"
REQUIRED
NO_DEFAULT_PATH)
target_link_libraries(pyclblast PRIVATE ${NPY_LIBRARIES})
target_include_directories(pyclblast PRIVATE ${Python3_NumPy_INCLUDE_DIRS})
# CLBlast library
set(CLBLAST_HINTS
${CLBLAST_ROOT}
$ENV{CLBLAST_ROOT}
)
find_package(CLBlast CONFIG REQUIRED HINTS ${CLBLAST_HINTS})
target_link_libraries(pyclblast PRIVATE clblast)
install(TARGETS pyclblast DESTINATION .)
# In windows pyclblast cannot find the dll, even on path.
# Probably related to change in 3.8, that loads dll only for trusted location
# see https://stackoverflow.com/questions/41365446/how-to-resolve-importerror-dll-load-failed-on-python
# One workaround is to copy the dll to the same dir as the module.
# TODO: add python version check
if (WIN32)
cmake_path(APPEND CLBlast_DIR "../../../bin" OUTPUT_VARIABLE CLBlast_BINDIR)
cmake_path(SET CLBlast_BINDIR NORMALIZE "${CLBlast_BINDIR}")
unset(CLBlast_SHARED_LIBPATH CACHE)
find_file(CLBlast_SHARED_LIBPATH
NAMES clblast.dll
PATHS ${CLBlast_BINDIR}
DOC "CLBlast shared library"
REQUIRED)
# copy dll to build
install(FILES ${CLBlast_SHARED_LIBPATH} DESTINATION .)
endif()