Skip to content

Commit

Permalink
cmake: find_package support
Browse files Browse the repository at this point in the history
  • Loading branch information
casperdcl committed Jan 2, 2021
1 parent 5f2250e commit 93073f3
Show file tree
Hide file tree
Showing 9 changed files with 132 additions and 37 deletions.
30 changes: 28 additions & 2 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,38 @@ variables ``PATHTOOLS`` and ``HMUDIR``, respectively.
export PATHTOOLS=$HOME/NiftyPET_tools
export HMUDIR=$HOME/mmr_hardwareumaps
# cross-platform install
conda create -n niftypet -c conda-forge python=3 \
conda install -c conda-forge python=3 \
ipykernel numpy scipy scikit-image matplotlib ipywidgets
conda activate niftypet
pip install --verbose "git+https://github.com/NiftyPET/NIMPA@dev2#egg=nimpa"
pip install --verbose "git+https://github.com/NiftyPET/NIPET@dev2#egg=nipet"
External CMake Projects
~~~~~~~~~~~~~~~~~~~~~~~

The raw C/CUDA libraries may be included in external projects using ``cmake``.
Simply build the project and use ``find_package(NiftyPETnipet)``.

.. code:: sh
# print installation directory (after `pip install nipet`)...
python -c "from niftypet.nipet import cmake_prefix; print(cmake_prefix)"
# ... or build & install directly with cmake
mkdir build && cd build
cmake ../niftypet && cmake --build . && cmake --install . --prefix /my/install/dir
At this point any external project may include NIPET as follows
(Once setting ``-DCMAKE_PREFIX_DIR=<installation prefix from above>``):

.. code:: cmake
cmake_minimum_required(VERSION 3.3 FATAL_ERROR)
project(myproj)
find_package(NiftyPETnipet COMPONENTS mmr_auxe mmr_lmproc petprj nifty_scatter REQUIRED)
add_executable(myexe ...)
target_link_libraries(myexe PRIVATE
NiftyPET::mmr_auxe NiftyPET::mmr_lmproc NiftyPET::petprj NiftyPET::nifty_scatter)
Licence
~~~~~~~

Expand Down
18 changes: 16 additions & 2 deletions niftypet/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
cmake_minimum_required(VERSION 3.18 FATAL_ERROR)

project(nipet LANGUAGES C CXX CUDA VERSION 2.0)
if("${NIPET_BUILD_VERSION}" STREQUAL "")
set(NIPET_BUILD_VERSION 2 CACHE STRING "version" FORCE)
endif()
project(nipet LANGUAGES C CXX CUDA VERSION "${NIPET_BUILD_VERSION}")

cmake_policy(PUSH)
cmake_policy(SET CMP0074 NEW) # <PackageName>_ROOT hints for find_package
Expand All @@ -19,3 +21,15 @@ endif()
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

add_subdirectory(nipet)

include(CMakePackageConfigHelpers)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
"${CMAKE_CURRENT_BINARY_DIR}/NiftyPET${CMAKE_PROJECT_NAME}Config.cmake"
INSTALL_DESTINATION niftypet/${CMAKE_PROJECT_NAME}/cmake)
write_basic_package_version_file(
"${CMAKE_CURRENT_BINARY_DIR}/NiftyPET${CMAKE_PROJECT_NAME}ConfigVersion.cmake"
VERSION "${CMAKE_PROJECT_VERSION}" COMPATIBILITY AnyNewerVersion)
install(FILES
"${CMAKE_CURRENT_BINARY_DIR}/NiftyPET${CMAKE_PROJECT_NAME}Config.cmake"
"${CMAKE_CURRENT_BINARY_DIR}/NiftyPET${CMAKE_PROJECT_NAME}ConfigVersion.cmake"
DESTINATION niftypet/${CMAKE_PROJECT_NAME}/cmake)
12 changes: 12 additions & 0 deletions niftypet/Config.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
@PACKAGE_INIT@

set(_supported_components mmr_auxe mmr_lmproc petprj nifty_scatter)

foreach(_comp ${NiftyPET@CMAKE_PROJECT_NAME@_FIND_COMPONENTS})
if (NOT _comp IN_LIST _supported_components)
set(NiftyPET@CMAKE_PROJECT_NAME@_FOUND False)
set(NiftyPET@CMAKE_PROJECT_NAME@_NOT_FOUND_MESSAGE "Unsupported component: ${_comp}")
message(STATUS "Unsupported component: ${_comp}")
endif()
include("${CMAKE_CURRENT_LIST_DIR}/NiftyPET${_comp}Targets.cmake")
endforeach()
28 changes: 20 additions & 8 deletions niftypet/nipet/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,21 +1,33 @@
cmake_minimum_required(VERSION 3.2)
set(${CMAKE_PROJECT_NAME}_INCLUDE_DIRS "${CMAKE_CURRENT_LIST_DIR}/include/") # / suffix important
install(DIRECTORY "${${CMAKE_PROJECT_NAME}_INCLUDE_DIRS}" DESTINATION niftypet/${CMAKE_PROJECT_NAME}/include)

