-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCMakeLists.txt
161 lines (141 loc) · 5.43 KB
/
CMakeLists.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# Tomocam Copyright (c) 2018
#
# The Regents of the University of California, through Lawrence Berkeley
# National Laboratory (subject to receipt of any required approvals from the
# U.S. Dept. of Energy). All rights reserved.
#
# If you have questions about your rights to use or distribute this software,
# please contact Berkeley Lab's Innovation & Partnerships Office at
#
# NOTICE. This Software was developed under funding from the U.S. Department of
# Energy and the U.S. Government consequently retains certain rights. As such,
# the U.S. Government has been granted for itself and others acting on its
# behalf a paid-up, nonexclusive, irrevocable, worldwide license in the Software
# to reproduce, distribute copies to the public, prepare derivative works, and
# perform publicly and display publicly, and to permit other to do so.
#---------------------------------------------------------------------------------
cmake_minimum_required(VERSION 3.18)
project(tomocam LANGUAGES C CXX CUDA)
set(tomocam_VERSION_MAJOR 3)
set(tomocam_VERSION_MINOR 0)
#C++ Stuff
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS_DEBUG "-DTOMOCAM_DEBUG ${CMAKE_CXX_FLAGS_DEBUG}")
# CUDA Stuff
find_package(CUDAToolkit REQUIRED)
include_directories(${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
set(CMAKE_CUDA_FLAGS "--default-stream per-thread ${CMAKE_CUDA_FLAGS}")
set(CMAKE_CUDA_FLAGS_DEBUG "-G -DTOMOCAM_DEBUG ${CMAKE_CUDA_FLAGS_DEBUG}")
set(CMAKE_CUDA_ARCHITECTURES "60;61;70;75;80;86")
include(ExternalProject)
# local CMake modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
# Set option to use MPI
option(MULTI_PROC "Enable MPI" OFF)
message("-- MPI is ${MULTI_PROC}")
message("-- To enable MPI, run cmake with -DMULTI_PROC:BOOL=ON")
# Source files
set(SRC
${PROJECT_SOURCE_DIR}/src/backward.cpp
${PROJECT_SOURCE_DIR}/src/iradon.cpp
${PROJECT_SOURCE_DIR}/src/forward.cpp
${PROJECT_SOURCE_DIR}/src/radon.cpp
${PROJECT_SOURCE_DIR}/src/error.cpp
${PROJECT_SOURCE_DIR}/src/error2.cpp
${PROJECT_SOURCE_DIR}/src/gradient.cpp
${PROJECT_SOURCE_DIR}/src/gradient2.cpp
${PROJECT_SOURCE_DIR}/src/gpu/cuTVD.cu
${PROJECT_SOURCE_DIR}/src/tvd_update.cpp
${PROJECT_SOURCE_DIR}/src/mbir.cpp
${PROJECT_SOURCE_DIR}/src/mbir2.cpp
${PROJECT_SOURCE_DIR}/src/postproc.cpp
${PROJECT_SOURCE_DIR}/src/preproc.cpp
${PROJECT_SOURCE_DIR}/src/padding.cpp
${PROJECT_SOURCE_DIR}/src/gpu/tv_hessian.cu
${PROJECT_SOURCE_DIR}/src/gpu/gpu_ops.cu
${PROJECT_SOURCE_DIR}/src/gpu/padding.cu
${PROJECT_SOURCE_DIR}/src/gpu/fftshift.cu
${PROJECT_SOURCE_DIR}/src/gpu/nufft_utils.cu
)
include_directories(${PROJECT_SOURCE_DIR}/src)
#python
set(Python_FIND_VIRTUALENV FIRST)
find_package(Python COMPONENTS Interpreter Development REQUIRED)
include_directories(${Python_INCLUDE_DIRS})
#pybind11
find_package(pybind11 REQUIRED)
include_directories(${pybind11_INCLUDE_DIR})
option(USING_SETUP_PY "building through setup.py" OFF)
if (USING_SETUP_PY)
add_compile_definitions(USING_SETUP_PY)
endif(USING_SETUP_PY)
# openmp
find_package(OpenMP)
if (OpenMP_FOUND)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif(OpenMP_FOUND)
# MPI
if (MULTI_PROC)
enable_language(C)
find_package(MPI COMPONENTS C)
if (MPI_FOUND)
include_directories(${MPI_C_INCLUDE_DIRS})
add_compile_definitions(MULTIPROC)
else()
message(FATAL_ERROR "MPI not found")
endif(MPI_FOUND)
endif(MULTI_PROC)
# finufft
ExternalProject_Add(
finufft
GIT_REPOSITORY https://github.com/flatironinstitute/finufft.git
GIT_TAG v2.3.1
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/finufft
-DCMAKE_INSTALL_LIBDIR=${CMAKE_BINARY_DIR}/finufft/lib
-DCMAKE_BUILD_TYPE=Release
-DBUILD_TESTING=OFF
-DFINUFFT_USE_CPU=ON
-DFINUFFT_USE_CUDA=ON
-DFINUFFT_STATIC_LINKING=OFF
)
# hdf5
# TRY the official package
find_package(HDF5)
if (NOT HDF5_FOUND)
# use environment variable HDF5_DIR
find_package(hdf5 REQUIRED)
set(HDF5_INCLUDE_DIRS ${hdf5_INCLUDE_DIR})
set(HDF5_LIBRARIES ${hdf5_LIBRARY})
endif()
include_directories(${HDF5_INCLUDE_DIRS})
# build shared library
add_library(tomocam SHARED ${SRC})
add_dependencies(tomocam finufft)
target_include_directories(tomocam PUBLIC ${CMAKE_BINARY_DIR}/finufft/include)
target_link_libraries(tomocam PUBLIC ${CMAKE_BINARY_DIR}/finufft/lib/libcufinufft.so)
target_link_libraries(tomocam PUBLIC CUDA::cufft)
target_link_libraries(tomocam PUBLIC CUDA::cudart)
target_link_libraries(tomocam PUBLIC CUDA::cuda_driver)
target_link_libraries(tomocam PUBLIC ${HDF5_LIBRARIES})
target_link_libraries(tomocam PUBLIC ${MPI_C_LIBRARIES})
target_compile_features(tomocam PUBLIC cxx_std_20)
# build python module
add_library(cTomocam MODULE src/pyTomocam.cpp)
set_target_properties(cTomocam PROPERTIES
CXX_VISIBILITY_PRESET "hidden"
PREFIX "${PYTHON_MODULE_PREFIX}"
SUFFIX "${PYTHON_MODULE_EXTENSION}")
target_link_libraries(cTomocam PUBLIC tomocam)
target_link_libraries(tomocam PUBLIC pybind11::module)
target_link_libraries(tomocam PUBLIC ${Python_LIBRARIES})
target_compile_features(cTomocam PUBLIC cxx_std_20)
option(ENABLE_TESTS "Enable tests" OFF)
if (${ENABLE_TESTS})
message("-- Enabling tests ...")
add_subdirectory(test)
else()
message("-- Tests are disabled")
message("-- To enable tests, run cmake with -DENABLE_TESTS:BOOL=ON")
endif()