@@ -37,8 +37,20 @@ set(CMAKE_CUDA_STANDARD_REQUIRED ON)
3737# -----------------------------------------------------------------------------
3838# CONTROL OPTIONS
3939# -----------------------------------------------------------------------------
40- # Option to control building the Python bindings (default is OFF for core/Julia builds)
41- option (CUPDLPX_BUILD_PYTHON "Build the cuPDLPx Python bindings using pybind11" OFF )
40+ include (CMakeDependentOption)
41+
42+ option (CUPDLPX_BUILD_STATIC_LIB "Build the cuPDLPx static library" ON )
43+ option (CUPDLPX_BUILD_SHARED_LIB "Build the cuPDLPx shared library" ON )
44+
45+ # format: cmake_dependent_option(OPTION "docstring" DEFAULT_VALUE "DEPENDENCY_VARIABLE" FORCE_OFF_VALUE)
46+ cmake_dependent_option(CUPDLPX_BUILD_PYTHON "Build the cuPDLPx Python bindings" OFF
47+ "CUPDLPX_BUILD_STATIC_LIB" OFF )
48+
49+ cmake_dependent_option(CUPDLPX_BUILD_CLI "Build the cuPDLPx command-line executable" ON
50+ "CUPDLPX_BUILD_STATIC_LIB" OFF )
51+
52+ cmake_dependent_option(CUPDLPX_BUILD_TESTS "Build the cuPDLPx test suite" OFF
53+ "CUPDLPX_BUILD_STATIC_LIB" OFF )
4254
4355# -----------------------------------------------------------------------------
4456# FIND DEPENDENCIES
@@ -130,115 +142,150 @@ set(CORE_LINK_LIBS PUBLIC
130142# -----------------------------------------------------------------------------
131143# 1. Core STATIC Library (cupdlpx_core)
132144# -----------------------------------------------------------------------------
133- add_library (cupdlpx_core STATIC
134- ${C_SOURCES}
135- ${CU_SOURCES}
136- )
137- target_include_directories (cupdlpx_core ${CORE_INCLUDE_DIRS} )
138- target_link_libraries (cupdlpx_core ${CORE_LINK_LIBS} )
145+ if (CUPDLPX_BUILD_STATIC_LIB)
146+ add_library (cupdlpx_core STATIC
147+ ${C_SOURCES}
148+ ${CU_SOURCES}
149+ )
150+ target_include_directories (cupdlpx_core ${CORE_INCLUDE_DIRS} )
151+ target_link_libraries (cupdlpx_core ${CORE_LINK_LIBS} )
139152
140- set_target_properties (cupdlpx_core PROPERTIES
141- POSITION_INDEPENDENT_CODE ON
142- CUDA_SEPARABLE_COMPILATION ON
143- CUDA_RESOLVE_DEVICE_SYMBOLS ON
144- )
153+ set_target_properties (cupdlpx_core PROPERTIES
154+ POSITION_INDEPENDENT_CODE ON
155+ CUDA_SEPARABLE_COMPILATION ON
156+ CUDA_RESOLVE_DEVICE_SYMBOLS ON
157+ )
158+ endif ()
145159
146160# -----------------------------------------------------------------------------
147161# 2. Shared Library (libcupdlpx.so)
148162# -----------------------------------------------------------------------------
149- add_library (cupdlpx_shared SHARED
150- ${C_SOURCES}
151- ${CU_SOURCES}
152- )
153- target_include_directories (cupdlpx_shared ${CORE_INCLUDE_DIRS} )
154- target_link_libraries (cupdlpx_shared ${CORE_LINK_LIBS} )
155-
156- # Shared library must resolve device symbols as it is a final link point
157- set_target_properties (cupdlpx_shared PROPERTIES
158- OUTPUT_NAME "cupdlpx"
159- RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} "
160- CUDA_SEPARABLE_COMPILATION ON
161- CUDA_RESOLVE_DEVICE_SYMBOLS ON
162- )
163+ if (CUPDLPX_BUILD_SHARED_LIB)
164+ add_library (cupdlpx_shared SHARED
165+ ${C_SOURCES}
166+ ${CU_SOURCES}
167+ )
168+ target_include_directories (cupdlpx_shared ${CORE_INCLUDE_DIRS} )
169+ target_link_libraries (cupdlpx_shared ${CORE_LINK_LIBS} )
170+
171+ # Shared library must resolve device symbols as it is a final link point
172+ set_target_properties (cupdlpx_shared PROPERTIES
173+ OUTPUT_NAME "cupdlpx"
174+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} "
175+ CUDA_SEPARABLE_COMPILATION ON
176+ CUDA_RESOLVE_DEVICE_SYMBOLS ON
177+ )
178+ endif ()
163179
164180# -----------------------------------------------------------------------------
165181# 3. CLI Executable (cupdlpx)
166182# -----------------------------------------------------------------------------
167- add_executable (cupdlpx_cli src/cli.c)
183+ if (CUPDLPX_BUILD_CLI)
184+ if (NOT TARGET cupdlpx_core)
185+ message (FATAL_ERROR "CUPDLPX_BUILD_CLI=ON requires CUPDLPX_BUILD_STATIC_LIB=ON." )
186+ endif ()
187+
188+ add_executable (cupdlpx_cli src/cli.c)
168189
169- target_include_directories (cupdlpx_cli PRIVATE
170- ${CMAKE_CURRENT_SOURCE_DIR} /include
171- ${CMAKE_CURRENT_SOURCE_DIR} /internal
172- ${CMAKE_CURRENT_BINARY_DIR} /generated
173- )
190+ target_include_directories (cupdlpx_cli PRIVATE
191+ ${CMAKE_CURRENT_SOURCE_DIR} /include
192+ ${CMAKE_CURRENT_SOURCE_DIR} /internal
193+ ${CMAKE_CURRENT_BINARY_DIR} /generated
194+ )
174195
175- # Link CLI to the static core library
176- target_link_libraries (cupdlpx_cli PRIVATE cupdlpx_core)
196+ # Link CLI to the static core library
197+ target_link_libraries (cupdlpx_cli PRIVATE cupdlpx_core)
177198
178- # CLI is a final executable, it must resolve device symbols
179- set_target_properties (cupdlpx_cli PROPERTIES
180- OUTPUT_NAME "cupdlpx"
181- RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} "
182- CUDA_RESOLVE_DEVICE_SYMBOLS ON
183- )
199+ # CLI is a final executable, it must resolve device symbols
200+ set_target_properties (cupdlpx_cli PROPERTIES
201+ OUTPUT_NAME "cupdlpx"
202+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} "
203+ CUDA_RESOLVE_DEVICE_SYMBOLS ON
204+ )
205+ endif ()
184206
185207# -----------------------------------------------------------------------------
186208# 4. Tests (CTest Integration)
187209# -----------------------------------------------------------------------------
188- enable_testing ()
189- file (GLOB TEST_SOURCES
190- "${CMAKE_CURRENT_SOURCE_DIR} /test/*.c"
191- "${CMAKE_CURRENT_SOURCE_DIR} /test/*.cu"
192- )
193-
194- foreach (TEST_SRC ${TEST_SOURCES} )
195- get_filename_component (TEST_NAME ${TEST_SRC} NAME_WE )
196-
197- add_executable (${TEST_NAME} ${TEST_SRC} )
198-
199- # Link tests to the core static library
200- target_link_libraries (${TEST_NAME} PRIVATE cupdlpx_core)
201-
202- # Set up test includes
203- target_include_directories (${TEST_NAME}
204- PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /include
205- PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /internal
206- PRIVATE ${CMAKE_CURRENT_BINARY_DIR} /generated
210+ if (CUPDLPX_BUILD_TESTS)
211+ if (NOT TARGET cupdlpx_core)
212+ message (FATAL_ERROR "CUPDLPX_BUILD_TESTS=ON requires CUPDLPX_BUILD_STATIC_LIB=ON." )
213+ endif ()
214+
215+ enable_testing ()
216+ file (GLOB TEST_SOURCES
217+ "${CMAKE_CURRENT_SOURCE_DIR} /test/*.c"
218+ "${CMAKE_CURRENT_SOURCE_DIR} /test/*.cu"
207219 )
208-
209- # Tests are final executables, they must resolve device symbols
210- set_target_properties (${TEST_NAME} PROPERTIES
211- RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} /tests"
212- CUDA_RESOLVE_DEVICE_SYMBOLS ON
213- )
214-
215- # Register with CTest
216- add_test (NAME ${TEST_NAME} COMMAND ${TEST_NAME} )
217-
218- endforeach ()
220+
221+ foreach (TEST_SRC ${TEST_SOURCES} )
222+ get_filename_component (TEST_NAME ${TEST_SRC} NAME_WE )
223+
224+ add_executable (${TEST_NAME} ${TEST_SRC} )
225+
226+ # Link tests to the core static library
227+ target_link_libraries (${TEST_NAME} PRIVATE cupdlpx_core)
228+
229+ # Set up test includes
230+ target_include_directories (${TEST_NAME}
231+ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /include
232+ PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} /internal
233+ PRIVATE ${CMAKE_CURRENT_BINARY_DIR} /generated
234+ )
235+
236+ # Tests are final executables, they must resolve device symbols
237+ set_target_properties (${TEST_NAME} PROPERTIES
238+ RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR} /tests"
239+ CUDA_RESOLVE_DEVICE_SYMBOLS ON
240+ )
241+
242+ # Register with CTest
243+ add_test (NAME ${TEST_NAME} COMMAND ${TEST_NAME} )
244+
245+ endforeach ()
246+ endif ()
219247
220248# -----------------------------------------------------------------------------
221249# 5. Python Bindings (Conditional)
222250# -----------------------------------------------------------------------------
223251if (CUPDLPX_BUILD_PYTHON)
252+ if (NOT TARGET cupdlpx_core)
253+ message (FATAL_ERROR "CUPDLPX_BUILD_PYTHON=ON requires CUPDLPX_BUILD_STATIC_LIB=ON." )
254+ endif ()
255+
224256 add_subdirectory (python_bindings)
225257endif ()
226258
227259# -----------------------------------------------------------------------------
228260# 6. Install Targets
229261# -----------------------------------------------------------------------------
262+
230263if (CUPDLPX_BUILD_PYTHON)
231264 install (DIRECTORY include /
232265 DESTINATION include /
233266 FILES_MATCHING PATTERN "*.h"
234267 )
235268
236269else ()
237- install (TARGETS cupdlpx_core cupdlpx_shared cupdlpx_cli
238- ARCHIVE DESTINATION lib
239- LIBRARY DESTINATION lib
240- RUNTIME DESTINATION bin
241- )
270+ if (TARGET cupdlpx_core)
271+ install (TARGETS cupdlpx_core
272+ ARCHIVE DESTINATION lib
273+ )
274+ endif ()
275+
276+ if (TARGET cupdlpx_shared)
277+ install (TARGETS cupdlpx_shared
278+ LIBRARY DESTINATION lib
279+ RUNTIME DESTINATION bin # 'bin' for DLLs on Windows, 'lib' for .so on Linux
280+ )
281+ endif ()
282+
283+ if (TARGET cupdlpx_cli)
284+ install (TARGETS cupdlpx_cli
285+ RUNTIME DESTINATION bin
286+ )
287+ endif ()
288+
242289 install (DIRECTORY include /
243290 DESTINATION include /
244291 FILES_MATCHING PATTERN "*.h"
0 commit comments