project(mmr_auxe)

file(GLOB SRC LIST_DIRECTORIES false "src/*.cu")

include_directories(${CMAKE_CURRENT_LIST_DIR}/include)

include_directories(src)
include_directories(${Python3_INCLUDE_DIRS})
include_directories(${Python3_NumPy_INCLUDE_DIRS})

add_library(mmr_auxe SHARED ${SRC})
target_link_libraries(mmr_auxe ${Python3_LIBRARIES} ${CUDA_LIBRARIES})
add_library(${PROJECT_NAME} SHARED ${SRC})
add_library(NiftyPET::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} PUBLIC
"$<BUILD_INTERFACE:${${CMAKE_PROJECT_NAME}_INCLUDE_DIRS}>"
"$<INSTALL_INTERFACE:niftypet/${CMAKE_PROJECT_NAME}/include>")
target_link_libraries(${PROJECT_NAME} ${Python3_LIBRARIES} ${CUDA_LIBRARIES})
set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "") # remove shared lib prefix to make importable
if(SKBUILD)
python_extension_module(mmr_auxe)
python_extension_module(${PROJECT_NAME})
endif()
install(TARGETS mmr_auxe LIBRARY DESTINATION "niftypet/${CMAKE_PROJECT_NAME}")
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${CMAKE_PROJECT_VERSION}
SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR}
INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR})
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION)
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
INCLUDES DESTINATION niftypet/${CMAKE_PROJECT_NAME}/include
LIBRARY DESTINATION niftypet/${CMAKE_PROJECT_NAME})
install(EXPORT ${PROJECT_NAME}Targets FILE NiftyPET${PROJECT_NAME}Targets.cmake
NAMESPACE NiftyPET:: DESTINATION niftypet/${CMAKE_PROJECT_NAME}/cmake)

add_subdirectory(lm)
add_subdirectory(prj)
Expand Down
4 changes: 4 additions & 0 deletions niftypet/nipet/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import sys
from textwrap import dedent

from pkg_resources import resource_filename
from tqdm.auto import tqdm

from niftypet.ninst import cudasetup as cs
Expand Down Expand Up @@ -57,3 +58,6 @@

#from . import lm_sig
#from .lm_sig.hst_sig import lminfo_sig

# for use in `cmake -DCMAKE_PREFIX_PATH=...`
cmake_prefix = resource_filename(__name__, "cmake")
25 changes: 17 additions & 8 deletions niftypet/nipet/lm/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
cmake_minimum_required(VERSION 3.2)

project(mmr_lmproc)

file(GLOB SRC LIST_DIRECTORIES false "src/*.cu")

include_directories(${CMAKE_CURRENT_LIST_DIR}/../include)
include_directories(src)
include_directories(${Python3_INCLUDE_DIRS})
include_directories(${Python3_NumPy_INCLUDE_DIRS})

add_library(mmr_lmproc MODULE ${SRC})
target_link_libraries(mmr_lmproc mmr_auxe ${Python3_LIBRARIES} ${CUDA_LIBRARIES} ${CUDA_curand_LIBRARY})
add_library(${PROJECT_NAME} MODULE ${SRC})
add_library(NiftyPET::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} PUBLIC
"$<BUILD_INTERFACE:${${CMAKE_PROJECT_NAME}_INCLUDE_DIRS}>"
"$<INSTALL_INTERFACE:niftypet/${CMAKE_PROJECT_NAME}/include>")
target_link_libraries(${PROJECT_NAME} mmr_auxe ${Python3_LIBRARIES} ${CUDA_LIBRARIES} ${CUDA_curand_LIBRARY})

if(SKBUILD)
python_extension_module(mmr_lmproc)
python_extension_module(${PROJECT_NAME})
endif()
install(TARGETS mmr_lmproc LIBRARY DESTINATION "niftypet/${CMAKE_PROJECT_NAME}/lm")
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${CMAKE_PROJECT_VERSION}
SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR}
INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR})
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION)
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
INCLUDES DESTINATION niftypet/${CMAKE_PROJECT_NAME}/include
LIBRARY DESTINATION niftypet/${CMAKE_PROJECT_NAME}/lm)
install(EXPORT ${PROJECT_NAME}Targets FILE NiftyPET${PROJECT_NAME}Targets.cmake
NAMESPACE NiftyPET:: DESTINATION niftypet/${CMAKE_PROJECT_NAME}/cmake)
25 changes: 17 additions & 8 deletions niftypet/nipet/prj/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
cmake_minimum_required(VERSION 3.2)

