From 24a6b05680c2f428272350ae63918f119069636c Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Mon, 29 Dec 2014 12:22:04 +0000 Subject: [PATCH] [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 --- libcxxabi/CMakeLists.txt | 13 +++++++++++-- libcxxabi/src/CMakeLists.txt | 4 ++-- libcxxabi/test/CMakeLists.txt | 3 --- libcxxabi/test/lit.cfg | 16 ++++++++-------- libcxxabi/test/lit.site.cfg.in | 18 +++++++++--------- 5 files changed, 30 insertions(+), 24 deletions(-) diff --git a/libcxxabi/CMakeLists.txt b/libcxxabi/CMakeLists.txt index c3262652704a..667c5197df6d 100644 --- a/libcxxabi/CMakeLists.txt +++ b/libcxxabi/CMakeLists.txt @@ -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 #=============================================================================== diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt index a623a492d01e..5c9e38b0c780 100644 --- a/libcxxabi/src/CMakeLists.txt +++ b/libcxxabi/src/CMakeLists.txt @@ -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} ) diff --git a/libcxxabi/test/CMakeLists.txt b/libcxxabi/test/CMakeLists.txt index 57468dcc8490..7e833e146647 100644 --- a/libcxxabi/test/CMakeLists.txt +++ b/libcxxabi/test/CMakeLists.txt @@ -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) diff --git a/libcxxabi/test/lit.cfg b/libcxxabi/test/lit.cfg index 1b67817e3e16..9b70e292765c 100644 --- a/libcxxabi/test/lit.cfg +++ b/libcxxabi/test/lit.cfg @@ -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") diff --git a/libcxxabi/test/lit.site.cfg.in b/libcxxabi/test/lit.site.cfg.in index 9753e1d91235..56ebd27feae4 100644 --- a/libcxxabi/test/lit.site.cfg.in +++ b/libcxxabi/test/lit.site.cfg.in @@ -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")