| # -*- Python -*- |
| |
| import os |
| import platform |
| import re |
| import subprocess |
| |
| import lit.formats |
| import lit.util |
| |
| # Configuration file for the 'lit' test runner. |
| |
| # name: The name of this test suite. |
| config.name = 'Clang Tools' |
| |
| # Tweak PATH for Win32 |
| if platform.system() == 'Windows': |
| # Seek sane tools in directories and set to $PATH. |
| path = getattr(config, 'lit_tools_dir', None) |
| path = lit_config.getToolsPath(path, |
| config.environment['PATH'], |
| ['cmp.exe', 'grep.exe', 'sed.exe']) |
| if path is not None: |
| path = os.path.pathsep.join((path, |
| config.environment['PATH'])) |
| config.environment['PATH'] = path |
| |
| # Choose between lit's internal shell pipeline runner and a real shell. If |
| # LIT_USE_INTERNAL_SHELL is in the environment, we use that as an override. |
| use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL") |
| if use_lit_shell: |
| # 0 is external, "" is default, and everything else is internal. |
| execute_external = (use_lit_shell == "0") |
| else: |
| # Otherwise we default to internal on Windows and external elsewhere, as |
| # bash on Windows is usually very slow. |
| execute_external = (not sys.platform in ['win32']) |
| |
| # testFormat: The test format to use to interpret tests. |
| # |
| # For now we require '&&' between commands, until they get globally killed and |
| # the test runner updated. |
| config.test_format = lit.formats.ShTest(execute_external) |
| |
| # suffixes: A list of file extensions to treat as test files. |
| config.suffixes = ['.c', '.cpp', '.hpp', '.m', '.mm', '.cu', '.ll', '.cl', '.s', |
| '.modularize', '.module-map-checker', '.test'] |
| |
| # Test-time dependencies located in directories called 'Inputs' are excluded |
| # from test suites; there won't be any lit tests within them. |
| config.excludes = ['Inputs'] |
| |
| # 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. |
| clang_tools_binary_dir = getattr(config, 'clang_tools_binary_dir', None) |
| if clang_tools_binary_dir is not None: |
| config.test_exec_root = os.path.join(clang_tools_binary_dir, 'test') |
| |
| # Clear some environment variables that might affect Clang. |
| # |
| # This first set of vars are read by Clang, but shouldn't affect tests |
| # that aren't specifically looking for these features, or are required |
| # simply to run the tests at all. |
| # |
| # FIXME: Should we have a tool that enforces this? |
| |
| # safe_env_vars = ('TMPDIR', 'TEMP', 'TMP', 'USERPROFILE', 'PWD', |
| # 'MACOSX_DEPLOYMENT_TARGET', 'IPHONEOS_DEPLOYMENT_TARGET', |
| # 'IOS_SIMULATOR_DEPLOYMENT_TARGET', |
| # 'VCINSTALLDIR', 'VC100COMNTOOLS', 'VC90COMNTOOLS', |
| # 'VC80COMNTOOLS') |
| possibly_dangerous_env_vars = ['COMPILER_PATH', 'RC_DEBUG_OPTIONS', |
| 'CINDEXTEST_PREAMBLE_FILE', 'LIBRARY_PATH', |
| 'CPATH', 'C_INCLUDE_PATH', 'CPLUS_INCLUDE_PATH', |
| 'OBJC_INCLUDE_PATH', 'OBJCPLUS_INCLUDE_PATH', |
| 'LIBCLANG_TIMING', 'LIBCLANG_OBJTRACKING', |
| 'LIBCLANG_LOGGING', 'LIBCLANG_BGPRIO_INDEX', |
| 'LIBCLANG_BGPRIO_EDIT', 'LIBCLANG_NOTHREADS', |
| 'LIBCLANG_RESOURCE_USAGE', |
| 'LIBCLANG_CODE_COMPLETION_LOGGING'] |
| # Clang/Win32 may refer to %INCLUDE%. vsvarsall.bat sets it. |
| if platform.system() != 'Windows': |
| possibly_dangerous_env_vars.append('INCLUDE') |
| for name in possibly_dangerous_env_vars: |
| if name in config.environment: |
| del config.environment[name] |
| |
| # Tweak the PATH to include the tools dir and the scripts dir. |
| if clang_tools_binary_dir is not None: |
| clang_tools_dir = getattr(config, 'clang_tools_dir', None) |
| if not clang_tools_dir: |
| lit_config.fatal('No Clang tools dir set!') |
| llvm_tools_dir = getattr(config, 'llvm_tools_dir', None) |
| if not llvm_tools_dir: |
| lit_config.fatal('No LLVM tools dir set!') |
| path = os.path.pathsep.join(( |
| clang_tools_dir, llvm_tools_dir, config.environment['PATH'])) |
| config.environment['PATH'] = path |
| |
| llvm_libs_dir = getattr(config, 'llvm_libs_dir', None) |
| if not llvm_libs_dir: |
| lit_config.fatal('No LLVM libs dir set!') |
| path = os.path.pathsep.join((llvm_libs_dir, |
| config.environment.get('LD_LIBRARY_PATH',''))) |
| config.environment['LD_LIBRARY_PATH'] = path |
| |
| ### |
| |
| # Check that the object root is known. |
| if config.test_exec_root is None: |
| # Otherwise, we haven't loaded the site specific configuration (the user is |
| # probably trying to run on a test file directly, and either the site |
| # configuration hasn't been created by the build system, or we are in an |
| # out-of-tree build situation). |
| |
| # Check for 'clang_site_config' user parameter, and use that if available. |
| site_cfg = lit_config.params.get('clang_tools_extra_site_config', None) |
| if site_cfg and os.path.exists(site_cfg): |
| lit_config.load_config(config, site_cfg) |
| raise SystemExit |
| |
| # Try to detect the situation where we are using an out-of-tree build by |
| # looking for 'llvm-config'. |
| # |
| # FIXME: I debated (i.e., wrote and threw away) adding logic to |
| # automagically generate the lit.site.cfg if we are in some kind of fresh |
| # build situation. This means knowing how to invoke the build system though, |
| # and I decided it was too much magic. We should solve this by just having |
| # the .cfg files generated during the configuration step. |
| |
| llvm_config = lit.util.which('llvm-config', config.environment['PATH']) |
| if not llvm_config: |
| lit_config.fatal('No site specific configuration available!') |
| |
| # Get the source and object roots. |
| llvm_src_root = lit.util.capture(['llvm-config', '--src-root']).strip() |
| llvm_obj_root = lit.util.capture(['llvm-config', '--obj-root']).strip() |
| clang_src_root = os.path.join(llvm_src_root, "tools", "clang") |
| clang_obj_root = os.path.join(llvm_obj_root, "tools", "clang") |
| |
| clang_tools_extra_src_root = os.path.join(clang_src_root, "tools", "extra") |
| clang_tools_extra_obj_root = os.path.join(clang_obj_root, "tools", "extra") |
| # Validate that we got a tree which points to here, using the standard |
| # tools/clang layout. |
| this_src_root = os.path.dirname(config.test_source_root) |
| if os.path.realpath(clang_tools_extra_src_root) != os.path.realpath(this_src_root): |
| lit_config.fatal('No site specific configuration available!') |
| |
| # Check that the site specific configuration exists. |
| site_cfg = os.path.join(clang_tools_extra_obj_root, 'test', 'lit.site.cfg') |
| if not os.path.exists(site_cfg): |
| lit_config.fatal( |
| 'No site specific configuration available! You may need to ' |
| 'run "make test" in your Clang build directory.') |
| |
| # Okay, that worked. Notify the user of the automagic, and reconfigure. |
| lit_config.note('using out-of-tree build at %r' % clang_obj_root) |
| lit_config.load_config(config, site_cfg) |
| raise SystemExit |
| |
| ### |
| |
| import os |
| |
| # When running under valgrind, we mangle '-vg' onto the end of the triple so we |
| # can check it with XFAIL and XTARGET. |
| if lit_config.useValgrind: |
| config.target_triple += '-vg' |
| |
| ### |
| |
| # Set available features we allow tests to conditionalize on. |
| # |
| # As of 2011.08, crash-recovery tests still do not pass on FreeBSD. |
| if platform.system() not in ['FreeBSD']: |
| config.available_features.add('crash-recovery') |
| |
| # Shell execution |
| if execute_external: |
| config.available_features.add('shell') |
| |
| # Exclude MSYS due to transforming '/' to 'X:/mingwroot/'. |
| if not platform.system() in ['Windows'] or not execute_external: |
| config.available_features.add('shell-preserves-root') |
| |
| # ANSI escape sequences in non-dumb terminal |
| if platform.system() not in ['Windows']: |
| config.available_features.add('ansi-escape-sequences') |
| |
| check_clang_tidy = os.path.join( |
| config.test_source_root, "clang-tidy", "check_clang_tidy.py") |
| config.substitutions.append( |
| ('%check_clang_tidy', |
| '%s %s' % (config.python_executable, check_clang_tidy)) ) |
| clang_tidy_diff = os.path.join( |
| config.test_source_root, "..", "clang-tidy", "tool", "clang-tidy-diff.py") |
| config.substitutions.append( |
| ('%clang_tidy_diff', |
| '%s %s' % (config.python_executable, clang_tidy_diff)) ) |