project(petprj)

file(GLOB SRC LIST_DIRECTORIES false "src/*.cu")

include_directories(${CMAKE_CURRENT_LIST_DIR}/../include)
include_directories(src)
include_directories(${Python3_INCLUDE_DIRS})
include_directories(${Python3_NumPy_INCLUDE_DIRS})

add_library(petprj MODULE ${SRC})
target_link_libraries(petprj mmr_auxe ${Python3_LIBRARIES} ${CUDA_LIBRARIES})
add_library(${PROJECT_NAME} MODULE ${SRC})
add_library(NiftyPET::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} PUBLIC
"$<BUILD_INTERFACE:${${CMAKE_PROJECT_NAME}_INCLUDE_DIRS}>"
"$<INSTALL_INTERFACE:niftypet/${CMAKE_PROJECT_NAME}/include>")
target_link_libraries(${PROJECT_NAME} mmr_auxe ${Python3_LIBRARIES} ${CUDA_LIBRARIES})

if(SKBUILD)
python_extension_module(petprj)
python_extension_module(${PROJECT_NAME})
endif()
install(TARGETS petprj LIBRARY DESTINATION "niftypet/${CMAKE_PROJECT_NAME}/prj")
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${CMAKE_PROJECT_VERSION}
SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR}
INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR})
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION)
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
INCLUDES DESTINATION niftypet/${CMAKE_PROJECT_NAME}/include
LIBRARY DESTINATION niftypet/${CMAKE_PROJECT_NAME}/prj)
install(EXPORT ${PROJECT_NAME}Targets FILE NiftyPET${PROJECT_NAME}Targets.cmake
NAMESPACE NiftyPET:: DESTINATION niftypet/${CMAKE_PROJECT_NAME}/cmake)
25 changes: 17 additions & 8 deletions niftypet/nipet/sct/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
cmake_minimum_required(VERSION 3.2)

project(nifty_scatter)

file(GLOB SRC LIST_DIRECTORIES false "src/*.cu")

include_directories(${CMAKE_CURRENT_LIST_DIR}/../include)
include_directories(src)
include_directories(${Python3_INCLUDE_DIRS})
include_directories(${Python3_NumPy_INCLUDE_DIRS})

add_library(nifty_scatter MODULE ${SRC})
target_link_libraries(nifty_scatter mmr_auxe ${Python3_LIBRARIES} ${CUDA_LIBRARIES})
add_library(${PROJECT_NAME} MODULE ${SRC})
add_library(NiftyPET::${PROJECT_NAME} ALIAS ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME} PUBLIC
"$<BUILD_INTERFACE:${${CMAKE_PROJECT_NAME}_INCLUDE_DIRS}>"
"$<INSTALL_INTERFACE:niftypet/${CMAKE_PROJECT_NAME}/include>")
target_link_libraries(${PROJECT_NAME} mmr_auxe ${Python3_LIBRARIES} ${CUDA_LIBRARIES})

if(SKBUILD)
python_extension_module(nifty_scatter)
python_extension_module(${PROJECT_NAME})
endif()
install(TARGETS nifty_scatter LIBRARY DESTINATION "niftypet/${CMAKE_PROJECT_NAME}/sct")
set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${CMAKE_PROJECT_VERSION}
SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR}
INTERFACE_${PROJECT_NAME}_MAJOR_VERSION ${CMAKE_PROJECT_VERSION_MAJOR})
set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPATIBLE_INTERFACE_STRING ${PROJECT_NAME}_MAJOR_VERSION)
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Targets
INCLUDES DESTINATION niftypet/${CMAKE_PROJECT_NAME}/include
LIBRARY DESTINATION niftypet/${CMAKE_PROJECT_NAME}/sct)
install(EXPORT ${PROJECT_NAME}Targets FILE NiftyPET${PROJECT_NAME}Targets.cmake
NAMESPACE NiftyPET:: DESTINATION niftypet/${CMAKE_PROJECT_NAME}/cmake)
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ def check_constants():
# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
log.info("hardware mu-maps have been located")

cmake_args = [f"-DPython3_ROOT_DIR={sys.prefix}"]
cmake_args = ["-DNIPET_BUILD_VERSION=2.0.0", f"-DPython3_ROOT_DIR={sys.prefix}"]
try:
nvcc_arches = {"{2:d}{3:d}".format(*i) for i in dinf.gpuinfo()}
except Exception as exc:
Expand Down

0 comments on commit 93073f3

Please sign in to comment.