Skip to content

Commit c2e7bb4

Browse files
authored
Add options for CMakeLists.txt (#32)
1 parent 43c7958 commit c2e7bb4

File tree

2 files changed

+128
-77
lines changed

2 files changed

+128
-77
lines changed

CMakeLists.txt

Lines changed: 123 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -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
# -----------------------------------------------------------------------------
223251
if (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)
225257
endif()
226258

227259
# -----------------------------------------------------------------------------
228260
# 6. Install Targets
229261
# -----------------------------------------------------------------------------
262+
230263
if (CUPDLPX_BUILD_PYTHON)
231264
install(DIRECTORY include/
232265
DESTINATION include/
233266
FILES_MATCHING PATTERN "*.h"
234267
)
235268

236269
else()
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"

pyproject.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "scikit_build_core.build"
44

55
[project]
66
name = "cupdlpx"
7-
version = "0.1.2"
7+
version = "0.1.3"
88
description = "Python bindings for cuPDLPx (GPU-accelerated first-order LP solver)"
99
readme = "README.md"
1010
license = { text = "Apache-2.0" }
@@ -28,6 +28,10 @@ sdist.include = ["tests/**", "pyproject.toml", "README.md", "LICENSE"]
2828
CMAKE_CUDA_ARCHITECTURES = "75;80;86;89;90;90-virtual"
2929
CMAKE_CUDA_STANDARD = "17"
3030
CUPDLPX_BUILD_PYTHON = "ON"
31+
CUPDLPX_BUILD_STATIC_LIB = "ON"
32+
CUPDLPX_BUILD_SHARED_LIB = "OFF"
33+
CUPDLPX_BUILD_CLI = "OFF"
34+
CUPDLPX_BUILD_TESTS = "OFF"
3135

3236
[project.optional-dependencies]
3337
test = [

0 commit comments

Comments
 (0)