Skip to content

Commit d3d4b80

Browse files
committed
Test property util prototype
1 parent 9908811 commit d3d4b80

7 files changed

Lines changed: 134 additions & 34 deletions

File tree

share/rocmcmakebuildtools/cmake/ROCMTest.cmake

Lines changed: 3 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -98,40 +98,10 @@ function(rocm_save_test)
9898
endif()
9999
endforeach()
100100
file(APPEND ${_rocm_test_config_file}.in "add_test(${PARSE_NAME} ${COMMAND})\n")
101-
set(PROP_NAMES
102-
ATTACHED_FILES
103-
ATTACHED_FILES_ON_FAIL
104-
COST
105-
DEPENDS
106-
DISABLED
107-
ENVIRONMENT
108-
ENVIRONMENT_MODIFICATION
109-
FAIL_REGULAR_EXPRESSION
110-
FIXTURES_CLEANUP
111-
FIXTURES_REQUIRED
112-
FIXTURES_SETUP
113-
LABELS
114-
MEASUREMENT
115-
PASS_REGULAR_EXPRESSION
116-
PROCESSOR_AFFINITY
117-
PROCESSORS
118-
REQUIRED_FILES
119-
RESOURCE_GROUPS
120-
RESOURCE_LOCK
121-
RUN_SERIAL
122-
SKIP_REGULAR_EXPRESSION
123-
SKIP_RETURN_CODE
124-
TIMEOUT
125-
TIMEOUT_AFTER_MATCH
126-
WILL_FAIL
127-
WORKING_DIRECTORY)
101+
rocm_test_property_names(PROP_NAMES)
128102
set(PROPS "")
129103
foreach(PROPERTY ${PROP_NAMES})
130-
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28.0")
131-
get_property(VALUE TEST ${PARSE_NAME} DIRECTORY "${PARSE_DIRECTORY}" PROPERTY ${PROPERTY})
132-
else()
133-
get_test_property(${PARSE_NAME} ${PROPERTY} VALUE)
134-
endif()
104+
rocm_get_test_property(${PARSE_NAME} ${PROPERTY} DIRECTORY "${PARSE_DIRECTORY}" VALUE)
135105
if(VALUE)
136106
string(APPEND PROPS " ${PROPERTY} \"${VALUE}\"")
137107
endif()
@@ -201,6 +171,7 @@ function(rocm_add_test)
201171
endif()
202172
add_test(NAME ${PARSE_NAME} COMMAND ${COMMAND})
203173
set_tests_properties(${PARSE_NAME} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED")
174+
rocm_auto_register_test_props()
204175
endfunction()
205176

206177
function(rocm_mark_as_test)

share/rocmcmakebuildtools/cmake/ROCMUtilities.cmake

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,9 @@ else()
4040
endmacro()
4141
endif()
4242

43-
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.18.0")
43+
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.19.0")
4444
macro(rocm_defer FNAME)
45-
cmake_language(DEFER DIRECTORY ${CMAKE_SOURCE_DIR} CALL ${FNAME}())
45+
cmake_language(DEFER DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} CALL ${FNAME}())
4646
endmacro()
4747
else()
4848
macro(rocm_defer FNAME)
@@ -55,6 +55,101 @@ else()
5555
endmacro()
5656
endif()
5757

