diff --git a/clang-tools-extra/CMakeLists.txt b/clang-tools-extra/CMakeLists.txt --- a/clang-tools-extra/CMakeLists.txt +++ b/clang-tools-extra/CMakeLists.txt @@ -4,6 +4,15 @@ option(CLANG_TIDY_ENABLE_STATIC_ANALYZER "Include static analyzer checks in clang-tidy" ON) +if(CLANG_INCLUDE_TESTS) + umbrella_lit_testsuite_begin(check-clang-tools) + + option(CLANG_TOOLS_TEST_USE_VG "Run Clang tools' tests under Valgrind" OFF) + if(CLANG_TOOLS_TEST_USE_VG) + set_property(GLOBAL APPEND PROPERTY LLVM_CLANG_TOOLS_LIT_EXTRA_ARGS "--vg") + endif() +endif() + add_subdirectory(clang-apply-replacements) add_subdirectory(clang-reorder-fields) add_subdirectory(modularize) @@ -19,12 +28,6 @@ add_subdirectory(pseudo) add_subdirectory(tool-template) -# Add the common testsuite after all the tools. -if(CLANG_INCLUDE_TESTS) -add_subdirectory(test) -add_subdirectory(unittests) -endif() - option(CLANG_TOOLS_EXTRA_INCLUDE_DOCS "Generate build targets for the Clang Extra Tools docs." ${LLVM_INCLUDE_DOCS}) if( CLANG_TOOLS_EXTRA_INCLUDE_DOCS ) @@ -37,3 +40,10 @@ if (CLANG_ENABLE_CLANGD) add_subdirectory(clangd) endif() + +# Add the common testsuite after all the tools. +if(CLANG_INCLUDE_TESTS) + add_subdirectory(test) + add_subdirectory(unittests) + umbrella_lit_testsuite_end(check-clang-tools) +endif() diff --git a/clang-tools-extra/test/CMakeLists.txt b/clang-tools-extra/test/CMakeLists.txt --- a/clang-tools-extra/test/CMakeLists.txt +++ b/clang-tools-extra/test/CMakeLists.txt @@ -27,11 +27,6 @@ ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.cfg.py ) -option(CLANG_TOOLS_TEST_USE_VG "Run Clang tools' tests under Valgrind" OFF) -if(CLANG_TOOLS_TEST_USE_VG) - set(CLANG_TOOLS_TEST_EXTRA_ARGS ${CLANG_TEST_EXTRA_ARGS} "--vg") -endif() - set(CLANG_TOOLS_TEST_DEPS # For the clang-apply-replacements test that uses clang-rename. clang-rename @@ -101,14 +96,6 @@ endif() endif() -add_lit_testsuite(check-clang-tools "Running the Clang extra tools' regression tests" - ${CMAKE_CURRENT_BINARY_DIR} - DEPENDS ${CLANG_TOOLS_TEST_DEPS} - ARGS ${CLANG_TOOLS_TEST_EXTRA_ARGS} - ) - -set_target_properties(check-clang-tools PROPERTIES FOLDER "Clang extra tools' tests") - add_lit_testsuites(CLANG-EXTRA ${CMAKE_CURRENT_SOURCE_DIR} DEPENDS ${CLANG_TOOLS_TEST_DEPS} ) diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt --- a/clang/CMakeLists.txt +++ b/clang/CMakeLists.txt @@ -191,7 +191,9 @@ else() set(LLVM_INCLUDE_TESTS OFF) endif() - endif() + + umbrella_lit_testsuite_begin(check-all) + endif() # LLVM_INCLUDE_TESTS set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}") else() @@ -585,21 +587,7 @@ add_subdirectory(bindings/python/tests) if(CLANG_BUILT_STANDALONE) - # Add a global check rule now that all subdirectories have been traversed - # and we know the total set of lit testsuites. - get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) - get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS) - get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS) - get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) - get_property(LLVM_ADDITIONAL_TEST_TARGETS - GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS) - add_lit_target(check-all - "Running all regression tests" - ${LLVM_LIT_TESTSUITES} - PARAMS ${LLVM_LIT_PARAMS} - DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS} - ARGS ${LLVM_LIT_EXTRA_ARGS} - ) + umbrella_lit_testsuite_end(check-all) endif() add_subdirectory(utils/perf-training) endif() diff --git a/clang/bindings/python/tests/CMakeLists.txt b/clang/bindings/python/tests/CMakeLists.txt --- a/clang/bindings/python/tests/CMakeLists.txt +++ b/clang/bindings/python/tests/CMakeLists.txt @@ -46,5 +46,5 @@ if(RUN_PYTHON_TESTS) set_property(GLOBAL APPEND PROPERTY - LLVM_ADDITIONAL_TEST_TARGETS check-clang-python) + LLVM_ALL_ADDITIONAL_TEST_TARGETS check-clang-python) endif() diff --git a/clang/runtime/CMakeLists.txt b/clang/runtime/CMakeLists.txt --- a/clang/runtime/CMakeLists.txt +++ b/clang/runtime/CMakeLists.txt @@ -164,7 +164,7 @@ DEPENDS compiler-rt-build ${COMPILER_RT_TEST_DEPENDENCIES} WORKING_DIRECTORY ${BINARY_DIR} VERBATIM USES_TERMINAL) - set_property(GLOBAL APPEND PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS compiler-rt-test-depends) - set_property(GLOBAL APPEND PROPERTY LLVM_ADDITIONAL_TEST_TARGETS check-compiler-rt) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_ADDITIONAL_TEST_DEPENDS compiler-rt-test-depends) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_ADDITIONAL_TEST_TARGETS check-compiler-rt) endif() endif() diff --git a/compiler-rt/test/CMakeLists.txt b/compiler-rt/test/CMakeLists.txt --- a/compiler-rt/test/CMakeLists.txt +++ b/compiler-rt/test/CMakeLists.txt @@ -44,6 +44,10 @@ endif() endif() +if(COMPILER_RT_STANDALONE_BUILD) + umbrella_lit_testsuite_begin(check-compiler-rt) +endif() + function(compiler_rt_test_runtime runtime) string(TOUPPER ${runtime} runtime_uppercase) if(COMPILER_RT_HAS_${runtime_uppercase}) @@ -103,15 +107,11 @@ if(COMPILER_RT_STANDALONE_BUILD) # Now that we've traversed all the directories and know all the lit testsuites, # introduce a rule to run to run all of them. - get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) - get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS) - add_lit_target(check-compiler-rt - "Running all regression tests" - ${LLVM_LIT_TESTSUITES} - DEPENDS ${LLVM_LIT_DEPENDS}) + add_custom_target(compiler-rt-test-depends DEPENDS ${LLVM_COMPILER_RT_LIT_DEPENDS}) + umbrella_lit_testsuite_end(check-compiler-rt) + if(NOT TARGET check-all) add_custom_target(check-all) endif() - add_custom_target(compiler-rt-test-depends DEPENDS ${LLVM_LIT_DEPENDS}) add_dependencies(check-all check-compiler-rt) endif() diff --git a/llvm/CMakeLists.txt b/llvm/CMakeLists.txt --- a/llvm/CMakeLists.txt +++ b/llvm/CMakeLists.txt @@ -1063,6 +1063,10 @@ llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2") endif() +if(LLVM_INCLUDE_TESTS) + umbrella_lit_testsuite_begin(check-all) +endif() + # Put this before tblgen. Else we have a circular dependence. add_subdirectory(lib/Demangle) add_subdirectory(lib/Support) @@ -1134,25 +1138,12 @@ add_subdirectory(utils/KillTheDoctor) endif() - # Add a global check rule now that all subdirectories have been traversed - # and we know the total set of lit testsuites. - get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) - get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS) - get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS) - get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) - get_property(LLVM_ADDITIONAL_TEST_TARGETS - GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS) - get_property(LLVM_ADDITIONAL_TEST_DEPENDS - GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS) - add_lit_target(check-all - "Running all regression tests" - ${LLVM_LIT_TESTSUITES} - PARAMS ${LLVM_LIT_PARAMS} - DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS} - ARGS ${LLVM_LIT_EXTRA_ARGS} - ) + umbrella_lit_testsuite_end(check-all) + get_property(LLVM_ALL_LIT_DEPENDS GLOBAL PROPERTY LLVM_ALL_LIT_DEPENDS) + get_property(LLVM_ALL_ADDITIONAL_TEST_DEPENDS + GLOBAL PROPERTY LLVM_ALL_ADDITIONAL_TEST_DEPENDS) add_custom_target(test-depends - DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_DEPENDS}) + DEPENDS ${LLVM_ALL_LIT_DEPENDS} ${LLVM_ALL_ADDITIONAL_TEST_DEPENDS}) set_target_properties(test-depends PROPERTIES FOLDER "Tests") endif() diff --git a/llvm/cmake/modules/AddLLVM.cmake b/llvm/cmake/modules/AddLLVM.cmake --- a/llvm/cmake/modules/AddLLVM.cmake +++ b/llvm/cmake/modules/AddLLVM.cmake @@ -1824,17 +1824,62 @@ set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) endfunction() +# Convert a target name like check-clang to a variable name like CLANG. +function(umbrella_lit_testsuite_var target outvar) + if (NOT target MATCHES "^check-") + message(FATAL_ERROR "umbrella lit suites must be check-*, not '${target}'") + endif() + string(SUBSTRING "${target}" 6 -1 var) + string(REPLACE "-" "_" var ${var}) + string(TOUPPER "${var}" var) + set(${outvar} "${var}" PARENT_SCOPE) +endfunction() + +# Start recording all lit test suites for a combined 'check-foo' target. +# The recording continues until umbrella_lit_testsuite_end() creates the target. +function(umbrella_lit_testsuite_begin target) + umbrella_lit_testsuite_var(${target} name) + set_property(GLOBAL APPEND PROPERTY LLVM_LIT_UMBRELLAS ${name}) +endfunction() + +# Create a combined 'check-foo' target for a set of related test suites. +# It runs all suites added since the matching umbrella_lit_testsuite_end() call. +# Tests marked EXCLUDE_FROM_CHECK_ALL are not gathered. +function(umbrella_lit_testsuite_end target) + umbrella_lit_testsuite_var(${target} name) + + get_property(testsuites GLOBAL PROPERTY LLVM_${name}_LIT_TESTSUITES) + get_property(params GLOBAL PROPERTY LLVM_${name}_LIT_PARAMS) + get_property(depends GLOBAL PROPERTY LLVM_${name}_LIT_DEPENDS) + get_property(extra_args GLOBAL PROPERTY LLVM_${name}_LIT_EXTRA_ARGS) + # Additional test targets are not gathered, but may be set externally. + get_property(additional_test_targets + GLOBAL PROPERTY LLVM_${name}_ADDITIONAL_TEST_TARGETS) + + string(TOLOWER ${name} name) + add_lit_target(${target} + "Running ${name} regression tests" + ${testsuites} + PARAMS ${params} + DEPENDS ${depends} ${additional_test_targets} + ARGS ${extra_args} + ) +endfunction() + # A function to add a set of lit test suites to be driven through 'check-*' targets. function(add_lit_testsuite target comment) cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "" "PARAMS;DEPENDS;ARGS" ${ARGN}) # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all. if(NOT ARG_EXCLUDE_FROM_CHECK_ALL) - # Register the testsuites, params and depends for the global check rule. - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS}) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS}) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS}) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS}) + get_property(gather_names GLOBAL PROPERTY LLVM_LIT_UMBRELLAS) + foreach(name ${gather_names}) + # Register the testsuites, params and depends for the umbrella check rule. + set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS}) + set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_PARAMS ${ARG_PARAMS}) + set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_DEPENDS ${ARG_DEPENDS}) + set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_EXTRA_ARGS ${ARG_ARGS}) + endforeach() endif() # Produce a specific suffixed check rule. diff --git a/llvm/runtimes/CMakeLists.txt b/llvm/runtimes/CMakeLists.txt --- a/llvm/runtimes/CMakeLists.txt +++ b/llvm/runtimes/CMakeLists.txt @@ -222,9 +222,9 @@ if(LLVM_INCLUDE_TESTS) include(${LLVM_BINARY_DIR}/runtimes/Tests.cmake OPTIONAL) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LLVM_BINARY_DIR}/runtimes/Tests.cmake) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${SUB_LIT_TESTSUITES}) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${SUB_LIT_PARAMS}) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${SUB_LIT_EXTRA_ARGS}) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_TESTSUITES ${SUB_LIT_TESTSUITES}) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_PARAMS ${SUB_LIT_PARAMS}) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_EXTRA_ARGS ${SUB_LIT_EXTRA_ARGS}) list(APPEND test_targets runtimes-test-depends check-runtimes) endif() @@ -304,9 +304,9 @@ if(LLVM_INCLUDE_TESTS) include(${LLVM_BINARY_DIR}/runtimes/${name}/Tests.cmake OPTIONAL) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${LLVM_BINARY_DIR}/runtimes/${name}/Tests.cmake) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${SUB_LIT_TESTSUITES}) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${SUB_LIT_PARAMS}) - set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${SUB_LIT_EXTRA_ARGS}) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_TESTSUITES ${SUB_LIT_TESTSUITES}) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_PARAMS ${SUB_LIT_PARAMS}) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_LIT_EXTRA_ARGS ${SUB_LIT_EXTRA_ARGS}) set(runtimes-test-depends-${name} runtimes-test-depends) set(check-runtimes-${name} check-runtimes) list(APPEND ${name}_test_targets runtimes-test-depends-${name} check-runtimes-${name}) @@ -479,7 +479,7 @@ endif() if(LLVM_INCLUDE_TESTS) - set_property(GLOBAL APPEND PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS runtimes-test-depends) + set_property(GLOBAL APPEND PROPERTY LLVM_ALL_ADDITIONAL_TEST_DEPENDS runtimes-test-depends) set(RUNTIMES_TEST_DEPENDS FileCheck diff --git a/runtimes/CMakeLists.txt b/runtimes/CMakeLists.txt --- a/runtimes/CMakeLists.txt +++ b/runtimes/CMakeLists.txt @@ -176,6 +176,8 @@ set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") endif() set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit") + + umbrella_lit_testsuite_begin(check-runtimes) endif() # llvm-libgcc incorporates both compiler-rt and libunwind as subprojects with very @@ -200,36 +202,13 @@ foreach(entry ${runtimes}) get_filename_component(projName ${entry} NAME) - # Between each sub-project we want to cache and clear the LIT properties - set_property(GLOBAL PROPERTY LLVM_LIT_TESTSUITES) - set_property(GLOBAL PROPERTY LLVM_LIT_PARAMS) - set_property(GLOBAL PROPERTY LLVM_LIT_DEPENDS) - set_property(GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) - add_subdirectory(${entry} ${projName}) - - get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) - get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS) - get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS) - get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) - - list(APPEND RUNTIMES_LIT_TESTSUITES ${LLVM_LIT_TESTSUITES}) - list(APPEND RUNTIMES_LIT_PARAMS ${LLVM_LIT_PARAMS}) - list(APPEND RUNTIMES_LIT_DEPENDS ${LLVM_LIT_DEPENDS}) - list(APPEND RUNTIMES_LIT_EXTRA_ARGS ${LLVM_LIT_EXTRA_ARGS}) endforeach() if(LLVM_INCLUDE_TESTS) # Add a global check rule now that all subdirectories have been traversed # and we know the total set of lit testsuites. - add_lit_target(check-runtimes - "Running all regression tests" - ${RUNTIMES_LIT_TESTSUITES} - PARAMS ${RUNTIMES_LIT_PARAMS} - DEPENDS ${RUNTIMES_LIT_DEPENDS} - ARGS ${RUNTIMES_LIT_EXTRA_ARGS} - ) - add_custom_target(runtimes-test-depends DEPENDS ${RUNTIMES_LIT_DEPENDS}) + umbrella_lit_testsuite_end(check-runtimes) if (NOT HAVE_LLVM_LIT) # If built by manually invoking cmake on this directory, we don't have diff --git a/runtimes/Tests.cmake.in b/runtimes/Tests.cmake.in --- a/runtimes/Tests.cmake.in +++ b/runtimes/Tests.cmake.in @@ -1,3 +1,3 @@ -set(SUB_LIT_TESTSUITES @RUNTIMES_LIT_TESTSUITES@) -set(SUB_LIT_PARAMS @RUNTIMES_LIT_PARAMS@) -set(SUB_LIT_EXTRA_ARGS @RUNTIMES_LIT_EXTRA_ARGS@) +set(SUB_LIT_TESTSUITES @LLVM_RUNTIMES_LIT_TESTSUITES@) +set(SUB_LIT_PARAMS @LLVM_RUNTIMES_LIT_PARAMS@) +set(SUB_LIT_EXTRA_ARGS @LLVM_RUNTIMES_LIT_EXTRA_ARGS@)