diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 61f6eb91df..b17b8befec 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -512,56 +512,41 @@ if (NOT SKIP_GRPC_BUILD) APPEND PROPERTY COMPILE_OPTIONS "-DNDEBUG") endif (NOT SKIP_GRPC_BUILD) -add_library(cuopt SHARED +add_library(cuopt_objs OBJECT ${CUOPT_SRC_FILES} ) -set_target_properties(cuopt - PROPERTIES BUILD_RPATH "\$ORIGIN" - INSTALL_RPATH "\$ORIGIN" - INTERFACE_POSITION_INDEPENDENT_CODE ON +set_target_properties(cuopt_objs + PROPERTIES POSITION_INDEPENDENT_CODE ON CXX_SCAN_FOR_MODULES OFF ) -target_compile_definitions(cuopt - PUBLIC "CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}" - PUBLIC CUSPARSE_ENABLE_EXPERIMENTAL_API +target_compile_definitions(cuopt_objs + PUBLIC "CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}" + PUBLIC CUSPARSE_ENABLE_EXPERIMENTAL_API ) -target_compile_options(cuopt +target_compile_options(cuopt_objs PRIVATE "$<$:${CUOPT_CXX_FLAGS}>" "$<$:${CUOPT_CUDA_FLAGS}>" ) -if (WRITE_FATBIN) - file(WRITE "${CUOPT_BINARY_DIR}/fatbin.ld" - [=[ - SECTIONS - { - .nvFatBinSegment : { *(.nvFatBinSegment) } - .nv_fatbin : { *(.nv_fatbin) } - } - ]=]) - target_link_options(cuopt PRIVATE "${CUOPT_BINARY_DIR}/fatbin.ld") -endif () - -add_library(cuopt::cuopt ALIAS cuopt) # ################################################################################################## # - include paths --------------------------------------------------------------------------------- message(STATUS "target include directories CUDSS_INCLUDES = ${CUDSS_INCLUDE}") # Adding Papilo as a system include messes up clang's include resolution if papilo is already installed as a conda package -target_include_directories(cuopt PRIVATE +target_include_directories(cuopt_objs PRIVATE "${papilo_SOURCE_DIR}/src" "${papilo_BINARY_DIR}" ) -target_include_directories(cuopt SYSTEM PRIVATE - "${pslp_SOURCE_DIR}/include" - "${dejavu_SOURCE_DIR}" +target_include_directories(cuopt_objs SYSTEM PRIVATE + "${pslp_SOURCE_DIR}/include" + "${dejavu_SOURCE_DIR}" ) -target_include_directories(cuopt +target_include_directories(cuopt_objs PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty" "${CMAKE_CURRENT_SOURCE_DIR}/src" @@ -581,8 +566,8 @@ target_include_directories(cuopt ) # Link PSLP by file to avoid export dependency tracking -target_link_libraries(cuopt PRIVATE $) -add_dependencies(cuopt PSLP) +target_link_libraries(cuopt_objs PRIVATE $) +add_dependencies(cuopt_objs PSLP) # ################################################################################################## # - link libraries -------------------------------------------------------------------------------- @@ -597,7 +582,7 @@ list(PREPEND CUOPT_PRIVATE_CUDA_LIBS CUDA::cublasLt) # Pass CUDSS_MT_LIB_FILE_NAME as a compile definition get_filename_component(CUDSS_MT_LIB_FILE_NAME "${CUDSS_MT_LIB_FILE}" NAME) -target_compile_definitions(cuopt PRIVATE CUDSS_MT_LIB_FILE_NAME="${CUDSS_MT_LIB_FILE_NAME}") +target_compile_definitions(cuopt_objs PRIVATE CUDSS_MT_LIB_FILE_NAME="${CUDSS_MT_LIB_FILE_NAME}") execute_process( COMMAND git rev-parse --short HEAD @@ -616,14 +601,14 @@ configure_file( ) # Add the generated include directory -target_include_directories(cuopt PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/include) +target_include_directories(cuopt_objs PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/include) list(JOIN CMAKE_CUDA_ARCHITECTURES "," JOINED_CUDA_ARCHITECTURES) -target_compile_definitions(cuopt PUBLIC +target_compile_definitions(cuopt_objs PUBLIC CUOPT_CUDA_ARCHITECTURES="${JOINED_CUDA_ARCHITECTURES}" CUOPT_CPU_ARCHITECTURE="${CMAKE_SYSTEM_PROCESSOR}") -target_link_libraries(cuopt +target_link_libraries(cuopt_objs PUBLIC CUDA::cublas CUDA::cusparse @@ -635,7 +620,6 @@ target_link_libraries(cuopt PRIVATE ${CUOPT_PRIVATE_CUDA_LIBS} simde::simde - OpenMP::OpenMP_CXX OpenMP::OpenMP_CUDA $<$:protobuf::libprotobuf> $<$:gRPC::grpc++> @@ -645,9 +629,101 @@ target_link_libraries(cuopt # - generate tests -------------------------------------------------------------------------------- if (BUILD_TESTS) include(CTest) + add_library(cuopt_static STATIC $) + target_link_libraries(cuopt_static + PUBLIC + CUDA::cublas + CUDA::cusparse + rmm::rmm + rapids_logger::rapids_logger + CCCL::CCCL + raft::raft + ${CUDSS_LIB_FILE} + OpenMP::OpenMP_CXX + PRIVATE + ${CUOPT_PRIVATE_CUDA_LIBS} + $<$:protobuf::libprotobuf> + $<$:gRPC::grpc++> + ) + # Internal test sources include OMP-dependent headers (omp_helpers.hpp, omp_atomic_t). + # Propagate -fopenmp for CUDA TUs since OpenMP::OpenMP_CXX only covers CXX. + target_compile_options(cuopt_static INTERFACE + "$<$:-fopenmp>" + ) + target_include_directories(cuopt_static + PUBLIC + "$" + "$" + "$" + ) + target_compile_definitions(cuopt_static PUBLIC + CUOPT_CUDA_ARCHITECTURES="${JOINED_CUDA_ARCHITECTURES}" + CUOPT_CPU_ARCHITECTURE="${CMAKE_SYSTEM_PROCESSOR}" + "CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}" + CUSPARSE_ENABLE_EXPERIMENTAL_API + ) + target_link_libraries(cuopt_static PRIVATE $) + add_dependencies(cuopt_static PSLP) add_subdirectory(tests) endif (BUILD_TESTS) +add_library(cuopt SHARED $) +add_library(cuopt::cuopt ALIAS cuopt) +set_target_properties(cuopt + PROPERTIES BUILD_RPATH "\$ORIGIN" + INSTALL_RPATH "\$ORIGIN" + INTERFACE_POSITION_INDEPENDENT_CODE ON + CXX_SCAN_FOR_MODULES OFF + LINKER_LANGUAGE CUDA +) +# cuopt needs PUBLIC interface for consumers +target_include_directories(cuopt + PUBLIC + "$" + "$" + INTERFACE + "$" +) +target_link_libraries(cuopt + PUBLIC + CUDA::cublas + CUDA::cusparse + rmm::rmm + rapids_logger::rapids_logger + CCCL::CCCL + raft::raft + ${CUDSS_LIB_FILE} + PRIVATE + ${CUOPT_PRIVATE_CUDA_LIBS} + simde::simde + OpenMP::OpenMP_CXX + OpenMP::OpenMP_CUDA + $<$:protobuf::libprotobuf> + $<$:gRPC::grpc++> +) +target_link_libraries(cuopt PRIVATE $) +add_dependencies(cuopt PSLP) +# Propagate compile definitions that consumers need when including cuopt headers. +# These were on cuopt directly before the cuopt_objs refactor; $ +# does not carry INTERFACE properties, so we restore them explicitly. +target_compile_definitions(cuopt + PUBLIC + "CUOPT_LOG_ACTIVE_LEVEL=RAPIDS_LOGGER_LOG_LEVEL_${LIBCUOPT_LOGGING_LEVEL}" + CUSPARSE_ENABLE_EXPERIMENTAL_API +) + +if (WRITE_FATBIN) + file(WRITE "${CUOPT_BINARY_DIR}/fatbin.ld" + [=[ + SECTIONS + { + .nvFatBinSegment : { *(.nvFatBinSegment) } + .nv_fatbin : { *(.nv_fatbin) } + } + ]=]) + target_link_options(cuopt PRIVATE "${CUOPT_BINARY_DIR}/fatbin.ld") +endif () + # ################################################################################################## # - install targets ------------------------------------------------------------------------------- diff --git a/cpp/tests/CMakeLists.txt b/cpp/tests/CMakeLists.txt index 27f6c94983..a5f0cf6e49 100644 --- a/cpp/tests/CMakeLists.txt +++ b/cpp/tests/CMakeLists.txt @@ -37,11 +37,19 @@ endif() set(CUOPT_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}) # ################################################################ ------------------------------------------------------------------ -# ConfigureTest(NAME source1.cu source2.cu [LABELS label1 label2 ...]) +# ConfigureTest(NAME source1.cu source2.cu [STATIC_LIB] [LABELS label1 label2 ...]) # # LABELS sets CTest labels for selective local test execution via `ctest -L