Add std::filesystem support.

Test: ./run_tests.py --bitness 32
Test: ./run_tests.py --bitness 64
Test: ./run_tests.py --bitness 64 --host
Bug: None
Change-Id: Ie277f503b754321eba04b906fa4ee6d670b2c1b2
This commit is contained in:
Dan Albert
2018-12-12 13:45:05 -08:00
parent b2ed3ee88f
commit 4d4d6a8f06
5 changed files with 116 additions and 6 deletions

View File

@@ -14,6 +14,10 @@ class AndroidCXXCompiler(libcxx.compiler.CXXCompiler):
self.link_template = link_template
self.build_top = os.getenv('ANDROID_BUILD_TOP')
# The file system tests require a handful of defines that we can't add
# to the Android.bp since they require absolute paths.
self.extra_cflags = []
def copy(self):
return copy.deepcopy(self)
@@ -60,7 +64,7 @@ class AndroidCXXCompiler(libcxx.compiler.CXXCompiler):
source_files = [source_files]
cxx_args = self.cxx_template.replace('%OUT%', out)
cxx_args = cxx_args.replace('%SOURCE%', ' '.join(source_files))
return [self.path] + shlex.split(cxx_args)
return [self.path] + shlex.split(cxx_args) + self.extra_cflags
def linkCmd(self, source_files, out=None, flags=None):
if out is None:

View File

@@ -1,5 +1,6 @@
import os
import re
import sys
import libcxx.test.config
import libcxx.android.compiler
@@ -9,6 +10,12 @@ import libcxx.android.test.format
class Configuration(libcxx.test.config.Configuration):
def __init__(self, lit_config, config):
super(Configuration, self).__init__(lit_config, config)
self.exec_env = {}
@property
def is_host(self):
"""Returns True if configured to run host tests."""
return self.lit_config.params.get('android_mode') == 'host'
def configure(self):
self.configure_src_root()
@@ -17,6 +24,10 @@ class Configuration(libcxx.test.config.Configuration):
self.configure_cxx()
self.configure_triple()
self.configure_features()
if self.is_host:
self.configure_filesystem_host()
else:
self.configure_filesystem_device()
def print_config_info(self):
self.lit_config.note(
@@ -29,7 +40,7 @@ class Configuration(libcxx.test.config.Configuration):
list(self.config.available_features))
def configure_obj_root(self):
if self.lit_config.params.get('android_mode') == 'host':
if self.is_host:
self.libcxx_obj_root = os.getenv('ANDROID_HOST_OUT')
else:
self.libcxx_obj_root = os.getenv('ANDROID_PRODUCT_OUT')
@@ -49,9 +60,53 @@ class Configuration(libcxx.test.config.Configuration):
self.config.target_triple = self.cxx.get_triple()
def configure_filesystem_host(self):
# TODO: We shouldn't be writing to the source directory for the host.
static_env = os.path.join(self.libcxx_src_root, 'test', 'std',
'input.output', 'filesystems', 'Inputs',
'static_test_env')
static_env = os.path.realpath(static_env)
assert os.path.isdir(static_env)
self.cxx.extra_cflags.append(
'-DLIBCXX_FILESYSTEM_STATIC_TEST_ROOT="{}"'.format(static_env))
dynamic_env = os.path.join(self.config.test_exec_root, 'filesystem',
'Output', 'dynamic_env')
dynamic_env = os.path.realpath(dynamic_env)
if not os.path.isdir(dynamic_env):
os.makedirs(dynamic_env)
self.cxx.extra_cflags.append(
'-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT="{}"'.format(dynamic_env))
self.exec_env['LIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT'] = dynamic_env
dynamic_helper = os.path.join(self.libcxx_src_root, 'test', 'support',
'filesystem_dynamic_test_helper.py')
assert os.path.isfile(dynamic_helper)
self.cxx.extra_cflags.append(
'-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER="{} {}"'.format(
sys.executable, dynamic_helper))
def configure_filesystem_device(self):
static_env = '/data/local/tmp/libcxx/static_test_env'
self.cxx.extra_cflags.append(
'-DLIBCXX_FILESYSTEM_STATIC_TEST_ROOT="{}"'.format(static_env))
dynamic_env = '/data/local/tmp/libcxx/dynamic_test_env'
self.cxx.extra_cflags.append(
'-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT="{}"'.format(dynamic_env))
self.exec_env['LIBCXX_FILESYSTEM_DYNAMIC_TEST_ROOT'] = dynamic_env
dynamic_helper = ('/data/nativetest/filesystem_dynamic_test_helper.py/'
'filesystem_dynamic_test_helper.py')
self.cxx.extra_cflags.append(
'-DLIBCXX_FILESYSTEM_DYNAMIC_TEST_HELPER="{}"'.format(
dynamic_helper))
def configure_features(self):
self.config.available_features.add('long_tests')
self.config.available_features.add('c++experimental')
self.config.available_features.add('c++fs')
self.config.available_features.add('c++filesystem')
std_pattern = re.compile(r'-std=(c\+\+\d[0-9x-z])')
match = std_pattern.search(self.cxx.cxx_template)
if match:
@@ -65,12 +120,14 @@ class Configuration(libcxx.test.config.Configuration):
self.libcxx_src_root,
self.libcxx_obj_root,
getattr(self.config, 'device_dir', '/data/local/tmp/'),
getattr(self.config, 'timeout', '60'))
getattr(self.config, 'timeout', '60'),
self.exec_env)
elif mode == 'host':
return libcxx.android.test.format.HostTestFormat(
self.cxx,
self.libcxx_src_root,
self.libcxx_obj_root,
getattr(self.config, 'timeout', '60'))
getattr(self.config, 'timeout', '60'),
self.exec_env)
else:
raise RuntimeError('Invalid android_mode: {}'.format(mode))

View File

@@ -29,8 +29,10 @@ class HostTestFormat(libcxx.test.format.LibcxxTestFormat):
os.path.join(outdir, 'lib'),
os.path.join(outdir, 'lib64'),
])
default_env = {'LD_LIBRARY_PATH': libpath}
self.exec_env = default_env if exec_env is None else exec_env
env = {'LD_LIBRARY_PATH': libpath}
if exec_env is not None:
env.update(exec_env)
self.exec_env = env
class TestFormat(HostTestFormat):