Refactor the lit configuration files
A year or so ago, I re-wrote most of the lit infrastructure in LLVM so
that it wasn't so boilerplate-y. I added lots of common helper type
stuff, simplifed usage patterns, and made the code more elegant and
maintainable.
We migrated to this in LLVM, clang, and lld's lit files, but not in
LLDBs. This started to bite me recently, as the 4 most recent times I
tried to run the lit test suite in LLDB on a fresh checkout the first
thing that would happen is that python would just start crashing with
unhelpful backtraces and I would have to spend time investigating.
You can reproduce this today by doing a fresh cmake generation, doing
ninja lldb and then python bin/llvm-lit.py -sv ~/lldb/lit/SymbolFile at
which point you'll get a segfault that tells you nothing about what your
problem is.
I started trying to fix the issues with bandaids, but it became clear
that the proper solution was to just bring in the work I did in the rest
of the projects. The side benefit of this is that the lit configuration
files become much cleaner and more understandable as a result.
Differential Revision: https://reviews.llvm.org/D54009
llvm-svn: 346008
diff --git a/lldb/lit/lit.cfg.py b/lldb/lit/lit.cfg.py
new file mode 100644
index 0000000..9b78ba3
--- /dev/null
+++ b/lldb/lit/lit.cfg.py
@@ -0,0 +1,126 @@
+# -*- Python -*-
+
+import os
+import sys
+import re
+import platform
+import subprocess
+
+
+import lit.util
+import lit.formats
+from lit.llvm import llvm_config
+from lit.llvm.subst import FindTool
+from lit.llvm.subst import ToolSubst
+
+# name: The name of this test suite.
+config.name = 'LLDB'
+
+# 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 = ['.test', '.cpp', '.s']
+
+# 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.lldb_obj_root, 'lit')
+
+# Tweak the PATH to include the tools dir.
+llvm_config.with_system_environment('PATH')
+llvm_config.with_environment('PATH', config.lldb_tools_dir, append_path=True)
+llvm_config.with_environment('PATH', config.llvm_tools_dir, append_path=True)
+
+llvm_config.with_environment('LD_LIBRARY_PATH', config.lldb_libs_dir, append_path=True)
+llvm_config.with_environment('LD_LIBRARY_PATH', config.llvm_libs_dir, append_path=True)
+llvm_config.with_system_environment('LD_LIBRARY_PATH', append_path=True)
+
+
+llvm_config.use_default_substitutions()
+
+if platform.system() in ['Darwin']:
+ debugserver = lit.util.which('debugserver', config.lldb_tools_dir)
+else:
+ debugserver = lit.util.which('lldb-server', config.lldb_tools_dir)
+lldb = "%s -S %s/lit-lldb-init" % (lit.util.which('lldb', config.lldb_tools_dir),
+ config.test_source_root)
+
+lldbmi = lit.util.which('lldb-mi', config.lldb_tools_dir)
+if lldbmi:
+ config.available_features.add('lldb-mi')
+
+config.cc = llvm_config.use_llvm_tool(config.cc, required=True)
+config.cxx = llvm_config.use_llvm_tool(config.cxx, required=True)
+
+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)
+ lit_config.note('using SDKROOT: %r' % sdk_path)
+ config.cc += " -isysroot %s" % sdk_path
+ config.cxx += " -isysroot %s" % sdk_path
+
+if platform.system() in ['OpenBSD']:
+ config.cc += " -pthread"
+ config.cxx += " -pthread"
+
+config.substitutions.append(('%cc', config.cc))
+config.substitutions.append(('%cxx', config.cxx))
+
+if lldbmi:
+ config.substitutions.append(('%lldbmi', lldbmi + " --synchronous"))
+config.substitutions.append(('%lldb', lldb))
+
+if debugserver is not None:
+ if platform.system() in ['Darwin']:
+ config.substitutions.append(('%debugserver', debugserver))
+ else:
+ config.substitutions.append(('%debugserver', debugserver + ' gdbserver'))
+
+tools = ['lldb-test', 'yaml2obj', 'obj2yaml', 'llvm-pdbutil']
+llvm_config.add_tool_substitutions(tools, [config.llvm_tools_dir, config.lldb_tools_dir])
+
+if re.match(r'^arm(hf.*-linux)|(.*-linux-gnuabihf)', config.target_triple):
+ config.available_features.add("armhf-linux")
+
+print("config.cc = {}".format(config.cc))
+if re.match(r'icc', config.cc):
+ config.available_features.add("compiler-icc")
+elif re.match(r'clang', config.cc):
+ config.available_features.add("compiler-clang")
+elif re.match(r'gcc', config.cc):
+ config.available_features.add("compiler-gcc")
+elif re.match(r'cl', config.cc):
+ config.available_features.add("compiler-msvc")
+
+if config.have_lld:
+ config.available_features.add("lld")
+
+def calculate_arch_features(arch_string):
+ # This will add a feature such as x86, arm, mips, etc for each built
+ # target
+ features = []
+ for arch in arch_string.split():
+ features.append(arch.lower())
+ return features
+
+# Run llvm-config and add automatically add features for whether we have
+# assertions enabled, whether we are in debug mode, and what targets we
+# are built for.
+llvm_config.feature_config(
+ [('--assertion-mode', {'ON': 'asserts'}),
+ ('--build-mode', {'DEBUG': 'debug'}),
+ ('--targets-built', calculate_arch_features)
+ ])