[libcxx] Redo adding support for building and testing with an ABI library not along linker paths
Summary: This is the second attempt at allowing for the use of libraries that the linker cannot find. The first attempt used `CMAKE_LIBRARY_PATH` and `find_library` to select which ABI library should be used. There were a number of problems with this approach: - `find_library` didn't work with cmake targets (ie in-tree libcxxabi build) - It wasn't always possible to determine where `find_library` actually found your library. - `target_link_libraries` inserted the path of the ABI library into libc++'s RPATH when `find_library` was used. - Linking libc++ and it's ABI library is a special case. It's a lot easier to keep it simple. After discussion with @cbergstrum a new approach was decided upon. This patch achieve the same ends by simply using `LIBCXX_CXX_ABI_LIBRARY_PATH` to specify where to find the library (if the linker won't find it). When this variable is defined it is simply added as a library search path when linking libc++. It is a lot easier to duplicate this behavior in LIT. It also prevents libc++ from being linked with an RPATH. Reviewers: mclow.lists, cbergstrom, chandlerc, danalbert Reviewed By: chandlerc, danalbert Subscribers: chandlerc, cfe-commits Differential Revision: http://reviews.llvm.org/D5860 git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@220157 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f4c53dacaf
commit
cb7e32c290
@ -8,41 +8,21 @@
|
|||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# abidefines: A list of defines needed to compile libc++ with the ABI library
|
# abidefines: A list of defines needed to compile libc++ with the ABI library
|
||||||
# abilibs : A list of libraries to link against
|
# abilib : The ABI library to link against.
|
||||||
# abifiles : A list of files (which may be relative paths) to copy into the
|
# abifiles : A list of files (which may be relative paths) to copy into the
|
||||||
# libc++ build tree for the build. These files will also be
|
# libc++ build tree for the build. These files will also be
|
||||||
# installed alongside the libc++ headers.
|
# installed alongside the libc++ headers.
|
||||||
# abidirs : A list of relative paths to create under an include directory
|
# abidirs : A list of relative paths to create under an include directory
|
||||||
# in the libc++ build directory.
|
# in the libc++ build directory.
|
||||||
#
|
#
|
||||||
macro(setup_abi_lib abipathvar abidefines abilibs abifiles abidirs)
|
macro(setup_abi_lib abipathvar abidefines abilib abifiles abidirs)
|
||||||
list(APPEND LIBCXX_CXX_FEATURE_FLAGS ${abidefines})
|
list(APPEND LIBCXX_CXX_FEATURE_FLAGS ${abidefines})
|
||||||
set(${abipathvar} "${${abipathvar}}"
|
set(${abipathvar} "${${abipathvar}}"
|
||||||
CACHE PATH
|
CACHE PATH
|
||||||
"Paths to C++ ABI header directories separated by ';'." FORCE
|
"Paths to C++ ABI header directories separated by ';'." FORCE
|
||||||
)
|
)
|
||||||
|
|
||||||
# To allow for libraries installed along non-default paths we use find_library
|
set(LIBCXX_CXX_ABI_LIBRARY ${abilib})
|
||||||
# to locate the ABI libraries we want. Making sure to clean the cache before
|
|
||||||
# each run of find_library.
|
|
||||||
set(LIBCXX_CXX_ABI_LIBRARIES "")
|
|
||||||
foreach(alib ${abilibs})
|
|
||||||
# cxxabi is a cmake target and not a library.
|
|
||||||
# Handle this special case explicitly.
|
|
||||||
# Otherwise use find_library to locate the correct binary.
|
|
||||||
if (alib STREQUAL "cxxabi")
|
|
||||||
list(APPEND LIBCXX_CXX_ABI_LIBRARIES cxxabi)
|
|
||||||
else()
|
|
||||||
unset(_Res CACHE)
|
|
||||||
find_library(_Res ${alib})
|
|
||||||
if (${_Res} STREQUAL "_Res-NOTFOUND")
|
|
||||||
message(FATAL_ERROR "Failed to find ABI library: ${alib}")
|
|
||||||
else()
|
|
||||||
message(STATUS "Adding ABI library: ${_Res}")
|
|
||||||
list(APPEND LIBCXX_CXX_ABI_LIBRARIES ${_Res})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(LIBCXX_ABILIB_FILES ${abifiles})
|
set(LIBCXX_ABILIB_FILES ${abifiles})
|
||||||
|
|
||||||
|
@ -36,13 +36,17 @@ if (DEFINED LIBCXX_CXX_ABI_DEPS)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Generate library list.
|
# Generate library list.
|
||||||
set(libraries ${LIBCXX_CXX_ABI_LIBRARIES})
|
set(libraries ${LIBCXX_CXX_ABI_LIBRARY})
|
||||||
append_if(libraries LIBCXX_HAS_PTHREAD_LIB pthread)
|
append_if(libraries LIBCXX_HAS_PTHREAD_LIB pthread)
|
||||||
append_if(libraries LIBCXX_HAS_C_LIB c)
|
append_if(libraries LIBCXX_HAS_C_LIB c)
|
||||||
append_if(libraries LIBCXX_HAS_M_LIB m)
|
append_if(libraries LIBCXX_HAS_M_LIB m)
|
||||||
append_if(libraries LIBCXX_HAS_RT_LIB rt)
|
append_if(libraries LIBCXX_HAS_RT_LIB rt)
|
||||||
append_if(libraries LIBCXX_HAS_GCC_S_LIB gcc_s)
|
append_if(libraries LIBCXX_HAS_GCC_S_LIB gcc_s)
|
||||||
|
|
||||||
|
#if LIBCXX_CXX_ABI_LIBRARY_PATH is defined we want to add it to the search path.
|
||||||
|
if (DEFINED LIBCXX_CXX_ABI_LIBRARY_PATH)
|
||||||
|
target_link_libraries(cxx "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}")
|
||||||
|
endif()
|
||||||
target_link_libraries(cxx ${libraries})
|
target_link_libraries(cxx ${libraries})
|
||||||
|
|
||||||
# Setup flags.
|
# Setup flags.
|
||||||
|
14
test/lit.cfg
14
test/lit.cfg
@ -374,10 +374,13 @@ class Configuration(object):
|
|||||||
|
|
||||||
def configure_link_flags(self):
|
def configure_link_flags(self):
|
||||||
# Configure library search paths
|
# Configure library search paths
|
||||||
lpaths = self.get_lit_conf('library_paths', '').split(';')
|
abi_library_path = self.get_lit_conf('abi_library_path', '')
|
||||||
lpaths = [l for l in lpaths if l.strip()]
|
|
||||||
self.link_flags += ['-L' + self.obj_root + '/lib']
|
self.link_flags += ['-L' + self.obj_root + '/lib']
|
||||||
self.link_flags += ['-L' + l for l in lpaths]
|
if not self.use_system_lib:
|
||||||
|
self.link_flags += ['-Wl,-rpath', '-Wl,' + self.obj_root + '/lib']
|
||||||
|
if abi_library_path:
|
||||||
|
self.link_flags += ['-L' + abi_library_path,
|
||||||
|
'-Wl,-rpath', '-Wl,' + abi_library_path]
|
||||||
# Configure libraries
|
# Configure libraries
|
||||||
self.link_flags += ['-lc++']
|
self.link_flags += ['-lc++']
|
||||||
link_flags_str = self.get_lit_conf('link_flags')
|
link_flags_str = self.get_lit_conf('link_flags')
|
||||||
@ -412,11 +415,6 @@ class Configuration(object):
|
|||||||
if link_flags_str:
|
if link_flags_str:
|
||||||
self.link_flags += shlex.split(link_flags_str)
|
self.link_flags += shlex.split(link_flags_str)
|
||||||
|
|
||||||
# Configure library runtime search paths
|
|
||||||
if not self.use_system_lib:
|
|
||||||
self.link_flags += ['-Wl,-rpath', '-Wl,' + self.obj_root + '/lib']
|
|
||||||
for l in lpaths:
|
|
||||||
self.link_flags += ['-Wl,-rpath', '-Wl,' + l]
|
|
||||||
|
|
||||||
def configure_std_flag(self):
|
def configure_std_flag(self):
|
||||||
# Try and get the std version from the command line. Fall back to
|
# Try and get the std version from the command line. Fall back to
|
||||||
|
@ -7,7 +7,7 @@ config.python_executable = "@PYTHON_EXECUTABLE@"
|
|||||||
config.enable_shared = @LIBCXX_ENABLE_SHARED@
|
config.enable_shared = @LIBCXX_ENABLE_SHARED@
|
||||||
config.cxx_abi = "@LIBCXX_CXX_ABI_LIBNAME@"
|
config.cxx_abi = "@LIBCXX_CXX_ABI_LIBNAME@"
|
||||||
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
|
config.llvm_use_sanitizer = "@LLVM_USE_SANITIZER@"
|
||||||
config.library_paths = "@CMAKE_LIBRARY_PATH@"
|
config.abi_library_path = "@LIBCXX_CXX_ABI_LIBRARY_PATH@"
|
||||||
|
|
||||||
# Let the main config do the real work.
|
# Let the main config do the real work.
|
||||||
lit_config.load_config(config, "@LIBCXX_SOURCE_DIR@/test/lit.cfg")
|
lit_config.load_config(config, "@LIBCXX_SOURCE_DIR@/test/lit.cfg")
|
||||||
|
@ -448,7 +448,8 @@ End of search list.
|
|||||||
Normally you must link libc++ against a ABI shared library that the
|
Normally you must link libc++ against a ABI shared library that the
|
||||||
linker can find. If you want to build and test libc++ against an ABI
|
linker can find. If you want to build and test libc++ against an ABI
|
||||||
library not in the linker's path you need to set
|
library not in the linker's path you need to set
|
||||||
<code>-DCMAKE_LIBRARY_PATH=/path/to/abi/lib</code> when configuring CMake.
|
<code>-DLIBCXX_CXX_ABI_LIBRARY_PATH=/path/to/abi/lib</code> when
|
||||||
|
configuring CMake.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
An example build using libc++abi would look like:
|
An example build using libc++abi would look like:
|
||||||
@ -456,7 +457,7 @@ End of search list.
|
|||||||
<li><code>CC=clang CXX=clang++ cmake
|
<li><code>CC=clang CXX=clang++ cmake
|
||||||
-DLIBCXX_CXX_ABI=libc++abi
|
-DLIBCXX_CXX_ABI=libc++abi
|
||||||
-DLIBCXX_LIBCXXABI_INCLUDE_PATHS="/path/to/libcxxabi/include"
|
-DLIBCXX_LIBCXXABI_INCLUDE_PATHS="/path/to/libcxxabi/include"
|
||||||
-DCMAKE_LIBRARY_PATH="/path/to/libcxxabi-build/lib"
|
-DLIBCXX_CXX_ABI_LIBRARY_PATH="/path/to/libcxxabi-build/lib"
|
||||||
path/to/libcxx</code></li>
|
path/to/libcxx</code></li>
|
||||||
<li><code>make</code></li>
|
<li><code>make</code></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user