diff options
Diffstat (limited to 'lldb/test/Shell/helper/toolchain.py')
-rw-r--r-- | lldb/test/Shell/helper/toolchain.py | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/lldb/test/Shell/helper/toolchain.py b/lldb/test/Shell/helper/toolchain.py new file mode 100644 index 00000000000..d9e5c0593ec --- /dev/null +++ b/lldb/test/Shell/helper/toolchain.py @@ -0,0 +1,131 @@ +import os +import itertools +import platform +import subprocess +import sys + +import lit.util +from lit.llvm import llvm_config +from lit.llvm.subst import FindTool +from lit.llvm.subst import ToolSubst + +def use_lldb_substitutions(config): + # Set up substitutions for primary tools. These tools must come from config.lldb_tools_dir + # which is basically the build output directory. We do not want to find these in path or + # anywhere else, since they are specifically the programs which are actually being tested. + + dsname = 'debugserver' if platform.system() in ['Darwin'] else 'lldb-server' + dsargs = [] if platform.system() in ['Darwin'] else ['gdbserver'] + + build_script = os.path.dirname(__file__) + build_script = os.path.join(build_script, 'build.py') + build_script_args = [build_script, + '--compiler=any', # Default to best compiler + '--arch=' + str(config.lldb_bitness)] + if config.lldb_lit_tools_dir: + build_script_args.append('--tools-dir={0}'.format(config.lldb_lit_tools_dir)) + if config.lldb_tools_dir: + build_script_args.append('--tools-dir={0}'.format(config.lldb_tools_dir)) + if config.llvm_libs_dir: + build_script_args.append('--libs-dir={0}'.format(config.llvm_libs_dir)) + + lldb_init = os.path.join(config.test_exec_root, 'Shell', 'lit-lldb-init') + + primary_tools = [ + ToolSubst('%lldb', + command=FindTool('lldb'), + extra_args=['--no-lldbinit', '-S', lldb_init]), + ToolSubst('%lldb-init', + command=FindTool('lldb'), + extra_args=['-S', lldb_init]), + ToolSubst('%debugserver', + command=FindTool(dsname), + extra_args=dsargs, + unresolved='ignore'), + ToolSubst('%platformserver', + command=FindTool('lldb-server'), + extra_args=['platform'], + unresolved='ignore'), + 'lldb-test', + 'lldb-instr', + ToolSubst('%build', + command="'" + sys.executable + "'", + extra_args=build_script_args) + ] + + llvm_config.add_tool_substitutions(primary_tools, + [config.lldb_tools_dir]) + +def _use_msvc_substitutions(config): + # If running from a Visual Studio Command prompt (e.g. vcvars), this will + # detect the include and lib paths, and find cl.exe and link.exe and create + # substitutions for each of them that explicitly specify /I and /L paths + cl = lit.util.which('cl') + link = lit.util.which('link') + + if not cl or not link: + return + + cl = '"' + cl + '"' + link = '"' + link + '"' + includes = os.getenv('INCLUDE', '').split(';') + libs = os.getenv('LIB', '').split(';') + + config.available_features.add('msvc') + compiler_flags = ['"/I{}"'.format(x) for x in includes if os.path.exists(x)] + linker_flags = ['"/LIBPATH:{}"'.format(x) for x in libs if os.path.exists(x)] + + tools = [ + ToolSubst('%msvc_cl', command=cl, extra_args=compiler_flags), + ToolSubst('%msvc_link', command=link, extra_args=linker_flags)] + llvm_config.add_tool_substitutions(tools) + return + +def use_support_substitutions(config): + # Set up substitutions for support tools. These tools can be overridden at the CMake + # level (by specifying -DLLDB_LIT_TOOLS_DIR), installed, or as a last resort, we can use + # the just-built version. + flags = [] + if platform.system() in ['Darwin']: + try: + out = subprocess.check_output(['xcrun', '--show-sdk-path']).strip() + res = 0 + except OSError: + res = -1 + if res == 0 and out: + sdk_path = lit.util.to_string(out) + llvm_config.lit_config.note('using SDKROOT: %r' % sdk_path) + flags = ['-isysroot', sdk_path] + elif platform.system() in ['NetBSD', 'OpenBSD', 'Linux']: + flags = ['-pthread'] + + if sys.platform.startswith('netbsd'): + # needed e.g. to use freshly built libc++ + flags += ['-L' + config.llvm_libs_dir, + '-Wl,-rpath,' + config.llvm_libs_dir] + + # The clang module cache is used for building inferiors. + flags += ['-fmodules-cache-path={}'.format(config.clang_module_cache)] + + additional_tool_dirs=[] + if config.lldb_lit_tools_dir: + additional_tool_dirs.append(config.lldb_lit_tools_dir) + + llvm_config.use_clang(additional_flags=flags, + additional_tool_dirs=additional_tool_dirs, + required=True) + + if sys.platform == 'win32': + _use_msvc_substitutions(config) + + have_lld = llvm_config.use_lld(additional_tool_dirs=additional_tool_dirs, + required=False) + if have_lld: + config.available_features.add('lld') + + + support_tools = ['yaml2obj', 'obj2yaml', 'llvm-pdbutil', + 'llvm-mc', 'llvm-readobj', 'llvm-objdump', + 'llvm-objcopy', 'lli'] + additional_tool_dirs += [config.lldb_tools_dir, config.llvm_tools_dir] + llvm_config.add_tool_substitutions(support_tools, additional_tool_dirs) |