mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-29 08:31:13 +00:00
[libcxx] Add numerous options to libc++ LIT test suite configuration.
Summary: In order to fully replace the testit script we need to update LIT so it provides the same functionality. This patch adds a number of different configuration options to LIT to do that. It also adds documentation for all of the command line parameters that LIT supports. Generic options added: - `libcxx_headers` - `libcxx_library` - `compile_flags` Generic options modified: - `link_flags`: Changed from overriding the default args to adding extra args instead (to match compile flags) - `use_sanitizer`: Renamed from `llvm_use_sanitizer` Please see the added documentation for more information about the switches. As for the actual documentation I'm not sure if it should be kept in libc++ forever since it adds an undue maintenance burden, but I think it should be added for the time being while the changes are new. I'm verify unskilled with HTML so if the documentation needs any changes please let me know. Hopefully this will kill testit. Reviewers: jroelofs, mclow.lists, danalbert Reviewed By: danalbert Subscribers: alexfh, cfe-commits Differential Revision: http://reviews.llvm.org/D5877 llvm-svn: 224728
This commit is contained in:
parent
811c173523
commit
19c07165d1
@ -252,7 +252,6 @@ class Configuration(object):
|
||||
self.configure_use_clang_verify()
|
||||
self.configure_ccache()
|
||||
self.configure_env()
|
||||
self.configure_std_flag()
|
||||
self.configure_compile_flags()
|
||||
self.configure_link_flags()
|
||||
self.configure_sanitizer()
|
||||
@ -450,14 +449,26 @@ class Configuration(object):
|
||||
self.config.available_features.add('long_tests')
|
||||
|
||||
def configure_compile_flags(self):
|
||||
# Configure extra compiler flags.
|
||||
# Try and get the std version from the command line. Fall back to
|
||||
# default given in lit.site.cfg is not present. If default is not
|
||||
# present then force c++11.
|
||||
std = self.get_lit_conf('std', 'c++11')
|
||||
self.compile_flags += ['-std={0}'.format(std)]
|
||||
self.config.available_features.add(std)
|
||||
# Configure include paths
|
||||
self.compile_flags += ['-nostdinc++']
|
||||
self.compile_flags += ['-I' + self.src_root + '/include',
|
||||
'-I' + self.src_root + '/test/support']
|
||||
self.compile_flags += ['-I' + self.src_root + '/test/support']
|
||||
libcxx_headers = self.get_lit_conf('libcxx_headers',
|
||||
self.src_root + '/include')
|
||||
if not os.path.isdir(libcxx_headers):
|
||||
self.lit_config.fatal("libcxx_headers='%s' is not a directory."
|
||||
% libcxx_headers)
|
||||
self.compile_flags += ['-I' + libcxx_headers]
|
||||
if sys.platform.startswith('linux'):
|
||||
self.compile_flags += ['-D__STDC_FORMAT_MACROS',
|
||||
'-D__STDC_LIMIT_MACROS',
|
||||
'-D__STDC_CONSTANT_MACROS']
|
||||
# Configure feature flags.
|
||||
enable_exceptions = self.get_lit_bool('enable_exceptions', True)
|
||||
if enable_exceptions:
|
||||
self.config.available_features.add('exceptions')
|
||||
@ -483,64 +494,70 @@ class Configuration(object):
|
||||
elif not enable_monotonic_clock:
|
||||
self.lit_config.fatal('enable_monotonic_clock cannot be false when'
|
||||
' enable_threads is true.')
|
||||
# Use verbose output for better errors
|
||||
self.compile_flags += ['-v']
|
||||
# Configure extra compile flags.
|
||||
compile_flags_str = self.get_lit_conf('compile_flags', '')
|
||||
self.compile_flags += shlex.split(compile_flags_str)
|
||||
|
||||
|
||||
def configure_link_flags(self):
|
||||
self.link_flags += ['-nodefaultlibs']
|
||||
# Configure library search paths
|
||||
libcxx_library = self.get_lit_conf('libcxx_library')
|
||||
# Configure libc++ library paths.
|
||||
if libcxx_library is not None:
|
||||
# Check that the given value for libcxx_library is valid.
|
||||
if not os.path.isfile(libcxx_library):
|
||||
self.lit_config.fatal(
|
||||
"libcxx_library='%s' is not a valid file." % libcxx_library)
|
||||
if self.use_system_lib:
|
||||
self.lit_config.fatal("Conflicting options: 'libcxx_library'"
|
||||
" cannot be used with 'use_system_lib=true'")
|
||||
self.link_flags += ['-Wl,-rpath,' + os.path.dirname(libcxx_library)]
|
||||
elif not self.use_system_lib:
|
||||
self.link_flags += ['-L' + self.library_root,
|
||||
'-Wl,-rpath,' + self.library_root]
|
||||
# Configure ABI library paths.
|
||||
abi_library_path = self.get_lit_conf('abi_library_path', '')
|
||||
if not self.use_system_lib:
|
||||
self.link_flags += ['-L' + self.library_root]
|
||||
self.link_flags += ['-Wl,-rpath,' + self.library_root]
|
||||
if abi_library_path:
|
||||
self.link_flags += ['-L' + abi_library_path,
|
||||
'-Wl,-rpath,' + abi_library_path]
|
||||
# Configure libraries
|
||||
self.link_flags += ['-lc++']
|
||||
link_flags_str = self.get_lit_conf('link_flags')
|
||||
if link_flags_str is None:
|
||||
cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
|
||||
if cxx_abi == 'libstdc++':
|
||||
self.link_flags += ['-lstdc++']
|
||||
elif cxx_abi == 'libsupc++':
|
||||
self.link_flags += ['-lsupc++']
|
||||
elif cxx_abi == 'libcxxabi':
|
||||
self.link_flags += ['-lc++abi']
|
||||
elif cxx_abi == 'libcxxrt':
|
||||
self.link_flags += ['-lcxxrt']
|
||||
elif cxx_abi == 'none':
|
||||
pass
|
||||
else:
|
||||
self.lit_config.fatal(
|
||||
'C++ ABI setting %s unsupported for tests' % cxx_abi)
|
||||
if libcxx_library:
|
||||
self.link_flags += [libcxx_library]
|
||||
else:
|
||||
self.link_flags += ['-lc++']
|
||||
cxx_abi = self.get_lit_conf('cxx_abi', 'libcxxabi')
|
||||
if cxx_abi == 'libstdc++':
|
||||
self.link_flags += ['-lstdc++']
|
||||
elif cxx_abi == 'libsupc++':
|
||||
self.link_flags += ['-lsupc++']
|
||||
elif cxx_abi == 'libcxxabi':
|
||||
self.link_flags += ['-lc++abi']
|
||||
elif cxx_abi == 'libcxxrt':
|
||||
self.link_flags += ['-lcxxrt']
|
||||
elif cxx_abi == 'none':
|
||||
pass
|
||||
else:
|
||||
self.lit_config.fatal(
|
||||
'C++ ABI setting %s unsupported for tests' % cxx_abi)
|
||||
# Configure extra libraries.
|
||||
if sys.platform == 'darwin':
|
||||
self.link_flags += ['-lSystem']
|
||||
elif sys.platform.startswith('linux'):
|
||||
self.link_flags += ['-lgcc_eh', '-lc', '-lm', '-lpthread',
|
||||
'-lrt', '-lgcc_s']
|
||||
elif sys.platform.startswith('freebsd'):
|
||||
self.link_flags += ['-lc', '-lm', '-pthread', '-lgcc_s']
|
||||
else:
|
||||
self.lit_config.fatal("unrecognized system: %r" % sys.platform)
|
||||
|
||||
if sys.platform == 'darwin':
|
||||
self.link_flags += ['-lSystem']
|
||||
elif sys.platform.startswith('linux'):
|
||||
self.link_flags += ['-lgcc_eh', '-lc', '-lm', '-lpthread',
|
||||
'-lrt', '-lgcc_s']
|
||||
elif sys.platform.startswith('freebsd'):
|
||||
self.link_flags += ['-lc', '-lm', '-pthread', '-lgcc_s']
|
||||
else:
|
||||
self.lit_config.fatal("unrecognized system: %r" % sys.platform)
|
||||
link_flags_str = self.get_lit_conf('link_flags', '')
|
||||
self.link_flags += shlex.split(link_flags_str)
|
||||
|
||||
if link_flags_str:
|
||||
self.link_flags += shlex.split(link_flags_str)
|
||||
|
||||
|
||||
def configure_std_flag(self):
|
||||
# Try and get the std version from the command line. Fall back to
|
||||
# default given in lit.site.cfg is not present. If default is not
|
||||
# present then force c++11.
|
||||
std = self.get_lit_conf('std')
|
||||
if std is None:
|
||||
std = 'c++11'
|
||||
self.lit_config.note('using default std: \'-std=c++11\'')
|
||||
self.compile_flags += ['-std={0}'.format(std)]
|
||||
self.config.available_features.add(std)
|
||||
|
||||
def configure_sanitizer(self):
|
||||
san = self.get_lit_conf('llvm_use_sanitizer', '').strip()
|
||||
san = self.get_lit_conf('use_sanitizer', '').strip()
|
||||
if san:
|
||||
# Search for llvm-symbolizer along the compiler path first
|
||||
# and then along the PATH env variable.
|
||||
@ -606,7 +623,12 @@ class Configuration(object):
|
||||
|
||||
def configure_env(self):
|
||||
if sys.platform == 'darwin' and not self.use_system_lib:
|
||||
self.env['DYLD_LIBRARY_PATH'] = self.library_root
|
||||
libcxx_library = self.get_lit_conf('libcxx_library')
|
||||
if libcxx_library:
|
||||
library_root = os.path.dirname(libcxx_library)
|
||||
else:
|
||||
library_root = self.library_root
|
||||
self.env['DYLD_LIBRARY_PATH'] = library_root
|
||||
|
||||
# name: The name of this test suite.
|
||||
config.name = 'libc++'
|
||||
|
@ -11,7 +11,7 @@ config.enable_32bit = "@LIBCXX_BUILD_32_BITS@"
|
||||
config.enable_threads = "@LIBCXX_ENABLE_THREADS@"
|
||||
config.enable_monotonic_clock = "@LIBCXX_ENABLE_MONOTONIC_CLOCK@"
|
||||
config.cxx_abi = "@LIBCXX_CXX_ABI_LIBNAME@"
|
||||
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
|
||||
config.use_sanitizer = "@LLVM_USE_SANITIZER@"
|
||||
config.abi_library_path = "@LIBCXX_CXX_ABI_LIBRARY_PATH@"
|
||||
|
||||
# Let the main config do the real work.
|
||||
|
@ -470,6 +470,7 @@ End of search list.
|
||||
<li><a href="type_traits_design.html"><tt><type_traits></tt></a></li>
|
||||
<li><a href="http://cplusplusmusings.wordpress.com/2012/07/05/clang-and-standard-libraries-on-mac-os-x/">Excellent notes by Marshall Clow</a></li>
|
||||
<li><a href="debug_mode.html">Status of debug mode</a></li>
|
||||
<li><a href="lit_usage.html">LIT usage guide</a></li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
168
libcxx/www/lit_usage.html
Normal file
168
libcxx/www/lit_usage.html
Normal file
@ -0,0 +1,168 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
|
||||
"http://www.w3.org/TR/html4/strict.dtd">
|
||||
<!-- Material used from: HTML 4.01 specs: http://www.w3.org/TR/html401/ -->
|
||||
<html>
|
||||
<head>
|
||||
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
||||
<title>Testing libc++ using LIT</title>
|
||||
<link type="text/css" rel="stylesheet" href="menu.css">
|
||||
<link type="text/css" rel="stylesheet" href="content.css">
|
||||
<style>
|
||||
.lit-option {
|
||||
padding-top: 0.5em;
|
||||
margin-bottom: 0.0em;
|
||||
font-size: medium;
|
||||
color: #2d58b7
|
||||
}
|
||||
.lit-option-desc {
|
||||
display: block;
|
||||
margin-top: 0em;
|
||||
margin-bottom: 0em;
|
||||
margin-left: 20px;
|
||||
margin-right: 20px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="menu">
|
||||
<div>
|
||||
<a href="http://llvm.org/">LLVM Home</a>
|
||||
</div>
|
||||
|
||||
<div class="submenu">
|
||||
<label>libc++ Info</label>
|
||||
<a href="/index.html">About</a>
|
||||
</div>
|
||||
|
||||
<div class="submenu">
|
||||
<label>Quick Links</label>
|
||||
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev">cfe-dev</a>
|
||||
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits">cfe-commits</a>
|
||||
<a href="http://llvm.org/bugs/">Bug Reports</a>
|
||||
<a href="http://llvm.org/svn/llvm-project/libcxx/trunk/">Browse SVN</a>
|
||||
<a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/">Browse ViewVC</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="content">
|
||||
<!--*********************************************************************-->
|
||||
<h1>Testing libc++ using LIT</h1>
|
||||
<!--*********************************************************************-->
|
||||
<p>
|
||||
libc++ uses LIT to configure and run its tests. The primary way to run the
|
||||
libc++ tests is by using <code>make check-libcxx</code>. However since libc++
|
||||
can be used in any number of possible configurations it is important to
|
||||
customize the way LIT builds and runs the tests. This guide provides
|
||||
information on how to use LIT directly to test libc++.
|
||||
</p>
|
||||
<p>
|
||||
Documentation for LIT can be found
|
||||
<a href="http://llvm.org/docs/CommandGuide/lit.html">here</a>.
|
||||
</p>
|
||||
|
||||
<!--*********************************************************************-->
|
||||
<h2>Getting Started</h2>
|
||||
<!--*********************************************************************-->
|
||||
<p>
|
||||
After building libc++ use the following commands before you start using LIT to
|
||||
test.
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>alias lit='python path/to/llvm/utils/lit/lit.py'</code></li>
|
||||
<li><code>export LIBCXX_SITE_CONFIG=path/to/build-libcxx/test/lit.site.cfg</code></li>
|
||||
</ul>
|
||||
<p>
|
||||
You can now run the libc++ tests by running:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>cd path/to/libcxx</code></li>
|
||||
<li><code>lit -sv ./test</code></li>
|
||||
</ul>
|
||||
<p>
|
||||
To only run a subsection of the tests use:
|
||||
<ul>
|
||||
<li><code>lit -sv test/std/numerics # Run only the numeric tests</code></li>
|
||||
</ul>
|
||||
|
||||
<!--*********************************************************************-->
|
||||
<h2>Customization Options</h2>
|
||||
<!--*********************************************************************-->
|
||||
<p>
|
||||
libc++'s testsuite provides multiple options to configure the way the tests
|
||||
are build and run. To use these options you pass them on the LIT command line
|
||||
as <code>--param NAME</code> or <code>--param NAME=VALUE</code>. Some options
|
||||
have default values specified during CMake's configuration. Passing the option
|
||||
on the command line will override the default.
|
||||
</p>
|
||||
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">libcxx_site_config=<path/to/lit.site.cfg></h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
Specify the site configuration to use when running the tests. This option
|
||||
overrides the enviroment variable <code>LIBCXX_SITE_CONFIG</code>
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">libcxx_headers=<path/to/headers></h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
Specify the libc++ headers that are tested. By default the headers in the source
|
||||
tree are used.
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">libcxx_library=<path/to/libc++.so></h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
Specify the libc++ library that is tested. By default the library in the build
|
||||
directory is used. This option cannot be used when <code>use_system_lib</code>
|
||||
is provided.
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">use_system_lib=<bool></h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
<b>Default: </b><code>False</code></br>
|
||||
Enable or disable testing against the installed version of libc++ library.
|
||||
Note: This does not use the installed headers.
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">compile_flags="<list-of-args>"</h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
Specify additional compile flags as a space delimited string.
|
||||
Note: This options should not be used to change the standard version used.
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">link_flags="<list-of-args>"</h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
Specify additional link flags as a space delimited string.
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">std=<standard version></h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
<b>Values: </b><code>c++98, c++03, c++11, c++14, c++1z</code></br>
|
||||
Change the standard version used when building the tests.
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<h3 class="lit-option">use_sanitizer=<sanitizer name></h3>
|
||||
<blockquote class="lit-option-desc">
|
||||
<b>Values: </b><code>Memory, MemoryWithOrigins, Address, Undefined</code></br>
|
||||
Run the tests using the given sanitizer. If <code>LLVM_USE_SANITIZER</code>
|
||||
was given when building libc++ then that sanitizer will be used by default.
|
||||
</blockquote>
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user