mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-11 08:20:18 -06:00
set_tests_properties(): Add DIRECTORY option
This commit is contained in:
@@ -14,6 +14,16 @@ Test property values may be specified using
|
||||
:manual:`generator expressions <cmake-generator-expressions(7)>`
|
||||
for tests created by the :command:`add_test(NAME)` signature.
|
||||
|
||||
.. versionadded:: 3.28
|
||||
Visibility can be set in other directory scopes using the following option:
|
||||
|
||||
``DIRECTORY <dir>``
|
||||
The test properties will be set in the ``<dir>`` directory's scope.
|
||||
CMake must already know about this directory, either by having added it
|
||||
through a call to :command:`add_subdirectory` or it being the top level
|
||||
source directory. Relative paths are treated as relative to the current
|
||||
source directory. ``<dir>`` may reference a binary directory.
|
||||
|
||||
See Also
|
||||
^^^^^^^^
|
||||
|
||||
|
||||
@@ -4,3 +4,6 @@ test-properties-directory
|
||||
* The ``TEST`` mode of the :command:`set_property` command gained a
|
||||
``DIRECTORY`` sub-option, which allows you to set properties on tests in
|
||||
other directories.
|
||||
* The :command:`set_tests_properties` command gained a ``DIRECTORY``
|
||||
sub-option, which allows you to set properties on tests in other
|
||||
directories.
|
||||
|
||||
@@ -5,9 +5,15 @@
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
|
||||
#include <cmext/string_view>
|
||||
|
||||
#include "cmArgumentParser.h"
|
||||
#include "cmExecutionStatus.h"
|
||||
#include "cmGlobalGenerator.h"
|
||||
#include "cmMakefile.h"
|
||||
#include "cmRange.h"
|
||||
#include "cmStringAlgorithms.h"
|
||||
#include "cmSystemTools.h"
|
||||
#include "cmTest.h"
|
||||
|
||||
bool cmSetTestsPropertiesCommand(std::vector<std::string> const& args,
|
||||
@@ -31,9 +37,29 @@ bool cmSetTestsPropertiesCommand(std::vector<std::string> const& args,
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<std::string> tests;
|
||||
std::string directory;
|
||||
cmArgumentParser<void> parser;
|
||||
parser.Bind("DIRECTORY"_s, directory);
|
||||
auto result = parser.Parse(cmStringRange{ args.begin(), propsIter }, &tests);
|
||||
|
||||
cmMakefile* mf = &status.GetMakefile();
|
||||
if (result.MaybeReportError(*mf)) {
|
||||
return false;
|
||||
}
|
||||
if (!directory.empty()) {
|
||||
std::string absDirectory = cmSystemTools::CollapseFullPath(
|
||||
directory, mf->GetCurrentSourceDirectory());
|
||||
mf = mf->GetGlobalGenerator()->FindMakefile(absDirectory);
|
||||
if (!mf) {
|
||||
status.SetError(cmStrCat("given non-existent DIRECTORY ", directory));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// loop over all the tests
|
||||
for (const std::string& tname : cmStringRange{ args.begin(), propsIter }) {
|
||||
if (cmTest* test = status.GetMakefile().GetTest(tname)) {
|
||||
for (const std::string& tname : tests) {
|
||||
if (cmTest* test = mf->GetTest(tname)) {
|
||||
// loop through all the props and set them
|
||||
for (auto k = propsIter + 1; k != args.end(); k += 2) {
|
||||
if (!k->empty()) {
|
||||
|
||||
@@ -1064,6 +1064,7 @@ add_RunCMake_test(CMakePresetsWorkflow
|
||||
)
|
||||
|
||||
add_RunCMake_test(VerifyHeaderSets)
|
||||
add_RunCMake_test(set_tests_properties)
|
||||
|
||||
if(${CMAKE_GENERATOR} MATCHES "Make|Ninja")
|
||||
add_RunCMake_test(TransformDepfile)
|
||||
|
||||
3
Tests/RunCMake/set_tests_properties/CMakeLists.txt
Normal file
3
Tests/RunCMake/set_tests_properties/CMakeLists.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
cmake_minimum_required(VERSION 3.27)
|
||||
project(${RunCMake_TEST} NONE)
|
||||
include(${RunCMake_TEST}.cmake)
|
||||
@@ -0,0 +1 @@
|
||||
1
|
||||
@@ -0,0 +1,13 @@
|
||||
^CMake Error at DIRECTORY-invalid\.cmake:[0-9]+ \(set_tests_properties\):
|
||||
Error after keyword "DIRECTORY":
|
||||
|
||||
missing required value
|
||||
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists\.txt:[0-9]+ \(include\)
|
||||
|
||||
|
||||
CMake Error at DIRECTORY-invalid\.cmake:[0-9]+ \(set_tests_properties\):
|
||||
set_tests_properties given non-existent DIRECTORY nonexistent
|
||||
Call Stack \(most recent call first\):
|
||||
CMakeLists\.txt:[0-9]+ \(include\)$
|
||||
@@ -0,0 +1,4 @@
|
||||
enable_testing()
|
||||
|
||||
set_tests_properties(t DIRECTORY PROPERTIES PASS_REGULAR_EXPRESSION "Top directory")
|
||||
set_tests_properties(t DIRECTORY nonexistent PROPERTIES PASS_REGULAR_EXPRESSION "Top directory")
|
||||
@@ -0,0 +1,3 @@
|
||||
add_test(NAME t COMMAND ${CMAKE_COMMAND} -E echo "Subdirectory")
|
||||
add_test(NAME t2 COMMAND ${CMAKE_COMMAND} -E echo "Subdirectory")
|
||||
add_test(NAME t3 COMMAND ${CMAKE_COMMAND} -E echo "Subdirectory")
|
||||
@@ -0,0 +1 @@
|
||||
set_tests_properties(t3 DIRECTORY ../DIRECTORY-subdir1 PROPERTIES PASS_REGULAR_EXPRESSION "Subdirectory")
|
||||
9
Tests/RunCMake/set_tests_properties/DIRECTORY.cmake
Normal file
9
Tests/RunCMake/set_tests_properties/DIRECTORY.cmake
Normal file
@@ -0,0 +1,9 @@
|
||||
enable_testing()
|
||||
|
||||
add_test(NAME t COMMAND ${CMAKE_COMMAND} -E echo "Top directory")
|
||||
add_subdirectory(DIRECTORY-subdir1)
|
||||
add_subdirectory(DIRECTORY-subdir2)
|
||||
|
||||
set_tests_properties(t PROPERTIES PASS_REGULAR_EXPRESSION "Top directory")
|
||||
set_tests_properties(t DIRECTORY DIRECTORY-subdir1 PROPERTIES PASS_REGULAR_EXPRESSION "Subdirectory")
|
||||
set_tests_properties(t2 DIRECTORY "${CMAKE_BINARY_DIR}/DIRECTORY-subdir1" PROPERTIES PASS_REGULAR_EXPRESSION "Subdirectory")
|
||||
8
Tests/RunCMake/set_tests_properties/RunCMakeTest.cmake
Normal file
8
Tests/RunCMake/set_tests_properties/RunCMakeTest.cmake
Normal file
@@ -0,0 +1,8 @@
|
||||
include(RunCMake)
|
||||
|
||||
run_cmake(DIRECTORY-invalid)
|
||||
|
||||
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/DIRECTORY-build)
|
||||
run_cmake(DIRECTORY)
|
||||
set(RunCMake_TEST_NO_CLEAN 1)
|
||||
run_cmake_command(DIRECTORY-test ${CMAKE_CTEST_COMMAND} -C Debug)
|
||||
Reference in New Issue
Block a user