forked from OSchip/llvm-project
[libcxxabi] Teach CMake better ways to find the libc++ source directory (and misc cleanup).
Summary: The main section of this patch teaches CMake a new option `LIBCXXABI_LIBCXX_PATH` that specifies the path to the libcxx source root. This information is passed to lit so that it can better find libc++'s python module. `LIBCXXABI_LIBCXX_PATH` is also used to help find the libc++ headers. The rest of this patch is misc cleanup, mostly to make pep8 and pylint happy. I've also copied libc++'s .gitignore into libc++abi. Reviewers: jroelofs, danalbert Reviewed By: danalbert Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D7130 llvm-svn: 226855
This commit is contained in:
parent
7a2421095c
commit
753f7c306b
|
@ -0,0 +1,54 @@
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
env/
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
#lib/ # We actually have things checked in to lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
|
@ -97,6 +97,7 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
||||||
|
|
||||||
set(LIBCXXABI_BUILT_STANDALONE 1)
|
set(LIBCXXABI_BUILT_STANDALONE 1)
|
||||||
else()
|
else()
|
||||||
|
set(LLVM_MAIN_SRC_DIR "${CMAKE_SOURCE_DIR}" CACHE PATH "Path to LLVM source tree")
|
||||||
set(LLVM_LIT "${CMAKE_SOURCE_DIR}/utils/lit/lit.py")
|
set(LLVM_LIT "${CMAKE_SOURCE_DIR}/utils/lit/lit.py")
|
||||||
set(LIBCXXABI_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX})
|
set(LIBCXXABI_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX})
|
||||||
endif()
|
endif()
|
||||||
|
@ -126,14 +127,32 @@ find_path(
|
||||||
LIBCXXABI_LIBCXX_INCLUDES
|
LIBCXXABI_LIBCXX_INCLUDES
|
||||||
vector
|
vector
|
||||||
PATHS ${LIBCXXABI_LIBCXX_INCLUDES}
|
PATHS ${LIBCXXABI_LIBCXX_INCLUDES}
|
||||||
|
${LIBCXXABI_LIBCXX_PATH}/include
|
||||||
${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES}
|
${CMAKE_BINARY_DIR}/${LIBCXXABI_LIBCXX_INCLUDES}
|
||||||
${LLVM_MAIN_SRC_DIR}/projects/libcxx/include
|
${LLVM_MAIN_SRC_DIR}/projects/libcxx/include
|
||||||
${LLVM_INCLUDE_DIR}/c++/v1
|
${LLVM_INCLUDE_DIR}/c++/v1
|
||||||
)
|
)
|
||||||
|
|
||||||
set(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_INCLUDES}" CACHE STRING
|
set(LIBCXXABI_LIBCXX_INCLUDES "${LIBCXXABI_LIBCXX_INCLUDES}" CACHE PATH
|
||||||
"Specify path to libc++ includes." FORCE)
|
"Specify path to libc++ includes." FORCE)
|
||||||
|
|
||||||
|
find_path(
|
||||||
|
LIBCXXABI_LIBCXX_PATH
|
||||||
|
test/libcxx/__init__.py
|
||||||
|
PATHS ${LIBCXXABI_LIBCXX_PATH}
|
||||||
|
${LIBCXXABI_LIBCXX_INCLUDES}/../
|
||||||
|
${LLVM_MAIN_SRC_DIR}/projects/libcxx/
|
||||||
|
NO_DEFAULT_PATH
|
||||||
|
)
|
||||||
|
|
||||||
|
if (LIBCXXABI_LIBCXX_PATH STREQUAL "LIBCXXABI_LIBCXX_PATH-NOTFOUND")
|
||||||
|
message(WARNING "LIBCXXABI_LIBCXX_PATH was not specified and couldn't be infered.")
|
||||||
|
set(LIBCXXABI_LIBCXX_PATH "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(LIBCXXABI_LIBCXX_PATH "${LIBCXXABI_LIBCXX_PATH}" CACHE PATH
|
||||||
|
"Specify path to libc++ source." FORCE)
|
||||||
|
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
# Configure System
|
# Configure System
|
||||||
#===============================================================================
|
#===============================================================================
|
||||||
|
|
|
@ -1,26 +1,23 @@
|
||||||
import locale
|
|
||||||
import os
|
import os
|
||||||
import platform
|
|
||||||
import re
|
|
||||||
import shlex
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import lit.Test # pylint: disable=import-error,no-name-in-module
|
|
||||||
import lit.util # pylint: disable=import-error,no-name-in-module
|
|
||||||
|
|
||||||
from libcxx.test.format import LibcxxTestFormat
|
|
||||||
from libcxx.test.config import Configuration as LibcxxConfiguration
|
from libcxx.test.config import Configuration as LibcxxConfiguration
|
||||||
from libcxx.compiler import CXXCompiler
|
|
||||||
|
|
||||||
class Configuration(LibcxxConfiguration):
|
class Configuration(LibcxxConfiguration):
|
||||||
# pylint: disable=redefined-outer-name
|
# pylint: disable=redefined-outer-name
|
||||||
def __init__(self, lit_config, config):
|
def __init__(self, lit_config, config):
|
||||||
super(Configuration, self).__init__(lit_config, config)
|
super(Configuration, self).__init__(lit_config, config)
|
||||||
|
self.libcxxabi_src_root = None
|
||||||
|
self.libcxx_src_root = None
|
||||||
|
self.obj_root = None
|
||||||
|
|
||||||
def configure_src_root(self):
|
def configure_src_root(self):
|
||||||
self.libcxxabi_src_root = self.get_lit_conf('libcxxabi_src_root',
|
self.libcxxabi_src_root = self.get_lit_conf(
|
||||||
|
'libcxxabi_src_root',
|
||||||
os.path.dirname(self.config.test_source_root))
|
os.path.dirname(self.config.test_source_root))
|
||||||
self.libcxx_src_root = self.get_lit_conf('libcxx_src_root',
|
self.libcxx_src_root = self.get_lit_conf(
|
||||||
|
'libcxx_src_root',
|
||||||
os.path.join(self.libcxxabi_src_root, '/../libcxx'))
|
os.path.join(self.libcxxabi_src_root, '/../libcxx'))
|
||||||
|
|
||||||
def configure_obj_root(self):
|
def configure_obj_root(self):
|
||||||
|
@ -32,16 +29,17 @@ class Configuration(LibcxxConfiguration):
|
||||||
super(Configuration, self).configure_compile_flags()
|
super(Configuration, self).configure_compile_flags()
|
||||||
|
|
||||||
def configure_compile_flags_header_includes(self):
|
def configure_compile_flags_header_includes(self):
|
||||||
cxx_headers = self.get_lit_conf('cxx_headers',
|
cxx_headers = self.get_lit_conf(
|
||||||
|
'cxx_headers',
|
||||||
os.path.join(self.libcxx_src_root, '/include'))
|
os.path.join(self.libcxx_src_root, '/include'))
|
||||||
if not os.path.isdir(cxx_headers):
|
if not os.path.isdir(cxx_headers):
|
||||||
self.lit_config.fatal("cxx_headers='%s' is not a directory."
|
self.lit_config.fatal("cxx_headers='%s' is not a directory."
|
||||||
% cxx_headers)
|
% cxx_headers)
|
||||||
self.cxx.compile_flags += ['-I' + cxx_headers]
|
self.cxx.compile_flags += ['-I' + cxx_headers]
|
||||||
|
|
||||||
libcxxabi_headers = self.get_lit_conf('libcxxabi_headers',
|
libcxxabi_headers = self.get_lit_conf(
|
||||||
os.path.join(self.libcxxabi_src_root,
|
'libcxxabi_headers',
|
||||||
'include'))
|
os.path.join(self.libcxxabi_src_root, 'include'))
|
||||||
if not os.path.isdir(libcxxabi_headers):
|
if not os.path.isdir(libcxxabi_headers):
|
||||||
self.lit_config.fatal("libcxxabi_headers='%s' is not a directory."
|
self.lit_config.fatal("libcxxabi_headers='%s' is not a directory."
|
||||||
% libcxxabi_headers)
|
% libcxxabi_headers)
|
||||||
|
|
|
@ -26,42 +26,32 @@ config.test_source_root = os.path.dirname(__file__)
|
||||||
# Infer the libcxx_test_source_root for configuration import.
|
# Infer the libcxx_test_source_root for configuration import.
|
||||||
# If libcxx_source_root isn't specified in the config, assume that the libcxx
|
# If libcxx_source_root isn't specified in the config, assume that the libcxx
|
||||||
# and libcxxabi source directories are sibling directories.
|
# and libcxxabi source directories are sibling directories.
|
||||||
libcxx_source_root = getattr(config, 'libcxx_source_root',
|
libcxx_src_root = getattr(config, 'libcxx_src_root', None)
|
||||||
os.path.join(config.test_source_root,
|
if not libcxx_src_root:
|
||||||
'../../libcxx'))
|
libcxx_src_root = os.path.join(config.test_source_root, '../../libcxx')
|
||||||
libcxx_test_source_root = os.path.join(libcxx_source_root, 'test')
|
libcxx_test_src_root = os.path.join(libcxx_src_root, 'test')
|
||||||
if os.path.isdir(libcxx_test_source_root):
|
if os.path.isfile(os.path.join(libcxx_test_src_root, 'libcxx', '__init__.py')):
|
||||||
sys.path.insert(0, libcxx_test_source_root)
|
site.addsitedir(libcxx_test_src_root)
|
||||||
else:
|
else:
|
||||||
lit_config.fatal('Could not find libcxx test directory for test imports'
|
lit_config.fatal('Could not find libcxx test directory for test imports'
|
||||||
' in: %s' % libcxx_test_source_root)
|
' in: %s' % libcxx_test_src_root)
|
||||||
|
|
||||||
# Infer the test_exec_root from the libcxxabi_object root.
|
# Infer the test_exec_root from the libcxx_object root.
|
||||||
libcxxabi_obj_root = getattr(config, 'libcxxabi_obj_root', None)
|
obj_root = getattr(config, 'libcxx_obj_root', None)
|
||||||
if libcxxabi_obj_root is not None:
|
|
||||||
config.test_exec_root = os.path.join(libcxxabi_obj_root, 'test')
|
|
||||||
|
|
||||||
# Check that the test exec root is known.
|
# Check that the test exec root is known.
|
||||||
if config.test_exec_root is None:
|
if obj_root is None:
|
||||||
# Otherwise, we haven't loaded the site specific configuration (the user is
|
import libcxx.test.config
|
||||||
# probably trying to run on a test file directly, and either the site
|
libcxx.test.config.loadSiteConfig(
|
||||||
# configuration hasn't been created by the build system, or we are in an
|
lit_config, config, 'libcxxabi_site_config', 'LIBCXXABI_SITE_CONFIG')
|
||||||
# out-of-tree build situation).
|
obj_root = getattr(config, 'libcxxabi_obj_root', None)
|
||||||
site_cfg = lit_config.params.get('libcxxabi_site_config',
|
if obj_root is None:
|
||||||
os.environ.get('LIBCXX_SITE_CONFIG'))
|
import tempfile
|
||||||
if not site_cfg:
|
obj_root = tempfile.mkdtemp(prefix='libcxxabi-testsuite-')
|
||||||
lit_config.warning('No site specific configuration file found!'
|
lit_config.warning('Creating temporary directory for object root: %s' %
|
||||||
' Running the tests in the default configuration.')
|
obj_root)
|
||||||
# TODO: Set test_exec_root to a temporary directory where output files
|
|
||||||
# can be placed. This is needed for ShTest.
|
config.test_exec_root = os.path.join(obj_root, 'test')
|
||||||
elif not os.path.isfile(site_cfg):
|
|
||||||
lit_config.fatal(
|
|
||||||
"Specified site configuration file does not exist: '%s'" %
|
|
||||||
site_cfg)
|
|
||||||
else:
|
|
||||||
lit_config.note('using site specific configuration at %s' % site_cfg)
|
|
||||||
lit_config.load_config(config, site_cfg)
|
|
||||||
raise SystemExit()
|
|
||||||
|
|
||||||
cfg_variant = getattr(config, 'configuration_variant', 'libcxxabi')
|
cfg_variant = getattr(config, 'configuration_variant', 'libcxxabi')
|
||||||
if cfg_variant:
|
if cfg_variant:
|
||||||
|
@ -73,4 +63,5 @@ config_module = __import__(config_module_name, fromlist=['Configuration'])
|
||||||
|
|
||||||
configuration = config_module.Configuration(lit_config, config)
|
configuration = config_module.Configuration(lit_config, config)
|
||||||
configuration.configure()
|
configuration.configure()
|
||||||
|
configuration.print_config_info()
|
||||||
config.test_format = configuration.get_test_format()
|
config.test_format = configuration.get_test_format()
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
config.cxx_under_test = "@LIBCXXABI_COMPILER@"
|
config.cxx_under_test = "@LIBCXXABI_COMPILER@"
|
||||||
config.libcxxabi_src_root = "@LIBCXXABI_SOURCE_DIR@"
|
config.libcxxabi_src_root = "@LIBCXXABI_SOURCE_DIR@"
|
||||||
config.libcxxabi_obj_root = "@LIBCXXABI_LIBRARY_DIR@"
|
config.libcxxabi_obj_root = "@LIBCXXABI_LIBRARY_DIR@"
|
||||||
|
config.libcxx_src_root = "@LIBCXXABI_LIBCXX_PATH@"
|
||||||
config.cxx_headers = "@LIBCXXABI_LIBCXX_INCLUDES@"
|
config.cxx_headers = "@LIBCXXABI_LIBCXX_INCLUDES@"
|
||||||
config.llvm_unwinder = "@LIBCXXABI_USE_LLVM_UNWINDER@"
|
config.llvm_unwinder = "@LIBCXXABI_USE_LLVM_UNWINDER@"
|
||||||
config.enable_threads = "@LIBCXXABI_ENABLE_THREADS@"
|
config.enable_threads = "@LIBCXXABI_ENABLE_THREADS@"
|
||||||
|
|
|
@ -90,9 +90,12 @@
|
||||||
|
|
||||||
<p>To do a standalone build:</p>
|
<p>To do a standalone build:</p>
|
||||||
<ul>
|
<ul>
|
||||||
|
<li>
|
||||||
|
Check out the <a href="http://libcxx.llvm.org">libcxx source</a> tree.
|
||||||
|
</li>
|
||||||
<li><code>cd libcxxabi</code></li>
|
<li><code>cd libcxxabi</code></li>
|
||||||
<li><code>mkdir build && cd build</code></li>
|
<li><code>mkdir build && cd build</code></li>
|
||||||
<li><code>cmake -DLIBCXXABI_LIBCXX_INCLUDES=path/to/libcxx/include .. # on
|
<li><code>cmake -DLIBCXXABI_LIBCXX_PATH=path/to/libcxx .. # on
|
||||||
linux you may need -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++</code></li>
|
linux you may need -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++</code></li>
|
||||||
<li><code>make</code></li>
|
<li><code>make</code></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
Loading…
Reference in New Issue