From eaa00d4dfa5ea7e611fc447d986bb10c41c7b0e1 Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 9 Nov 2023 11:55:49 -0500 Subject: Tests: Add case to verify that 'make test' does not 'make all' Place it in a new `RunCMake.BuiltinTargets` umbrella test meant to cover behavior of targets builtin to CMake. --- Tests/RunCMake/BuiltinTargets/CMakeLists.txt | 3 +++ Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake | 17 +++++++++++++++++ .../TestDependsAll-Default-build-check.cmake | 1 + .../BuiltinTargets/TestDependsAll-Default.cmake | 1 + .../BuiltinTargets/TestDependsAll-No-build-check.cmake | 3 +++ .../RunCMake/BuiltinTargets/TestDependsAll-common.cmake | 3 +++ Tests/RunCMake/CMakeLists.txt | 1 + 7 files changed, 29 insertions(+) create mode 100644 Tests/RunCMake/BuiltinTargets/CMakeLists.txt create mode 100644 Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/BuiltinTargets/TestDependsAll-Default-build-check.cmake create mode 100644 Tests/RunCMake/BuiltinTargets/TestDependsAll-Default.cmake create mode 100644 Tests/RunCMake/BuiltinTargets/TestDependsAll-No-build-check.cmake create mode 100644 Tests/RunCMake/BuiltinTargets/TestDependsAll-common.cmake diff --git a/Tests/RunCMake/BuiltinTargets/CMakeLists.txt b/Tests/RunCMake/BuiltinTargets/CMakeLists.txt new file mode 100644 index 0000000..6a9ce76 --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.28) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake b/Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake new file mode 100644 index 0000000..9c58bae --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake @@ -0,0 +1,17 @@ +include(RunCMake) + +if(RunCMake_GENERATOR MATCHES "Make|Ninja") + set(test_target "test") +else() + set(test_target "RUN_TESTS") +endif() + +function(run_BuiltinTarget case target) + # Use a single build tree for a few tests without cleaning. + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${case}-build) + run_cmake(${case}) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(${case}-build ${CMAKE_COMMAND} --build . --config Debug --target ${${target}_target}) +endfunction() + +run_BuiltinTarget(TestDependsAll-Default test) diff --git a/Tests/RunCMake/BuiltinTargets/TestDependsAll-Default-build-check.cmake b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Default-build-check.cmake new file mode 100644 index 0000000..5ef321a --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Default-build-check.cmake @@ -0,0 +1 @@ +include(${CMAKE_CURRENT_LIST_DIR}/TestDependsAll-No-build-check.cmake) diff --git a/Tests/RunCMake/BuiltinTargets/TestDependsAll-Default.cmake b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Default.cmake new file mode 100644 index 0000000..6abd56c --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Default.cmake @@ -0,0 +1 @@ +include(TestDependsAll-common.cmake) diff --git a/Tests/RunCMake/BuiltinTargets/TestDependsAll-No-build-check.cmake b/Tests/RunCMake/BuiltinTargets/TestDependsAll-No-build-check.cmake new file mode 100644 index 0000000..f42244e --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/TestDependsAll-No-build-check.cmake @@ -0,0 +1,3 @@ +if(EXISTS ${RunCMake_TEST_BINARY_DIR}/custom-output.txt) + set(RunCMake_TEST_FAILED "Building 'test' target incorrectly built 'all' target.") +endif() diff --git a/Tests/RunCMake/BuiltinTargets/TestDependsAll-common.cmake b/Tests/RunCMake/BuiltinTargets/TestDependsAll-common.cmake new file mode 100644 index 0000000..bbe7c75 --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/TestDependsAll-common.cmake @@ -0,0 +1,3 @@ +enable_testing() +add_custom_target(custom ALL COMMAND ${CMAKE_COMMAND} -E touch custom-output.txt) +add_test(NAME test COMMAND ${CMAKE_COMMAND} -E echo) diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 9902e0a..fc2ef0d 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -322,6 +322,7 @@ add_RunCMake_test(BuildDepends -DCMAKE_C_LINK_DEPENDS_USE_COMPILER=${CMAKE_C_LINK_DEPENDS_USE_COMPILER} -DCMake_TEST_BuildDepends_GNU_AS=${CMake_TEST_BuildDepends_GNU_AS} ) +add_RunCMake_test(BuiltinTargets) if(UNIX AND "${CMAKE_GENERATOR}" MATCHES "Unix Makefiles|Ninja") add_RunCMake_test(Byproducts) endif() -- cgit v0.12 From 5e0c1777a3153fd9b3c1f98e1a584a4525da6141 Mon Sep 17 00:00:00 2001 From: William Sciaroni Date: Wed, 8 Nov 2023 10:05:22 -0600 Subject: Optionally make `test` target depend on `all` Fixes: #8774 --- Auxiliary/vim/syntax/cmake.vim | 1 + Help/manual/cmake-variables.7.rst | 1 + Help/release/dev/make-test-depend-on-all.rst | 6 ++++++ Help/variable/CMAKE_SKIP_INSTALL_ALL_DEPENDENCY.rst | 2 ++ Help/variable/CMAKE_SKIP_TEST_ALL_DEPENDENCY.rst | 19 +++++++++++++++++++ Source/cmGlobalGenerator.cxx | 8 ++++++++ Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake | 2 ++ Tests/RunCMake/BuiltinTargets/TestDependsAll-No.cmake | 2 ++ .../TestDependsAll-Yes-build-check.cmake | 3 +++ .../RunCMake/BuiltinTargets/TestDependsAll-Yes.cmake | 2 ++ 10 files changed, 46 insertions(+) create mode 100644 Help/release/dev/make-test-depend-on-all.rst create mode 100644 Help/variable/CMAKE_SKIP_TEST_ALL_DEPENDENCY.rst create mode 100644 Tests/RunCMake/BuiltinTargets/TestDependsAll-No.cmake create mode 100644 Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes-build-check.cmake create mode 100644 Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes.cmake diff --git a/Auxiliary/vim/syntax/cmake.vim b/Auxiliary/vim/syntax/cmake.vim index 4bbdc65..a13dfc9 100644 --- a/Auxiliary/vim/syntax/cmake.vim +++ b/Auxiliary/vim/syntax/cmake.vim @@ -1656,6 +1656,7 @@ syn keyword cmakeVariable contained \ CMAKE_SKIP_INSTALL_RPATH \ CMAKE_SKIP_INSTALL_RULES \ CMAKE_SKIP_RPATH + \ CMAKE_SKIP_TEST_ALL_DEPENDENCY \ CMAKE_SOURCE_DIR \ CMAKE_STAGING_PREFIX \ CMAKE_STATIC_LIBRARY_PREFIX diff --git a/Help/manual/cmake-variables.7.rst b/Help/manual/cmake-variables.7.rst index bf6fc0a..4ce3b2f 100644 --- a/Help/manual/cmake-variables.7.rst +++ b/Help/manual/cmake-variables.7.rst @@ -255,6 +255,7 @@ Variables that Change Behavior /variable/CMAKE_PROJECT_TOP_LEVEL_INCLUDES /variable/CMAKE_REQUIRE_FIND_PACKAGE_PackageName /variable/CMAKE_SKIP_INSTALL_ALL_DEPENDENCY + /variable/CMAKE_SKIP_TEST_ALL_DEPENDENCY /variable/CMAKE_STAGING_PREFIX /variable/CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS /variable/CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE diff --git a/Help/release/dev/make-test-depend-on-all.rst b/Help/release/dev/make-test-depend-on-all.rst new file mode 100644 index 0000000..ef43faf --- /dev/null +++ b/Help/release/dev/make-test-depend-on-all.rst @@ -0,0 +1,6 @@ +make-test-depend-on-all +----------------------- + +* The :variable:`CMAKE_SKIP_TEST_ALL_DEPENDENCY` variable was added + to control whether the ``test`` (or ``RUN_TESTS``) buildsystem + target depends on the ``all`` (or ``ALL_BUILD``) target. diff --git a/Help/variable/CMAKE_SKIP_INSTALL_ALL_DEPENDENCY.rst b/Help/variable/CMAKE_SKIP_INSTALL_ALL_DEPENDENCY.rst index e88db36..69c762b 100644 --- a/Help/variable/CMAKE_SKIP_INSTALL_ALL_DEPENDENCY.rst +++ b/Help/variable/CMAKE_SKIP_INSTALL_ALL_DEPENDENCY.rst @@ -9,3 +9,5 @@ built, first the ``all`` target is built, then the installation starts. If ``CMAKE_SKIP_INSTALL_ALL_DEPENDENCY`` is set to ``TRUE``, this dependency is not created, so the installation process will start immediately, independent from whether the project has been completely built or not. + +See also :variable:`CMAKE_SKIP_TEST_ALL_DEPENDENCY`. diff --git a/Help/variable/CMAKE_SKIP_TEST_ALL_DEPENDENCY.rst b/Help/variable/CMAKE_SKIP_TEST_ALL_DEPENDENCY.rst new file mode 100644 index 0000000..bae8e99 --- /dev/null +++ b/Help/variable/CMAKE_SKIP_TEST_ALL_DEPENDENCY.rst @@ -0,0 +1,19 @@ +CMAKE_SKIP_TEST_ALL_DEPENDENCY +------------------------------ + +.. versionadded:: 3.29 + +Control whether the ``test`` target depends on the ``all`` target. + +If this variable is not defined, or is set to ``TRUE``, then the +``test`` (or ``RUN_TESTS``) target does not depend on the +``all`` (or ``ALL_BUILD``) target. When the ``test`` target is built, +e.g., via ``make test``, the test process will start immediately, +regardless of whether the project has been completely built or not. + +If ``CMAKE_SKIP_TEST_ALL_DEPENDENCY`` is explicitly set to ``FALSE``, +then the ``test`` target will depend on the ``all`` target. When the +``test`` target is built, e.g., via ``make test``, the ``all`` target +will be built first, and then the tests will run. + +See also :variable:`CMAKE_SKIP_INSTALL_ALL_DEPENDENCY`. diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index ef0f40f..3f9bcd5 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -2865,6 +2865,14 @@ void cmGlobalGenerator::AddGlobalTarget_Test( gti.Name = this->GetTestTargetName(); gti.Message = "Running tests..."; gti.UsesTerminal = true; + // Unlike the 'install' target, the 'test' target does not depend on 'all' + // by default. Enable it only if CMAKE_SKIP_TEST_ALL_DEPENDENCY is + // explicitly set to OFF. + if (cmValue noall = mf->GetDefinition("CMAKE_SKIP_TEST_ALL_DEPENDENCY")) { + if (cmIsOff(noall)) { + gti.Depends.emplace_back(this->GetAllTargetName()); + } + } cmCustomCommandLine singleLine; singleLine.push_back(cmSystemTools::GetCTestCommand()); singleLine.push_back("--force-new-ctest-process"); diff --git a/Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake b/Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake index 9c58bae..6a74f57 100644 --- a/Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake +++ b/Tests/RunCMake/BuiltinTargets/RunCMakeTest.cmake @@ -15,3 +15,5 @@ function(run_BuiltinTarget case target) endfunction() run_BuiltinTarget(TestDependsAll-Default test) +run_BuiltinTarget(TestDependsAll-No test) +run_BuiltinTarget(TestDependsAll-Yes test) diff --git a/Tests/RunCMake/BuiltinTargets/TestDependsAll-No.cmake b/Tests/RunCMake/BuiltinTargets/TestDependsAll-No.cmake new file mode 100644 index 0000000..50ec3b9 --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/TestDependsAll-No.cmake @@ -0,0 +1,2 @@ +include(TestDependsAll-common.cmake) +set(CMAKE_SKIP_TEST_ALL_DEPENDENCY ON) diff --git a/Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes-build-check.cmake b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes-build-check.cmake new file mode 100644 index 0000000..ed175d4 --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes-build-check.cmake @@ -0,0 +1,3 @@ +if(NOT EXISTS ${RunCMake_TEST_BINARY_DIR}/custom-output.txt) + set(RunCMake_TEST_FAILED "Building 'test' target did not build 'all' target:\n ${RunCMake_TEST_BINARY_DIR}/custom-output.txt") +endif() diff --git a/Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes.cmake b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes.cmake new file mode 100644 index 0000000..c35c98d --- /dev/null +++ b/Tests/RunCMake/BuiltinTargets/TestDependsAll-Yes.cmake @@ -0,0 +1,2 @@ +include(TestDependsAll-common.cmake) +set(CMAKE_SKIP_TEST_ALL_DEPENDENCY OFF) -- cgit v0.12