[cmake/multilib] Teach libc++abi's CMake build to support multilib

libdir suffixes like 'lib64' or 'lib32'.

This support is currently very rhudimentary. We define a variable
LIBCXXABI_LIBDIR_SUFFIX. In a standalone build of libc++abi this can be
directly set as a cached variable to control the multilib suffix used.
When building libc++abi within a larger LLVM build, it is hard wired to
whatever LLVM libdir suffix has been selected. If this doesn't work for
someone, just let me know. I'm happy to change it.

Unfortunately, libc++abi's lit setup made this somewhat problematic to
change. It was setting variables up in a way that caused the resulting
build to not work with lit at all. To fix that, I've moved some
variables around in the CMake build to more closely match where and how
they are defined in the libc++ CMake build. This includes specifically
defining a library root variable in the CMake build where the libdir
suffix can be applied, and then using that rather than re-computing it
from the object directory in the lit config.

This is essentially new functionality for libc++abi so I don't expect it
to have any impact for folks until they start setting these variables.
However, I know libc++abi is built in a diverse set of environments so
just let me know if this causes you any problems.

llvm-svn: 224927
This commit is contained in:
Chandler Carruth 2014-12-29 12:22:04 +00:00
parent 64be05a873
commit 24a6b05680
5 changed files with 30 additions and 24 deletions

View File

@ -89,12 +89,16 @@ if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
set(LLVM_INCLUDE_TESTS OFF)
endif()
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(LIBCXXABI_LIBDIR_SUFFIX "" CACHE STRING
"Define suffix of library directory name (32/64)")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
set(LIBCXXABI_BUILT_STANDALONE 1)
else()
set(LLVM_LIT "${CMAKE_SOURCE_DIR}/utils/lit/lit.py")
set(LIBCXXABI_LIBDIR_SUFFIX ${LLVM_LIBDIR_SUFFIX})
endif()
#===============================================================================
@ -142,6 +146,11 @@ set(CMAKE_MODULE_PATH
# Configure compiler.
include(config-ix)
set(LIBCXXABI_COMPILER ${CMAKE_CXX_COMPILER})
set(LIBCXXABI_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
set(LIBCXXABI_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
set(LIBCXXABI_LIBRARY_DIR ${CMAKE_BINARY_DIR}/lib${LIBCXXABI_LIBDIR_SUFFIX})
#===============================================================================
# Setup Compiler Flags
#===============================================================================

View File

@ -99,6 +99,6 @@ set_target_properties(cxxabi
)
install(TARGETS cxxabi
LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX}
ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX}
LIBRARY DESTINATION lib${LIBCXXABI_LIBDIR_SUFFIX}
ARCHIVE DESTINATION lib${LIBCXXABI_LIBDIR_SUFFIX}
)

View File

@ -6,9 +6,6 @@ macro(pythonize_bool var)
endif()
endmacro()
set(LIBCXXABI_COMPILER ${CMAKE_CXX_COMPILER})
set(LIBCXXABI_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/..)
set(LIBCXXABI_BINARY_DIR ${CMAKE_BINARY_DIR})
pythonize_bool(LIBCXXABI_ENABLE_SHARED)
pythonize_bool(LIBCXXABI_ENABLE_THREADS)
pythonize_bool(LIBCXXABI_USE_LLVM_UNWINDER)

View File

@ -163,11 +163,11 @@ if libcxxabi_src_root is None:
if libcxxabi_src_root is None:
libcxxabi_src_root = os.path.dirname(config.test_source_root)
libcxxabi_obj_root = lit_config.params.get('libcxxabi_obj_root', None)
if libcxxabi_obj_root is None:
libcxxabi_obj_root = getattr(config, 'libcxxabi_obj_root', None)
if libcxxabi_obj_root is None:
libcxxabi_obj_root = libcxxabi_src_root
libcxxabi_library_root = lit_config.params.get('libcxxabi_library_root', None)
if libcxxabi_library_root is None:
libcxxabi_library_root = getattr(config, 'libcxxabi_library_root', None)
if libcxxabi_library_root is None:
lit_config.fatal("libcxxabi_library_root must be defined")
libcxx_includes = lit_config.params.get('libcxx_includes', None)
if libcxx_includes is None:
@ -195,7 +195,7 @@ if llvm_unwinder is None:
# Compiler parameters
include_paths = ['-I' + libcxxabi_src_root + '/include',
'-I' + libcxx_includes]
library_paths = ['-L' + libcxxabi_obj_root + '/lib']
library_paths = ['-L' + libcxxabi_library_root]
compile_flags = ['-std=c++11']
link_flags = []
exec_env = {}
@ -277,9 +277,9 @@ if san:
# Configure extra linker parameters.
if sys.platform == 'darwin':
exec_env['DYLD_LIBRARY_PATH'] = os.path.join(libcxxabi_obj_root, 'lib')
exec_env['DYLD_LIBRARY_PATH'] = os.path.join(libcxxabi_library_root)
elif sys.platform.startswith('linux'):
link_flags += ['-Wl,-R', libcxxabi_obj_root + '/lib']
link_flags += ['-Wl,-R', libcxxabi_library_root]
else:
lit_config.fatal("unrecognized system")

View File

@ -1,13 +1,13 @@
@AUTO_GEN_COMMENT@
config.cxx_under_test = "@LIBCXXABI_COMPILER@"
config.libcxxabi_src_root = "@LIBCXXABI_SOURCE_DIR@"
config.libcxxabi_obj_root = "@LIBCXXABI_BINARY_DIR@"
config.python_executable = "@PYTHON_EXECUTABLE@"
config.enable_shared = @LIBCXXABI_ENABLE_SHARED@
config.libcxx_includes = "@LIBCXXABI_LIBCXX_INCLUDES@"
config.llvm_unwinder = @LIBCXXABI_USE_LLVM_UNWINDER@
config.enable_threads = @LIBCXXABI_ENABLE_THREADS@
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
config.cxx_under_test = "@LIBCXXABI_COMPILER@"
config.libcxxabi_src_root = "@LIBCXXABI_SOURCE_DIR@"
config.libcxxabi_library_root = "@LIBCXXABI_LIBRARY_DIR@"
config.python_executable = "@PYTHON_EXECUTABLE@"
config.enable_shared = @LIBCXXABI_ENABLE_SHARED@
config.libcxx_includes = "@LIBCXXABI_LIBCXX_INCLUDES@"
config.llvm_unwinder = @LIBCXXABI_USE_LLVM_UNWINDER@
config.enable_threads = @LIBCXXABI_ENABLE_THREADS@
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
# Let the main config do the real work.
lit_config.load_config(config, "@LIBCXXABI_SOURCE_DIR@/test/lit.cfg")