Files
TheRock/rocm-libraries/cmake/modules/shared_third_party.cmake
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

206 lines
8.5 KiB
CMake

# Copyright Advanced Micro Devices, Inc., or its affiliates.
# SPDX-License-Identifier: MIT
#
# Shared third-party dependency declarations for the rocm-libraries superbuild.
# Each subproject (hipdnn, miopen, etc.) may independently FetchContent the
# same libraries. To avoid duplicate downloads and the resulting risk of
# version skew or option conflicts, the superbuild may declare them once here,
# before any add_subdirectory() call, with OVERRIDE_FIND_PACKAGE. Subprojects
# then naturally pick up the shared content via find_package().
include_guard(GLOBAL)
include(FetchContent)
# _rocm_libs_suppress_rocm_toolchain_checks()
#
# Replace ROCMChecks's watched-variable callback with a no-op while a
# third-party CMake project configures. Some dependencies mutate compiler flag
# variables internally, and ROCMChecks reports those writes from variable_watch()
# regardless of ROCM_WARN_TOOLCHAIN_VAR.
macro(_rocm_libs_suppress_rocm_toolchain_checks)
if(COMMAND rocm_check_toolchain_var)
# Dummy function
function(rocm_check_toolchain_var)
endfunction()
endif()
endmacro()
# _rocm_libs_save_var(<name>)
#
# Save a normal, cache, and environment variable so it can be restored after
# configuring third-party content.
macro(_rocm_libs_save_var _name)
if(DEFINED CACHE{${_name}})
set(_rocm_libs_old_cache_${_name} $CACHE{${_name}})
unset(${_name} CACHE)
endif()
if(DEFINED ${_name})
set(_rocm_libs_old_${_name} ${${_name}})
endif()
if(DEFINED _rocm_libs_old_cache_${_name})
set(${_name} ${_rocm_libs_old_cache_${_name}} CACHE INTERNAL "")
endif()
if(DEFINED ENV{${_name}})
set(_rocm_libs_old_env_${_name} $ENV{${_name}})
endif()
endmacro()
# _rocm_libs_restore_var(<name>)
#
# Restore a variable saved by _rocm_libs_save_var().
macro(_rocm_libs_restore_var _name)
if(DEFINED _rocm_libs_old_${_name})
set(${_name} ${_rocm_libs_old_${_name}})
unset(_rocm_libs_old_${_name})
else()
unset(${_name})
endif()
if(DEFINED _rocm_libs_old_cache_${_name})
set(${_name} ${_rocm_libs_old_cache_${_name}} CACHE INTERNAL "")
unset(_rocm_libs_old_cache_${_name})
else()
unset(${_name} CACHE)
endif()
if(DEFINED _rocm_libs_old_env_${_name})
set(ENV{${_name}} ${_rocm_libs_old_env_${_name}})
unset(_rocm_libs_old_env_${_name})
else()
unset(ENV{${_name}})
endif()
endmacro()
# _rocm_libs_restore_rocm_toolchain_checks()
#
# Reinstall ROCMChecks's watched-variable callback after a suppression window.
# The warning and error toggles are disabled only for the include that restores
# the callback, so restoring does not emit the messages being suppressed.
macro(_rocm_libs_restore_rocm_toolchain_checks)
if(COMMAND rocm_check_toolchain_var)
_rocm_libs_save_var(ROCM_WARN_TOOLCHAIN_VAR)
_rocm_libs_save_var(ROCM_ERROR_TOOLCHAIN_VAR)
set(ROCM_WARN_TOOLCHAIN_VAR OFF)
set(ROCM_ERROR_TOOLCHAIN_VAR OFF)
include(ROCMChecks)
_rocm_libs_restore_var(ROCM_ERROR_TOOLCHAIN_VAR)
_rocm_libs_restore_var(ROCM_WARN_TOOLCHAIN_VAR)
endif()
endmacro()
# _create_missing_gtest_alias(<name>)
#
# Create a `GTest::<name>` ALIAS for the plain `<name>` target, if the source
# target exists and the alias does not already exist.
#
# Arguments:
# name Plain target name exported by upstream googletest (one of
# `gtest`, `gtest_main`, `gmock`, `gmock_main`).
#
# Rationale:
# Upstream googletest defines plain targets, while consumers that previously
# used CMake's FindGTest module expect the `GTest::` namespaced targets.
# This helper bridges the two without erroring if the source target is
# absent (e.g. when `BUILD_GMOCK` is OFF) or the alias is already present.
function(_create_missing_gtest_alias name)
if(TARGET ${name} AND NOT TARGET GTest::${name})
add_library(GTest::${name} ALIAS ${name})
endif()
endfunction()
# rocm_libs_declare_shared_deps()
#
# Declare third-party dependencies that are shared across superbuild
# subprojects, so that all subprojects resolve to a single fetched copy
# instead of each populating their own.
#
# This function takes no arguments. It must be called from the top-level
# superbuild CMakeLists.txt *before* any `add_subdirectory()` call that
# brings in a subproject which would otherwise fetch the same dependency.
#
# Each dependency is declared with `FetchContent_Declare(... OVERRIDE_FIND_PACKAGE)`
# and immediately made available, so subsequent `find_package()` calls in
# subprojects resolve to the shared content and their own fetches are skipped.
#
# Currently declares:
# - nlohmann_json (v3.12.0): shared by hipdnn and miopen.
# - GTest (v1.17.0): shared by hipdnn and miopen; forced static to
# work around missing dllexports on Windows.
#
# Side effects:
# - Sets cache variables for the declared dependencies (e.g.
# `JSON_BuildTests`, `gtest_force_shared_crt`, `BUILD_GMOCK`,
# `INSTALL_GTEST`) with FORCE.
# - Temporarily overrides `BUILD_SHARED_LIBS` while populating GTest and
# restores the original value before returning.
# - Creates `GTest::{gtest,gtest_main,gmock,gmock_main}` ALIAS targets.
function(rocm_libs_declare_shared_deps)
# -------------------------------------------------------------------------
# nlohmann_json
#
# Used by hipdnn (projects/hipdnn/cmake/Dependencies.cmake) and miopen
# (projects/miopen/cmake/ThirdParty.cmake). hipdnn fetches the content
# under the name `json` and uses the raw include dir; miopen fetches under
# the name `nlohmann_json` with OVERRIDE_FIND_PACKAGE and uses the
# standard `nlohmann_json::nlohmann_json` target. Declaring here (also
# under the name `nlohmann_json` with OVERRIDE_FIND_PACKAGE) means both
# subprojects' subsequent find_package(nlohmann_json) calls resolve to
# this single copy.
#
# Version and URL+hash mirror projects/miopen/cmake/ThirdParty.cmake so
# behavior is identical when miopen runs in MIOPEN_STANDALONE_BUILD mode
# outside the superbuild.
# -------------------------------------------------------------------------
set(JSON_BuildTests OFF CACHE BOOL "" FORCE)
set(JSON_MultipleHeaders ON CACHE BOOL "" FORCE)
set(JSON_Install ON CACHE BOOL "" FORCE)
FetchContent_Declare(nlohmann_json
URL https://github.com/nlohmann/json/archive/refs/tags/v3.12.0.tar.gz
URL_HASH SHA256=4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187
SYSTEM
OVERRIDE_FIND_PACKAGE)
FetchContent_MakeAvailable(nlohmann_json)
# -------------------------------------------------------------------------
# GTest
#
# Both hipdnn (projects/hipdnn/cmake/Dependencies.cmake `_fetch_gtest`,
# content name `googletest`, pin v1.16.0) and miopen
# (projects/miopen/cmake/ThirdParty.cmake, content name `GTest`,
# pin v1.17.0) FetchContent gtest. Their content names differ, so both
# populate. But both call add_library(gtest) / add_library(gmock) etc.,
# which produces a hard "target already exists" error when both
# subprojects are configured in the same superbuild.
#
# Declaring GTest here with OVERRIDE_FIND_PACKAGE causes both
# subprojects' find_package(GTest) calls to succeed against this single
# content, and they skip their own fetches. Pin matches miopen's choice
# (v1.17.0).
#
# GTest must be built static on Windows: gmock has class-static members
# (e.g. testing::internal::g_gmock_mutex) that lack __declspec(dllexport),
# so a shared gmock_main.dll fails to link. Match the same options miopen
# sets in projects/miopen/cmake/ThirdParty.cmake.
# -------------------------------------------------------------------------
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
set(BUILD_GMOCK ON CACHE BOOL "" FORCE)
set(INSTALL_GTEST OFF CACHE BOOL "" FORCE)
_rocm_libs_save_var(BUILD_SHARED_LIBS)
set(BUILD_SHARED_LIBS OFF)
FetchContent_Declare(GTest
URL https://github.com/google/googletest/archive/refs/tags/v1.17.0.tar.gz
URL_HASH SHA256=65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c
SYSTEM
OVERRIDE_FIND_PACKAGE)
_rocm_libs_suppress_rocm_toolchain_checks()
FetchContent_MakeAvailable(GTest)
_rocm_libs_restore_rocm_toolchain_checks()
_rocm_libs_restore_var(BUILD_SHARED_LIBS)
foreach(_lib gtest gtest_main gmock gmock_main)
_create_missing_gtest_alias(${_lib})
endforeach()
endfunction()