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
152 lines
6.2 KiB
CMake
152 lines
6.2 KiB
CMake
# Copyright (c) Advanced Micro Devices, Inc. All rights reserved.
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
# This module sets up GoogleTest and applies settings to its targets, so it must
|
|
# run exactly once.
|
|
include_guard(GLOBAL)
|
|
|
|
include(AISSanitizers)
|
|
include(FetchContent)
|
|
|
|
# GoogleTest's ThreadLocal<T> implementation uses POSIX thread-key APIs
|
|
# (pthread_key_create, pthread_setspecific, etc.). These must be linked
|
|
# explicitly: lld (used by the sanitizer toolchain) errors on the undefined
|
|
# symbols in libgtest.a / libgmock.a, whereas GNU ld resolves them
|
|
# transitively and masks the missing dependency.
|
|
find_package(Threads REQUIRED)
|
|
|
|
# Decide whether to check for a system GoogleTest install first. When building
|
|
# with the sanitizers, we HAVE to build GoogleTest from source.
|
|
if(AIS_USE_SANITIZERS OR AIS_USE_THREAD_SANITIZER)
|
|
set(AIS_GTEST_TRY_SYSTEM FALSE)
|
|
else()
|
|
set(AIS_GTEST_TRY_SYSTEM TRUE)
|
|
endif()
|
|
|
|
set(INSTALL_GTEST OFF CACHE BOOL "Don't install GoogleTest")
|
|
set(GTEST_HAS_ABSL OFF CACHE BOOL "Don't use Abseil for GoogleTest")
|
|
|
|
# We use find_package manually instead of FIND_PACKAGE_ARGS with
|
|
# FetchContent_Declare, since FIND_PACKAGE_ARGS was introduced in CMake
|
|
# version 3.24, which is unavailable on some operating systems:
|
|
# https://cmake.org/cmake/help/latest/module/FetchContent.html
|
|
if(AIS_GTEST_TRY_SYSTEM)
|
|
find_package(GTest QUIET)
|
|
endif()
|
|
|
|
if(NOT GTest_FOUND)
|
|
# lint_cmake: -readability/wonkycase
|
|
FetchContent_Declare(
|
|
googletest
|
|
URL https://github.com/google/googletest/releases/download/v1.17.0/googletest-1.17.0.tar.gz
|
|
URL_HASH SHA256=65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c
|
|
DOWNLOAD_EXTRACT_TIMESTAMP true
|
|
SYSTEM
|
|
)
|
|
FetchContent_MakeAvailable(googletest)
|
|
# lint_cmake: +readability/wonkycase
|
|
endif()
|
|
|
|
if(googletest_SOURCE_DIR)
|
|
message(STATUS "Using fetched GoogleTest")
|
|
else()
|
|
message(STATUS "Using system GoogleTest")
|
|
endif()
|
|
|
|
if(AIS_USE_SANITIZERS OR AIS_USE_THREAD_SANITIZER)
|
|
ais_add_sanitizers(GTest::gtest)
|
|
ais_add_sanitizers(GTest::gmock)
|
|
endif()
|
|
|
|
# Propagate pthread linkage to anything that links a GTest target, so the
|
|
# individual test CMakeLists files don't each have to add Threads::Threads.
|
|
# Fetched GoogleTest exposes GTest::gtest/GTest::gmock as ALIAS targets, which
|
|
# cannot be modified directly, so resolve to the underlying target first. We
|
|
# use set_property(... APPEND ...) rather than target_link_libraries() so this
|
|
# works uniformly for the IMPORTED targets that a system find_package(GTest)
|
|
# produces as well as the normal targets from a fetched build. A system GTest
|
|
# install may provide gtest without gmock, so only touch targets that exist.
|
|
#
|
|
# A from-source GoogleTest already links Threads::Threads on its targets, so
|
|
# check before appending to avoid a duplicate entry in the link interface.
|
|
foreach(gtest_target GTest::gtest GTest::gmock)
|
|
if(NOT TARGET ${gtest_target})
|
|
continue()
|
|
endif()
|
|
get_target_property(aliased ${gtest_target} ALIASED_TARGET)
|
|
if(aliased)
|
|
set(gtest_target ${aliased})
|
|
endif()
|
|
get_target_property(existing_libs ${gtest_target} INTERFACE_LINK_LIBRARIES)
|
|
if(NOT existing_libs MATCHES "Threads::Threads")
|
|
set_property(TARGET ${gtest_target} APPEND PROPERTY
|
|
INTERFACE_LINK_LIBRARIES Threads::Threads)
|
|
endif()
|
|
|
|
# Mark GoogleTest's headers as system includes so consumers pull them in
|
|
# via -isystem. clang-tidy suppresses diagnostics from system headers by
|
|
# default, which keeps GoogleTest's macros and templates from polluting our
|
|
# test builds with warnings we can't fix. The SYSTEM keyword passed to
|
|
# FetchContent_Declare only takes effect on CMake >= 3.25, and a system
|
|
# find_package(GTest) is not guaranteed to mark them either, so set the
|
|
# property here directly to cover every path.
|
|
set_target_properties(${gtest_target} PROPERTIES
|
|
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES
|
|
"$<TARGET_PROPERTY:${gtest_target},INTERFACE_INCLUDE_DIRECTORIES>")
|
|
endforeach()
|
|
|
|
include(GoogleTest)
|
|
|
|
# Absolute path to the LeakSanitizer suppression file. Only applied when
|
|
# building with the (non-TSAN) sanitizers.
|
|
set(AIS_LSAN_SUPPRESSIONS_FILE "${HIPFILE_ROOT_PATH}/cmake/lsan-suppressions.supp")
|
|
|
|
function(ais_gtest_discover_tests target)
|
|
set(forwarded_args ${ARGV})
|
|
|
|
# When the address sanitizer is on, force every discovered test to load the
|
|
# LSan suppression file via LSAN_OPTIONS. We splice an ENVIRONMENT entry into
|
|
# the PROPERTIES list that gtest_discover_tests applies to each test case, so
|
|
# the suppression travels with the test regardless of how ctest is invoked.
|
|
if(AIS_USE_SANITIZERS)
|
|
set(lsan_env "LSAN_OPTIONS=suppressions=${AIS_LSAN_SUPPRESSIONS_FILE}")
|
|
list(FIND forwarded_args "PROPERTIES" props_idx)
|
|
if(props_idx EQUAL -1)
|
|
list(APPEND forwarded_args PROPERTIES ENVIRONMENT "${lsan_env}")
|
|
else()
|
|
# Insert ENVIRONMENT right after the PROPERTIES keyword so it joins
|
|
# the existing property name/value pairs the caller passed.
|
|
math(EXPR insert_idx "${props_idx} + 1")
|
|
list(INSERT forwarded_args ${insert_idx} ENVIRONMENT "${lsan_env}")
|
|
endif()
|
|
endif()
|
|
|
|
cmake_language(CALL gtest_discover_tests ${forwarded_args})
|
|
|
|
if(AIS_USE_CODE_COVERAGE)
|
|
set(options)
|
|
set(oneValueArgs TEST_LIST)
|
|
set(multiValueArgs)
|
|
cmake_parse_arguments(PARSE_ARGV 0 arg "${options}" "${oneValueArgs}" "${multiValueArgs}")
|
|
if(NOT arg_TEST_LIST)
|
|
# Set to target name if not specified. This will result in collisions
|
|
# if we run the same test binary in different configurations without
|
|
# specifying a test list.
|
|
set(arg_TEST_LIST ${target})
|
|
endif()
|
|
|
|
set(coverage_include_file "${CMAKE_CURRENT_BINARY_DIR}/${arg_TEST_LIST}_coverage_include.cmake")
|
|
set_property(
|
|
DIRECTORY APPEND PROPERTY
|
|
TEST_INCLUDE_FILES
|
|
"${HIPFILE_ROOT_PATH}/cmake/AISSetCoverageFile.cmake"
|
|
"${coverage_include_file}"
|
|
)
|
|
|
|
file(WRITE "${coverage_include_file}"
|
|
"ais_set_coverage_file(\"${arg_TEST_LIST}\" \"${CMAKE_CURRENT_BINARY_DIR}\")"
|
|
)
|
|
endif()
|
|
endfunction()
|