# ######################################################################## # Copyright (C) 2016-2026 Advanced Micro Devices, Inc. All rights reserved. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell cop- # ies of the Software, and to permit persons to whom the Software is furnished # to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IM- # PLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNE- # CTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # ######################################################################## find_package(GTest REQUIRED) if(BUILD_HIPBLAS_TESTS) if(NOT TARGET hipblas) if(CUSTOM_HIPBLAS) set(ENV{hipblas_DIR} ${CUSTOM_HIPBLAS}) find_package(hipblas REQUIRED CONFIG NO_CMAKE_PATH) else() find_package(hipblas REQUIRED CONFIG PATHS ${ROCM_PATH} /opt/rocm) endif() endif() endif() if(BUILD_HIPSPARSE_TESTS) if(NOT TARGET hipsparse) if(CUSTOM_HIPSPARSE) set(ENV{hipsparse_DIR} ${CUSTOM_HIPSPARSE}) find_package(hipsparse REQUIRED CONFIG NO_CMAKE_PATH) else() find_package(hipsparse REQUIRED CONFIG PATHS ${ROCM_PATH} /opt/rocm) endif() endif() endif() set(hipsolverDn_test_source hipsolver_gtest_main.cpp getrs_gtest.cpp getrf_gtest.cpp gebrd_gtest.cpp gels_gtest.cpp geqrf_gtest.cpp gesv_gtest.cpp gesvd_gtest.cpp gesvda_gtest.cpp gesvdj_gtest.cpp potrf_gtest.cpp potri_gtest.cpp potrs_gtest.cpp syevd_heevd_gtest.cpp syevj_heevj_gtest.cpp sygvd_hegvd_gtest.cpp sygvj_hegvj_gtest.cpp syevdx_heevdx_gtest.cpp sygvdx_hegvdx_gtest.cpp sytrd_hetrd_gtest.cpp syev_heev_gtest.cpp sytrf_gtest.cpp sytrs_gtest.cpp geev_gtest.cpp orgbr_ungbr_gtest.cpp orgqr_ungqr_gtest.cpp orgtr_ungtr_gtest.cpp ormqr_unmqr_gtest.cpp ormtr_unmtr_gtest.cpp ) set(hipsolverSp_test_source csrlsvchol_gtest.cpp csrlsvqr_gtest.cpp ) set(hipsolverRf_test_source csrrf_refactlu_gtest.cpp csrrf_solve_gtest.cpp ) set(others_test_source determinism_gtest.cpp params_gtest.cpp ) add_executable(hipsolver-test ${others_test_source} ${hipsolverDn_test_source} ${hipsolverRf_test_source}) if(BUILD_COVERAGE) target_compile_options(hipsolver-test PRIVATE -g -O0 -fgenerate-instr-profile -fcoverage-mapping) target_link_options(hipsolver-test PUBLIC -g -O0 -fgenerate-instr-profile) endif() target_include_directories(hipsolver-test PRIVATE $ ) add_armor_flags(hipsolver-test "${ARMOR_LEVEL}") target_compile_definitions(hipsolver-test PRIVATE GOOGLE_TEST) # External header includes included as SYSTEM files target_include_directories(hipsolver-test SYSTEM PRIVATE $ $ ) # TODO: This LAPACK dependency is only required to support geev # It should be removed once geev is implemented in rocSOLVER if(NOT "${HIP_PLATFORM}" STREQUAL "nvidia" AND TARGET lapack_libraries) target_link_libraries(hipsolver-test PRIVATE lapack_libraries ) else() target_link_libraries(hipsolver-test PRIVATE ${LAPACK_LIBRARIES} ) endif() target_link_libraries(hipsolver-test PRIVATE hipsolver-common clients-common $,GTest::gtest,GTest::GTest> Threads::Threads roc::hipsolver ) if(BUILD_HIPBLAS_TESTS) target_link_libraries(hipsolver-test PRIVATE roc::hipblas) target_sources(hipsolver-test PRIVATE hipblas_include1_gtest.cpp hipblas_include2_gtest.cpp) endif() if(BUILD_HIPSPARSE_TESTS) target_link_libraries(hipsolver-test PRIVATE roc::hipsparse) target_sources(hipsolver-test PRIVATE ${hipsolverSp_test_source}) endif() if(BUILD_FORTRAN_BINDINGS) target_link_libraries(hipsolver-test PRIVATE hipsolver_fortran_client) target_sources(hipsolver-test PRIVATE ${hipsolver_f90_source}) endif() if(NOT "${HIP_PLATFORM}" STREQUAL "nvidia") target_link_libraries(hipsolver-test PRIVATE hip::host) if(CUSTOM_TARGET) target_link_libraries(hipsolver-test PRIVATE hip::${CUSTOM_TARGET}) endif() if(CMAKE_CXX_COMPILER MATCHES ".*/hipcc$") #hip-clang needs specific flag to turn on pthread and m target_link_libraries(hipsolver-test PRIVATE -lpthread -lm) endif() else() target_compile_definitions(hipsolver-test PRIVATE __HIP_PLATFORM_NVIDIA__) target_include_directories(hipsolver-test PRIVATE $ ) target_link_libraries(hipsolver-test PRIVATE ${CUDA_LIBRARIES} Threads::Threads) endif() set_target_properties(hipsolver-test PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/staging") # Optional: CTest test categorization when building in rocm-libraries with shared/ctest. # Skipped when shared/ is not present (e.g. standalone hipSOLVER or sparse checkout in CI). set(HIPSOLVER_HAS_CTEST_CATEGORIES OFF) if(DEFINED ROCM_LIBRARIES_ROOT AND EXISTS "${ROCM_LIBRARIES_ROOT}/shared/ctest/TestCategories.cmake") include("${ROCM_LIBRARIES_ROOT}/shared/ctest/TestCategories.cmake") set(HIPSOLVER_HAS_CTEST_CATEGORIES ON) endif() # Only when both test_categories.yaml and shared/ctest exist (full rocm-libraries tree). set(HIPSOLVER_CTEST_INSTALL_FILE "") if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/test_categories.yaml") if(HIPSOLVER_HAS_CTEST_CATEGORIES) enable_testing() message(STATUS "hipSOLVER: YAML-based test categorization") file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/staging") # Install-time CTestTestfile for TheRock: relative paths so ctest can run from installed location set(HIPSOLVER_CTEST_INSTALL_FILE "${CMAKE_CURRENT_BINARY_DIR}/install_CTestTestfile.cmake") file(WRITE "${HIPSOLVER_CTEST_INSTALL_FILE}" [=[ # This is a test file generated by hipSOLVER for install time. # Tests are defined with relative paths to work in the installed location. ]=] ) apply_test_category_labels( hipsolver-test "${CMAKE_CURRENT_SOURCE_DIR}/test_categories.yaml" "${PROJECT_BINARY_DIR}/staging" "${HIPSOLVER_CTEST_INSTALL_FILE}" ) else() message(STATUS "hipSOLVER: shared/ctest not found (e.g. standalone checkout), skipping CTest categories") endif() else() message(STATUS "hipSOLVER: No test_categories.yaml (CTest categories not used)") endif() # Install CTestTestfile.cmake to bin/hipsolver/ for TheRock (relocatable tests; run ctest from that dir) if(HIPSOLVER_CTEST_INSTALL_FILE) rocm_install( FILES "${HIPSOLVER_CTEST_INSTALL_FILE}" DESTINATION "${CMAKE_INSTALL_BINDIR}/hipsolver" COMPONENT tests RENAME "CTestTestfile.cmake" ) endif() rocm_install(TARGETS hipsolver-test COMPONENT tests) if(WIN32) file(GLOB third_party_dlls LIST_DIRECTORIES OFF CONFIGURE_DEPENDS ${cblas_DIR}/bin/*.dll ${GTest_DIR}/bin/*.dll $ENV{rocblas_DIR}/bin/*.dll $ENV{rocsolver_DIR}/bin/*.dll $ENV{HIP_DIR}/bin/*.dll $ENV{HIP_DIR}/bin/hipinfo.exe ${CMAKE_SOURCE_DIR}/rtest.* ) foreach(file_i ${third_party_dlls}) add_custom_command(TARGET hipsolver-test POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy ${file_i} ${PROJECT_BINARY_DIR}/staging/ ) endforeach() if(DEFINED ENV{rocblas_DIR}) add_custom_command(TARGET hipsolver-test POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory $ENV{rocblas_DIR}/bin/rocblas/library ${PROJECT_BINARY_DIR}/staging/library ) else() message(WARNING "ENV{rocblas_DIR} not set, tests may be missing .dlls") endif() endif()