Index: llvm/trunk/cmake/modules/AddLLVM.cmake =================================================================== --- llvm/trunk/cmake/modules/AddLLVM.cmake +++ llvm/trunk/cmake/modules/AddLLVM.cmake @@ -1112,7 +1112,13 @@ # variables needed for the 'lit.site.cfg' files. This function bundles the # common variables that any Lit instance is likely to need, and custom # variables can be passed in. -function(configure_lit_site_cfg input output) +function(configure_lit_site_cfg site_in site_out) + cmake_parse_arguments(ARG "" "" "MAIN_CONFIG" ${ARGN}) + + if ("${ARG_MAIN_CONFIG}" STREQUAL "") + set(ARG_MAIN_CONFIG "${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg") + endif() + foreach(c ${LLVM_TARGETS_TO_BUILD}) set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") endforeach(c) @@ -1158,7 +1164,7 @@ set(HOST_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}") set(HOST_LDFLAGS "${CMAKE_EXE_LINKER_FLAGS}") - set(LIT_SITE_CFG_IN_HEADER "## Autogenerated from ${input}\n## Do not edit!") + set(LIT_SITE_CFG_IN_HEADER "## Autogenerated from ${site_in}\n## Do not edit!") # Override config_target_triple (and the env) if(LLVM_TARGET_TRIPLE_ENV) @@ -1177,10 +1183,10 @@ "import lit.llvm\n" "lit.llvm.initialize(lit_config, config)\n") - 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}')") + configure_file(${site_in} ${site_out} @ONLY) + get_filename_component(INPUT_DIR ${site_in} DIRECTORY) + if (EXISTS "${ARG_MAIN_CONFIG}") + set(PYTHON_STATEMENT "map_config('${ARG_MAIN_CONFIG}', '${site_out}')") 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/trunk/test/CMakeLists.txt =================================================================== --- llvm/trunk/test/CMakeLists.txt +++ llvm/trunk/test/CMakeLists.txt @@ -11,12 +11,16 @@ BUILD_SHARED_LIBS) configure_lit_site_cfg( - ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.in - ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg + ${CMAKE_CURRENT_SOURCE_DIR}/lit.site.cfg.py.in + ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg.py + MAIN_CONFIG + ${CMAKE_CURRENT_SOURCE_DIR}/lit.cfg.py ) configure_lit_site_cfg( - ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.in - ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg + ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.site.cfg.py.in + ${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg.py + MAIN_CONFIG + ${CMAKE_CURRENT_SOURCE_DIR}/Unit/lit.cfg.py ) # Don't include check-llvm into check-all without LLVM_BUILD_TOOLS. @@ -148,15 +152,11 @@ add_lit_testsuite(check-llvm "Running the LLVM regression tests" ${CMAKE_CURRENT_BINARY_DIR} - PARAMS llvm_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg - llvm_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg DEPENDS ${LLVM_TEST_DEPENDS} ) set_target_properties(check-llvm PROPERTIES FOLDER "Tests") add_lit_testsuites(LLVM ${CMAKE_CURRENT_SOURCE_DIR} - PARAMS llvm_site_config=${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg - llvm_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/Unit/lit.site.cfg DEPENDS ${LLVM_TEST_DEPENDS} ) Index: llvm/trunk/test/Unit/lit.cfg =================================================================== --- llvm/trunk/test/Unit/lit.cfg +++ llvm/trunk/test/Unit/lit.cfg @@ -1,46 +0,0 @@ -# -*- Python -*- - -# Configuration file for the 'lit' test runner. - -import os -import subprocess - -import lit.formats - -# name: The name of this test suite. -config.name = 'LLVM-Unit' - -# suffixes: A list of file extensions to treat as test files. -config.suffixes = [] - -# is_early; Request to run this suite early. -config.is_early = True - -# test_source_root: The root path where tests are located. -# test_exec_root: The root path where tests should be run. -config.test_exec_root = os.path.join(config.llvm_obj_root, 'unittests') -config.test_source_root = config.test_exec_root - -# testFormat: The test format to use to interpret tests. -config.test_format = lit.formats.GoogleTest(config.llvm_build_mode, 'Tests') - -# Propagate the temp directory. Windows requires this because it uses \Windows\ -# if none of these are present. -if 'TMP' in os.environ: - config.environment['TMP'] = os.environ['TMP'] -if 'TEMP' in os.environ: - config.environment['TEMP'] = os.environ['TEMP'] - -# Propagate path to symbolizer for ASan/MSan. -for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']: - if symbolizer in os.environ: - config.environment[symbolizer] = os.environ[symbolizer] - -# Win32 seeks DLLs along %PATH%. -if sys.platform in ['win32', 'cygwin'] and os.path.isdir(config.shlibdir): - config.environment['PATH'] = os.path.pathsep.join(( - config.shlibdir, config.environment['PATH'])) - -# Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. -if sys.platform == 'win32' and 'SYSTEMDRIVE' in os.environ: - config.environment['SYSTEMDRIVE'] = os.environ['SYSTEMDRIVE'] Index: llvm/trunk/test/Unit/lit.cfg.py =================================================================== --- llvm/trunk/test/Unit/lit.cfg.py +++ llvm/trunk/test/Unit/lit.cfg.py @@ -0,0 +1,46 @@ +# -*- Python -*- + +# Configuration file for the 'lit' test runner. + +import os +import subprocess + +import lit.formats + +# name: The name of this test suite. +config.name = 'LLVM-Unit' + +# suffixes: A list of file extensions to treat as test files. +config.suffixes = [] + +# is_early; Request to run this suite early. +config.is_early = True + +# test_source_root: The root path where tests are located. +# test_exec_root: The root path where tests should be run. +config.test_exec_root = os.path.join(config.llvm_obj_root, 'unittests') +config.test_source_root = config.test_exec_root + +# testFormat: The test format to use to interpret tests. +config.test_format = lit.formats.GoogleTest(config.llvm_build_mode, 'Tests') + +# Propagate the temp directory. Windows requires this because it uses \Windows\ +# if none of these are present. +if 'TMP' in os.environ: + config.environment['TMP'] = os.environ['TMP'] +if 'TEMP' in os.environ: + config.environment['TEMP'] = os.environ['TEMP'] + +# Propagate path to symbolizer for ASan/MSan. +for symbolizer in ['ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']: + if symbolizer in os.environ: + config.environment[symbolizer] = os.environ[symbolizer] + +# Win32 seeks DLLs along %PATH%. +if sys.platform in ['win32', 'cygwin'] and os.path.isdir(config.shlibdir): + config.environment['PATH'] = os.path.pathsep.join(( + config.shlibdir, config.environment['PATH'])) + +# Win32 may use %SYSTEMDRIVE% during file system shell operations, so propogate. +if sys.platform == 'win32' and 'SYSTEMDRIVE' in os.environ: + config.environment['SYSTEMDRIVE'] = os.environ['SYSTEMDRIVE'] Index: llvm/trunk/test/Unit/lit.site.cfg.in =================================================================== --- llvm/trunk/test/Unit/lit.site.cfg.in +++ llvm/trunk/test/Unit/lit.site.cfg.in @@ -1,23 +0,0 @@ -@LIT_SITE_CFG_IN_HEADER@ - -import sys - -config.llvm_src_root = "@LLVM_SOURCE_DIR@" -config.llvm_obj_root = "@LLVM_BINARY_DIR@" -config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" -config.llvm_build_mode = "@LLVM_BUILD_MODE@" -config.enable_shared = @ENABLE_SHARED@ -config.shlibdir = "@SHLIBDIR@" - -# Support substitution of the tools_dir and build_mode with user parameters. -# This is used when we can't determine the tool dir at configuration time. -try: - config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params - config.llvm_build_mode = config.llvm_build_mode % lit_config.params -except KeyError: - e = sys.exc_info()[1] - key, = e.args - lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key)) - -# Let the main config do the real work. -lit_config.load_config(config, "@LLVM_SOURCE_DIR@/test/Unit/lit.cfg") Index: llvm/trunk/test/Unit/lit.site.cfg.py.in =================================================================== --- llvm/trunk/test/Unit/lit.site.cfg.py.in +++ llvm/trunk/test/Unit/lit.site.cfg.py.in @@ -0,0 +1,23 @@ +@LIT_SITE_CFG_IN_HEADER@ + +import sys + +config.llvm_src_root = "@LLVM_SOURCE_DIR@" +config.llvm_obj_root = "@LLVM_BINARY_DIR@" +config.llvm_tools_dir = "@LLVM_TOOLS_DIR@" +config.llvm_build_mode = "@LLVM_BUILD_MODE@" +config.enable_shared = @ENABLE_SHARED@ +config.shlibdir = "@SHLIBDIR@" + +# Support substitution of the tools_dir and build_mode with user parameters. +# This is used when we can't determine the tool dir at configuration time. +try: + config.llvm_tools_dir = config.llvm_tools_dir % lit_config.params + config.llvm_build_mode = config.llvm_build_mode % lit_config.params +except KeyError: + e = sys.exc_info()[1] + key, = e.args + lit_config.fatal("unable to find %r parameter, use '--param=%s=VALUE'" % (key,key)) + +# Let the main config do the real work. +lit_config.load_config(config, "@LLVM_SOURCE_DIR@/test/Unit/lit.cfg.py") Index: llvm/trunk/test/lit.cfg =================================================================== --- llvm/trunk/test/lit.cfg +++ llvm/trunk/test/lit.cfg @@ -1,354 +0,0 @@ -# -*- Python -*- - -# Configuration file for the 'lit' test runner. - -import os -import sys -import re -import platform -import subprocess - -import lit.util -import lit.formats -from lit.llvm import llvm_config - -# name: The name of this test suite. -config.name = 'LLVM' - -# testFormat: The test format to use to interpret tests. -config.test_format = lit.formats.ShTest(not llvm_config.use_lit_shell) - -# suffixes: A list of file extensions to treat as test files. This is overriden -# by individual lit.local.cfg files in the test subdirectories. -config.suffixes = ['.ll', '.c', '.cxx', '.test', '.txt', '.s', '.mir'] - -# excludes: A list of directories to exclude from the testsuite. The 'Inputs' -# subdirectories contain auxiliary inputs for various tests in their parent -# directories. -config.excludes = ['Inputs', 'CMakeLists.txt', 'README.txt', 'LICENSE.txt'] - -# test_source_root: The root path where tests are located. -config.test_source_root = os.path.dirname(__file__) - -# test_exec_root: The root path where tests should be run. -config.test_exec_root = os.path.join(config.llvm_obj_root, 'test') - -# Tweak the PATH to include the tools dir. -llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True) - -# Propagate some variables from the host environment. -llvm_config.with_system_environment(['HOME', 'INCLUDE', 'LIB', 'TMP', 'TEMP', 'ASAN_SYMBOLIZER_PATH', 'MSAN_SYMBOLIZER_PATH']) - - -# Set up OCAMLPATH to include newly built OCaml libraries. -top_ocaml_lib = os.path.join(config.llvm_lib_dir, 'ocaml') -llvm_ocaml_lib = os.path.join(top_ocaml_lib, 'llvm') - -llvm_config.with_system_environment('OCAMLPATH') -llvm_config.with_environment('OCAMLPATH', top_ocaml_lib, append_path=True) -llvm_config.with_environment('OCAMLPATH', llvm_ocaml_lib, append_path=True) - -llvm_config.with_system_environment('CAML_LD_LIBRARY_PATH') -llvm_config.with_environment('CAML_LD_LIBRARY_PATH', llvm_ocaml_lib, append_path=True) - -# Set up OCAMLRUNPARAM to enable backtraces in OCaml tests. -llvm_config.with_environment('OCAMLRUNPARAM', 'b') - -# Provide the path to asan runtime lib 'libclang_rt.asan_osx_dynamic.dylib' if -# available. This is darwin specific since it's currently only needed on darwin. -def get_asan_rtlib(): - if not "Address" in config.llvm_use_sanitizer or \ - not "Darwin" in config.host_os or \ - not "x86" in config.host_triple: - return "" - try: - import glob - except: - print("glob module not found, skipping get_asan_rtlib() lookup") - return "" - # The libclang_rt.asan_osx_dynamic.dylib path is obtained using the relative - # path from the host cc. - host_lib_dir = os.path.join(os.path.dirname(config.host_cc), "../lib") - asan_dylib_dir_pattern = host_lib_dir + \ - "/clang/*/lib/darwin/libclang_rt.asan_osx_dynamic.dylib" - found_dylibs = glob.glob(asan_dylib_dir_pattern) - if len(found_dylibs) != 1: - return "" - return found_dylibs[0] - -lli = 'lli' -# The target triple used by default by lli is the process target triple (some -# triple appropriate for generating code for the current process) but because -# we don't support COFF in MCJIT well enough for the tests, force ELF format on -# Windows. FIXME: the process target triple should be used here, but this is -# difficult to obtain on Windows. -if re.search(r'cygwin|mingw32|windows-gnu|windows-msvc|win32', config.host_triple): - lli += ' -mtriple='+config.host_triple+'-elf' -config.substitutions.append( ('%lli', lli ) ) - -# Similarly, have a macro to use llc with DWARF even when the host is win32. -llc_dwarf = 'llc' -if re.search(r'win32', config.target_triple): - llc_dwarf += ' -mtriple='+config.target_triple.replace('-win32', '-mingw32') -config.substitutions.append( ('%llc_dwarf', llc_dwarf) ) - -# Add site-specific substitutions. -config.substitutions.append( ('%gold', config.gold_executable) ) -config.substitutions.append( ('%go', config.go_executable) ) -config.substitutions.append( ('%llvmshlibdir', config.llvm_shlib_dir) ) -config.substitutions.append( ('%shlibext', config.llvm_shlib_ext) ) -config.substitutions.append( ('%exeext', config.llvm_exe_ext) ) -config.substitutions.append( ('%python', config.python_executable) ) -config.substitutions.append( ('%host_cc', config.host_cc) ) - -# Provide the path to asan runtime lib if available. On darwin, this lib needs -# to be loaded via DYLD_INSERT_LIBRARIES before libLTO.dylib in case the files -# to be linked contain instrumented sanitizer code. -ld64_cmd = config.ld64_executable -asan_rtlib = get_asan_rtlib() -if asan_rtlib: - ld64_cmd = "DYLD_INSERT_LIBRARIES={} {}".format(asan_rtlib, ld64_cmd) -config.substitutions.append( ('%ld64', ld64_cmd) ) - -# OCaml substitutions. -# Support tests for both native and bytecode builds. -config.substitutions.append( ('%ocamlc', - "%s ocamlc -cclib -L%s %s" % - (config.ocamlfind_executable, config.llvm_lib_dir, config.ocaml_flags)) ) -if config.have_ocamlopt: - config.substitutions.append( ('%ocamlopt', - "%s ocamlopt -cclib -L%s -cclib -Wl,-rpath,%s %s" % - (config.ocamlfind_executable, config.llvm_lib_dir, config.llvm_lib_dir, config.ocaml_flags)) ) -else: - config.substitutions.append( ('%ocamlopt', "true" ) ) - -# For each occurrence of an llvm tool name as its own word, replace it -# with the full path to the build directory holding that tool. This -# ensures that we are testing the tools just built and not some random -# tools that might happen to be in the user's PATH. Thus this list -# includes every tool placed in $(LLVM_OBJ_ROOT)/$(BuildMode)/bin -# (llvm_tools_dir in lit parlance). - -# Avoid matching RUN line fragments that are actually part of -# path names or options or whatever. -# The regex is a pre-assertion to avoid matching a preceding -# dot, hyphen, carat, or slash (.foo, -foo, etc.). Some patterns -# also have a post-assertion to not match a trailing hyphen (foo-). -NOJUNK = r"(? (suite, relative_path) @@ -99,10 +104,10 @@ # Check if there is a local configuration file. source_path = ts.getSourcePath(path_in_suite) - cfgpath = os.path.join(source_path, litConfig.local_config_name) + cfgpath = chooseConfigFileFromDir(source_path, litConfig.local_config_names) # If not, just reuse the parent config. - if not os.path.exists(cfgpath): + if not cfgpath: return parent # Otherwise, copy the current config and load the local configuration Index: llvm/trunk/utils/lit/tests/Inputs/py-config-discovery/lit.site.cfg.py =================================================================== --- llvm/trunk/utils/lit/tests/Inputs/py-config-discovery/lit.site.cfg.py +++ llvm/trunk/utils/lit/tests/Inputs/py-config-discovery/lit.site.cfg.py @@ -0,0 +1,5 @@ +# Load the discovery suite, but with a separate exec root. +import os +config.test_exec_root = os.path.dirname(__file__) +config.test_source_root = os.path.join(os.path.dirname(config.test_exec_root), "discovery") +lit_config.load_config(config, os.path.join(config.test_source_root, "lit.cfg")) Index: llvm/trunk/utils/lit/tests/discovery.py =================================================================== --- llvm/trunk/utils/lit/tests/discovery.py +++ llvm/trunk/utils/lit/tests/discovery.py @@ -38,6 +38,34 @@ # CHECK-EXACT-TEST: sub-suite :: test-one # CHECK-EXACT-TEST: top-level-suite :: subdir/test-three +# Check discovery when config files end in .py +# RUN: %{lit} %{inputs}/py-config-discovery \ +# RUN: -j 1 --debug --show-tests --show-suites \ +# RUN: -v > %t.out 2> %t.err +# RUN: FileCheck --check-prefix=CHECK-PYCONFIG-OUT < %t.out %s +# RUN: FileCheck --check-prefix=CHECK-PYCONFIG-ERR < %t.err %s +# +# CHECK-PYCONFIG-ERR: loading suite config '{{.*(/|\\\\)py-config-discovery(/|\\\\)lit.site.cfg.py}}' +# CHECK-PYCONFIG-ERR: load_config from '{{.*(/|\\\\)discovery(/|\\\\)lit.cfg}}' +# CHECK-PYCONFIG-ERR: loaded config '{{.*(/|\\\\)discovery(/|\\\\)lit.cfg}}' +# CHECK-PYCONFIG-ERR: loaded config '{{.*(/|\\\\)py-config-discovery(/|\\\\)lit.site.cfg.py}}' +# CHECK-PYCONFIG-ERR-DAG: loading suite config '{{.*(/|\\\\)discovery(/|\\\\)subsuite(/|\\\\)lit.cfg}}' +# CHECK-PYCONFIG-ERR-DAG: loading local config '{{.*(/|\\\\)discovery(/|\\\\)subdir(/|\\\\)lit.local.cfg}}' +# +# CHECK-PYCONFIG-OUT: -- Test Suites -- +# CHECK-PYCONFIG-OUT: sub-suite - 2 tests +# CHECK-PYCONFIG-OUT: Source Root: {{.*[/\\]discovery[/\\]subsuite$}} +# CHECK-PYCONFIG-OUT: Exec Root : {{.*[/\\]discovery[/\\]subsuite$}} +# CHECK-PYCONFIG-OUT: top-level-suite - 3 tests +# CHECK-PYCONFIG-OUT: Source Root: {{.*[/\\]discovery$}} +# CHECK-PYCONFIG-OUT: Exec Root : {{.*[/\\]py-config-discovery$}} +# +# CHECK-PYCONFIG-OUT: -- Available Tests -- +# CHECK-PYCONFIG-OUT: sub-suite :: test-one +# CHECK-PYCONFIG-OUT: sub-suite :: test-two +# CHECK-PYCONFIG-OUT: top-level-suite :: subdir/test-three +# CHECK-PYCONFIG-OUT: top-level-suite :: test-one +# CHECK-PYCONFIG-OUT: top-level-suite :: test-two # Check discovery when using an exec path. #