Index: llvm/cmake/modules/AddLLVM.cmake =================================================================== --- llvm/cmake/modules/AddLLVM.cmake +++ llvm/cmake/modules/AddLLVM.cmake @@ -1113,6 +1113,8 @@ # common variables that any Lit instance is likely to need, and custom # variables can be passed in. function(configure_lit_site_cfg input output) + cmake_parse_arguments(ARG "ALL" "" "OUTPUT_MAPPING" ${ARGN}) + foreach(c ${LLVM_TARGETS_TO_BUILD}) set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") endforeach(c) @@ -1180,7 +1182,10 @@ configure_file(${input} ${output} @ONLY) get_filename_component(INPUT_DIR ${input} DIRECTORY) if (EXISTS "${INPUT_DIR}/lit.cfg") - set(PYTHON_STATEMENT "map_config('${INPUT_DIR}/lit.cfg', '${output}')") + if ("${ARG_OUTPUT_MAPPING}" STREQUAL "") + set(ARG_OUTPUT_MAPPING "${output}") + endif() + set(PYTHON_STATEMENT "map_config('${INPUT_DIR}/lit.cfg', '${ARG_OUTPUT_MAPPING}')") get_property(LLVM_LIT_CONFIG_MAP GLOBAL PROPERTY LLVM_LIT_CONFIG_MAP) set(LLVM_LIT_CONFIG_MAP "${LLVM_LIT_CONFIG_MAP}\n${PYTHON_STATEMENT}") set_property(GLOBAL PROPERTY LLVM_LIT_CONFIG_MAP ${LLVM_LIT_CONFIG_MAP}) Index: llvm/utils/lit/CMakeLists.txt =================================================================== --- llvm/utils/lit/CMakeLists.txt +++ llvm/utils/lit/CMakeLists.txt @@ -1,7 +1,12 @@ # The configured file is not placed in the correct location # until the tests are run as we need to copy it into # a copy of the tests folder -configure_lit_site_cfg("tests/lit.site.cfg.in" "lit.site.cfg") +configure_lit_site_cfg( + "${CMAKE_CURRENT_SOURCE_DIR}/tests/lit.site.cfg.in" + "${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg" + OUTPUT_MAPPING + "${CMAKE_CURRENT_BINARY_DIR}/tests/lit.site.cfg" + ) # Lit's test suite creates output files next to the sources which makes the # source tree dirty. This is undesirable because we do out of source builds. Index: llvm/utils/lit/lit/util.py =================================================================== --- llvm/utils/lit/lit/util.py +++ llvm/utils/lit/lit/util.py @@ -9,6 +9,12 @@ import sys import threading +def norm_path(path): + path = os.path.realpath(path) + path = os.path.normpath(path) + path = os.path.normcase(path) + return path + def is_string(value): try: # Python 2 and Python 3 are different here. Index: llvm/utils/lit/tests/Inputs/config-map-discovery/driver.py =================================================================== --- /dev/null +++ llvm/utils/lit/tests/Inputs/config-map-discovery/driver.py @@ -0,0 +1,14 @@ +import lit.util +import os +import sys + +main_config = sys.argv[1] + +config_map = {lit.util.norm_path(main_config) : sys.argv[2]} +builtin_parameters = {'config_map' : config_map} + +if __name__=='__main__': + from lit.main import main + main_config_dir = os.path.dirname(main_config) + sys.argv = [sys.argv[0]] + sys.argv[3:] + [main_config_dir] + main(builtin_parameters) Index: llvm/utils/lit/tests/Inputs/config-map-discovery/lit.alt.cfg =================================================================== --- /dev/null +++ llvm/utils/lit/tests/Inputs/config-map-discovery/lit.alt.cfg @@ -0,0 +1,9 @@ +import lit.formats +import lit.util +config.name = 'config-map' +config.suffixes = ['.txt'] +config.test_format = lit.formats.ShTest() + +import os +config.test_exec_root = lit.util.norm_path(os.path.dirname(__file__)) +config.test_source_root = os.path.join(config.test_exec_root, "tests") Index: llvm/utils/lit/tests/Inputs/config-map-discovery/main-config/lit.cfg =================================================================== --- /dev/null +++ llvm/utils/lit/tests/Inputs/config-map-discovery/main-config/lit.cfg @@ -0,0 +1 @@ +print("ERROR: lit.cfg invoked!") \ No newline at end of file Index: llvm/utils/lit/tests/discovery.py =================================================================== --- llvm/utils/lit/tests/discovery.py +++ llvm/utils/lit/tests/discovery.py @@ -25,6 +25,26 @@ # CHECK-BASIC-OUT: top-level-suite :: test-one # CHECK-BASIC-OUT: top-level-suite :: test-two +# Check discovery when providing the special builtin 'config_map' +# RUN: %{python} %{inputs}/config-map-discovery/driver.py \ +# RUN: %{inputs}/config-map-discovery/main-config/lit.cfg \ +# RUN: %{inputs}/config-map-discovery/lit.alt.cfg \ +# RUN: --single-process --debug --show-tests --show-suites > %t.out 2> %t.err +# RUN: FileCheck --check-prefix=CHECK-CONFIG-MAP-OUT < %t.out %s +# RUN: FileCheck --check-prefix=CHECK-CONFIG-MAP-ERR < %t.err %s + +# CHECK-CONFIG-MAP-OUT: -- Test Suites -- +# CHECK-CONFIG-MAP-OUT: config-map - 2 tests +# CHECK-CONFIG-MAP-OUT: Source Root: {{.*[/\\]config-map-discovery[/\\]tests}} +# CHECK-CONFIG-MAP-OUT: Exec Root : {{.*[/\\]tests[/\\]inputs[/\\]config-map-discovery}} +# CHECK-CONFIG-MAP-OUT: -- Available Tests -- +# CHECK-CONFIG-MAP-OUT: config-map :: test1.txt +# CHECK-CONFIG-MAP-OUT: config-map :: test2.txt + +# CHECK-CONFIG-MAP-ERR: loading suite config '{{.*}}lit.alt.cfg' +# CHECK-CONFIG-MAP-ERR: loaded config '{{.*}}lit.alt.cfg' +# CHECK-CONFIG-MAP-ERR: resolved input '{{.*config-map-discovery[/\\]main-config}}' to 'config-map'::() + # Check discovery when exact test names are given. #