68 lines
2.1 KiB
CMake
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()
|