58+
function(rocm_test_property_names OUTPUT)
59+
set(${OUTPUT}
60+
ATTACHED_FILES
61+
ATTACHED_FILES_ON_FAIL
62+
COST
63+
DEPENDS
64+
DISABLED
65+
ENVIRONMENT
66+
ENVIRONMENT_MODIFICATION
67+
FAIL_REGULAR_EXPRESSION
68+
FIXTURES_CLEANUP
69+
FIXTURES_REQUIRED
70+
FIXTURES_SETUP
71+
LABELS
72+
MEASUREMENT
73+
PASS_REGULAR_EXPRESSION
74+
PROCESSOR_AFFINITY
75+
PROCESSORS
76+
REQUIRED_FILES
77+
RESOURCE_GROUPS
78+
RESOURCE_LOCK
79+
RUN_SERIAL
80+
SKIP_REGULAR_EXPRESSION
81+
SKIP_RETURN_CODE
82+
TIMEOUT
83+
TIMEOUT_AFTER_MATCH
84+
WILL_FAIL
85+
WORKING_DIRECTORY
86+
PARENT_SCOPE)
87+
endfunction()
88+
89+
# Stashes the local tests' properties into directory-keyed globals so they can
90+
# be read from another scope before cmake 3.28. Runs in the test's own scope.
91+
function(rocm_test_collect_local_test_props)
92+
rocm_test_property_names(props)
93+
get_property(tests DIRECTORY PROPERTY TESTS)
94+
foreach(test IN LISTS tests)
95+
foreach(prop IN LISTS props)
96+
get_test_property(${test} ${prop} val)
97+
if(NOT val STREQUAL "NOTFOUND")
98+
set_property(GLOBAL PROPERTY "_rocm_test_prop|${CMAKE_CURRENT_SOURCE_DIR}|${test}|${prop}" "${val}")
99+
endif()
100+
endforeach()
101+
endforeach()
102+
endfunction()
103+
104+
# Schedules the collector once per directory (only needed before cmake 3.28).
105+
function(rocm_auto_register_test_props)
106+
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28.0")
107+
return()
108+
endif()
109+
get_property(scheduled DIRECTORY PROPERTY _rocm_test_props_collector_scheduled)
110+
if(NOT scheduled)
111+
set_property(DIRECTORY PROPERTY _rocm_test_props_collector_scheduled TRUE)
112+
rocm_defer(rocm_test_collect_local_test_props)
113+
endif()
114+
endfunction()
115+
116+
# get_test_property that also reads across directory scopes: built-in DIRECTORY
117+
# support on cmake 3.28+, otherwise the value rocm_test_collect_local_test_props
118+
# stashed for that directory.
119+
function(rocm_get_test_property)
120+
cmake_parse_arguments(ARG "" "DIRECTORY" "" ${ARGN})
121+
list(LENGTH ARG_UNPARSED_ARGUMENTS _n)
122+
if(NOT _n EQUAL 3)
123+
message(FATAL_ERROR "rocm_get_test_property: expected <test> <property> [DIRECTORY <dir>] <out-var>")
124+
endif()
125+
list(GET ARG_UNPARSED_ARGUMENTS 0 _test)
126+
list(GET ARG_UNPARSED_ARGUMENTS 1 _prop)
127+
list(GET ARG_UNPARSED_ARGUMENTS 2 _out)
128+
if(NOT DEFINED ARG_DIRECTORY)
129+
get_test_property(${_test} ${_prop} _val)
130+
set(${_out} "${_val}" PARENT_SCOPE)
131+
return()
132+
endif()
133+
get_filename_component(_dir "${ARG_DIRECTORY}" ABSOLUTE)
134+
if(_dir STREQUAL CMAKE_CURRENT_SOURCE_DIR)
135+
get_test_property(${_test} ${_prop} _val)
136+
set(${_out} "${_val}" PARENT_SCOPE)
137+
return()
138+
endif()
139+
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.28.0")
140+
get_property(_val TEST ${_test} DIRECTORY "${_dir}" PROPERTY ${_prop})
141+
else()
142+
set(_key "_rocm_test_prop|${_dir}|${_test}|${_prop}")
143+
get_property(_set GLOBAL PROPERTY "${_key}" SET)
144+
if(_set)
145+
get_property(_val GLOBAL PROPERTY "${_key}")
146+
else()
147+
set(_val "NOTFOUND")
148+
endif()
149+
endif()
150+
set(${_out} "${_val}" PARENT_SCOPE)
151+
endfunction()
152+
58153
function(rocm_find_program_version PROGRAM)
59154
set(options QUIET REQUIRED)
60155
set(oneValueArgs GREATER GREATER_EQUAL LESS LESS_EQUAL EQUAL OUTPUT_VARIABLE)

test/libsimpletest/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22

33
rocm_test_link_libraries(simple)
44
rocm_add_test_executable(simple-test ../test.cpp)
5+
set_tests_properties(simple-test PROPERTIES LABELS "smoke")
56
rocm_test_headers(HEADERS ../include/simple.h)

test/pass/rocm-defer.cmake

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# ######################################################################################################################
2+
# Copyright (C) 2026 Advanced Micro Devices, Inc.
3+
# ######################################################################################################################
4+
5+
# The project defers a call that fails configuration if rocm_defer runs it in
6+
# the wrong directory scope, so a clean configure is the assertion.
7+
configure_dir(${TEST_DIR}/rocmdefer)

test/pass/simple-test-package.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,8 @@ test_expect_eq(${NTEST_PACKAGE} 1)
99
test_exec(COMMAND ${CMAKE_COMMAND} -E tar t ${TEST_PACKAGE})
1010
test_exec(COMMAND ${CMAKE_COMMAND} -E tar x ${TEST_PACKAGE} WORKING_DIRECTORY ${PREFIX})
1111
test_expect_file(${PREFIX}/libexec/installed-tests/simple/CTestTestfile.cmake)
12+
13+
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.19.0")
14+
file(READ ${PREFIX}/libexec/installed-tests/simple/CTestTestfile.cmake CTEST_FILE)
15+
test_expect_matches("${CTEST_FILE}" "simple-test PROPERTIES.*LABELS .smoke.")
16+
endif()

test/rocmdefer/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
################################################################################
2+
# Copyright (C) 2026 Advanced Micro Devices, Inc.
3+
################################################################################
4+
5+
cmake_minimum_required(VERSION 3.5...3.31.0)
6+
project(rocmdefer NONE)
7+
8+
find_package(ROCmCMakeBuildTools)
9+
10+
include(ROCMUtilities)
11+
12+
add_subdirectory(sub)

test/rocmdefer/sub/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# On cmake 3.19+ rocm_defer must run the call in the scope that scheduled it,
2+
# so the deferred call should see this subdirectory as its current source dir.
3+
function(rocm_defer_check_scope)
4+
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.19.0" AND NOT CMAKE_CURRENT_SOURCE_DIR MATCHES "/sub$")
5+
message(FATAL_ERROR "rocm_defer ran in '${CMAKE_CURRENT_SOURCE_DIR}', expected the sub directory")
6+
endif()
7+
endfunction()
8+
9+
rocm_defer(rocm_defer_check_scope)

0 commit comments

Comments
 (0)