| 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 _get_lldb_init_path(config): |
| return os.path.join(config.test_exec_root, "lit-lldb-init-quiet") |
| |
| |
| def _disallow(config, execName): |
| warning = """ |
| echo '*** Do not use \'{0}\' in tests; use \'%''{0}\'. ***' && |
| exit 1 && echo |
| """ |
| config.substitutions.append((" {0} ".format(execName), warning.format(execName))) |
| |
| |
| 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)) |
| if config.objc_gnustep_dir: |
| build_script_args.append( |
| '--objc-gnustep-dir="{0}"'.format(config.objc_gnustep_dir) |
| ) |
| if config.cmake_sysroot: |
| build_script_args.append("--sysroot={0}".format(config.cmake_sysroot)) |
| |
| lldb_init = _get_lldb_init_path(config) |
| |
| primary_tools = [ |
| ToolSubst( |
| "%lldb", |
| command=FindTool("lldb"), |
| extra_args=["--no-lldbinit", "-S", lldb_init], |
| unresolved="fatal", |
| ), |
| ToolSubst( |
| "%lldb-init", |
| command=FindTool("lldb"), |
| extra_args=["-S", lldb_init], |
| unresolved="fatal", |
| ), |
| ToolSubst( |
| "%lldb-noinit", |
| command=FindTool("lldb"), |
| extra_args=["--no-lldbinit"], |
| unresolved="fatal", |
| ), |
| ToolSubst( |
| "%lldb-server", |
| command=FindTool("lldb-server"), |
| extra_args=[], |
| unresolved="ignore", |
| ), |
| ToolSubst( |
| "%debugserver", |
| command=FindTool(dsname), |
| extra_args=dsargs, |
| unresolved="ignore", |
| ), |
| ToolSubst( |
| "%platformserver", |
| command=FindTool("lldb-server"), |
| extra_args=["platform"], |
| unresolved="ignore", |
| ), |
| "lldb-test", |
| "lldb-dap", |
| ToolSubst( |
| "%build", command="'" + sys.executable + "'", extra_args=build_script_args |
| ), |
| ] |
| |
| _disallow(config, "lldb") |
| _disallow(config, "lldb-server") |
| _disallow(config, "debugserver") |
| _disallow(config, "platformserver") |
| |
| 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") |
| |
| if not cl: |
| return |
| |
| # Don't use lit.util.which() for link.exe: In `git bash`, it will pick |
| # up /usr/bin/link (another name for ln). |
| link = os.path.join(os.path.dirname(cl), "link.exe") |
| |
| 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. |
| host_flags = ["--target=" + config.host_triple] |
| 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) |
| host_flags += ["-isysroot", sdk_path] |
| elif sys.platform != "win32": |
| host_flags += ["-pthread"] |
| |
| if sys.platform.startswith("netbsd"): |
| # needed e.g. to use freshly built libc++ |
| host_flags += [ |
| "-L" + config.llvm_libs_dir, |
| "-Wl,-rpath," + config.llvm_libs_dir, |
| ] |
| |
| # The clang module cache is used for building inferiors. |
| host_flags += ["-fmodules-cache-path={}".format(config.clang_module_cache)] |
| |
| if config.cmake_sysroot: |
| host_flags += ["--sysroot={}".format(config.cmake_sysroot)] |
| |
| host_flags = " ".join(host_flags) |
| config.substitutions.append(("%clang_host", "%clang " + host_flags)) |
| config.substitutions.append(("%clangxx_host", "%clangxx " + host_flags)) |
| config.substitutions.append( |
| ("%clang_cl_host", "%clang_cl --target=" + config.host_triple) |
| ) |
| |
| additional_tool_dirs = [] |
| if config.lldb_lit_tools_dir: |
| additional_tool_dirs.append(config.lldb_lit_tools_dir) |
| |
| llvm_config.use_clang( |
| additional_flags=["--target=specify-a-target-or-use-a-_host-substitution"], |
| additional_tool_dirs=additional_tool_dirs, |
| required=True, |
| use_installed=True, |
| ) |
| |
| if sys.platform == "win32": |
| _use_msvc_substitutions(config) |
| |
| have_lld = llvm_config.use_lld( |
| additional_tool_dirs=additional_tool_dirs, required=False, use_installed=True |
| ) |
| if have_lld: |
| config.available_features.add("lld") |
| |
| support_tools = [ |
| "yaml2obj", |
| "obj2yaml", |
| "llvm-dwp", |
| "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) |
| |
| _disallow(config, "clang") |
| |
| |
| def use_lldb_repro_substitutions(config, mode): |
| lldb_init = _get_lldb_init_path(config) |
| substitutions = [ |
| ToolSubst( |
| "%lldb", |
| command=FindTool("lldb-repro"), |
| extra_args=[mode, "--no-lldbinit", "-S", lldb_init], |
| ), |
| ToolSubst( |
| "%lldb-init", |
| command=FindTool("lldb-repro"), |
| extra_args=[mode, "-S", lldb_init], |
| ), |
| ] |
| llvm_config.add_tool_substitutions(substitutions, [config.lldb_tools_dir]) |