diff --git a/CMakeLists.txt b/CMakeLists.txt index 4cdb9bf5a1..3fac74cedc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -837,6 +837,37 @@ set_property(TARGET rccl PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time") ## Setup librccl.so version rocm_set_soversion(rccl "1.0") +if(NOT BUILD_SHARED_LIBS) + # To create a static lib with `-fgpu-rdc`, you need `--emit-static-lib` and `--hip-link`. + # You also need to invoke amdclang++ again to trigger GPU code generation. + set(static_link_flags + ${CXXFLAGS} + --hip-link + -fgpu-rdc + --emit-static-lib + ) + + # Find all the libraries we need to link at link time to include them in the clang link + # command line. + get_target_property(rccl_libs rccl LINK_LIBRARIES) + foreach(target ${rccl_libs}) + if(TARGET ${target}) + get_target_property(location ${target} LOCATION) + if(location) + LIST(APPEND static_link_flags -l${location}) + endif() + endif() + endforeach() + + foreach(target ${GPU_TARGETS}) + list(APPEND static_link_flags --offload-arch=${target}) + endforeach() + list(JOIN static_link_flags " " flags_str) + + # Invoking amdclang++ this way will produce a static archive, so just override ARCHIVE_CREATE. + set(CMAKE_CXX_ARCHIVE_CREATE " ${flags_str} -o ") +endif() + # Install settings #================================================================================================== ## Specify install targets diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 7fcbea1c08..48fcfe2746 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -86,14 +86,12 @@ if(BUILD_TESTS) # rccl-UnitTests using static library of rccl requires passing rccl # through -l and -L instead of command line input. - if(BUILD_STATIC) + if(BUILD_SHARED_LIBS) + target_link_libraries(rccl-UnitTests PRIVATE rccl) + set_property(TARGET rccl-UnitTests PROPERTY INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${ROCM_PATH}/lib;${CMAKE_BINARY_DIR}") + else() add_dependencies(rccl-UnitTests rccl) target_link_libraries(rccl-UnitTests PRIVATE dl rt numa -lrccl -L${CMAKE_BINARY_DIR} -lrocm_smi64 -L${ROCM_PATH}/lib -L${ROCM_PATH}/rocm_smi/lib) - else() - target_link_libraries(rccl-UnitTests PRIVATE rccl) - endif() - if(BUILD_SHARED_LIBS) - set_property(TARGET rccl-UnitTests PROPERTY INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib;${ROCM_PATH}/lib;${CMAKE_BINARY_DIR}") endif() set_property(TARGET rccl-UnitTests PROPERTY BUILD_RPATH "${CMAKE_BINARY_DIR};${ROCM_PATH}/lib") rocm_install(TARGETS rccl-UnitTests COMPONENT tests)