forked from OSchip/llvm-project
Make LIBCXX_ENABLE_STATIC_ABI_LIBRARY merge libc++.a and libc++abi.a
llvm-svn: 287373
This commit is contained in:
parent
5c851a5a6d
commit
bf58c8eddb
|
@ -251,6 +251,9 @@ if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
|
|||
else()
|
||||
message(WARNING "LIBCXX_ENABLE_STATIC_ABI_LIBRARY is an experimental option")
|
||||
endif()
|
||||
if (LIBCXX_ENABLE_STATIC AND NOT PYTHONINTERP_FOUND)
|
||||
message(FATAL_ERROR "LIBCXX_ENABLE_STATIC_ABI_LIBRARY requires python but it was not found.")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (LIBCXX_ENABLE_ABI_LINKER_SCRIPT)
|
||||
|
|
|
@ -193,6 +193,28 @@ if (LIBCXX_ENABLE_STATIC)
|
|||
OUTPUT_NAME "c++"
|
||||
)
|
||||
list(APPEND LIBCXX_TARGETS "cxx_static")
|
||||
# Attempt to merge the libc++.a archive and the ABI library archive into one.
|
||||
if (LIBCXX_ENABLE_STATIC_ABI_LIBRARY)
|
||||
set(MERGE_ARCHIVES_SEARCH_PATHS "")
|
||||
if (LIBCXX_CXX_ABI_LIBRARY_PATH)
|
||||
set(MERGE_ARCHIVES_SEARCH_PATHS "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}")
|
||||
endif()
|
||||
if (TARGET ${LIBCXX_CXX_ABI_LIBRARY})
|
||||
set(MERGE_ARCHIVES_ABI_TARGET "$<TARGET_LINKER_FILE:${LIBCXX_CXX_ABI_LIBRARY}>")
|
||||
else()
|
||||
set(MERGE_ARCHIVES_ABI_TARGET "lib${LIBCXX_CXX_ABI_LIBRARY}.a")
|
||||
endif()
|
||||
add_custom_command(TARGET cxx_static POST_BUILD
|
||||
COMMAND
|
||||
${PYTHON_EXECUTABLE} ${LIBCXX_SOURCE_DIR}/utils/merge_archives.py
|
||||
ARGS
|
||||
-o $<TARGET_LINKER_FILE:cxx_static>
|
||||
"$<TARGET_LINKER_FILE:cxx_static>"
|
||||
"${MERGE_ARCHIVES_ABI_TARGET}"
|
||||
"${MERGE_ARCHIVES_SEARCH_PATHS}"
|
||||
WORKING_DIRECTORY ${LIBCXX_BUILD_DIR}
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Add a meta-target for both libraries.
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#===----------------------------------------------------------------------===##
|
||||
|
||||
from argparse import ArgumentParser
|
||||
from ctypes.util import find_library
|
||||
import distutils.spawn
|
||||
import glob
|
||||
import tempfile
|
||||
|
@ -28,9 +29,18 @@ def print_and_exit(msg):
|
|||
sys.stderr.write(msg + '\n')
|
||||
exit_with_cleanups(1)
|
||||
|
||||
def diagnose_missing(file):
|
||||
if not os.path.exists(file):
|
||||
print_and_exit("input '%s' does not exist" % file)
|
||||
def find_and_diagnose_missing(lib, search_paths):
|
||||
if os.path.exists(lib):
|
||||
return os.path.abspath(lib)
|
||||
if not lib.startswith('lib') or not lib.endswith('.a'):
|
||||
print_and_exit(("input file '%s' not not name a static library. "
|
||||
"It should start with 'lib' and end with '.a") % lib)
|
||||
for sp in search_paths:
|
||||
assert type(sp) is list and len(sp) == 1
|
||||
path = os.path.join(sp[0], lib)
|
||||
if os.path.exists(path):
|
||||
return os.path.abspath(path)
|
||||
print_and_exit("input '%s' does not exist" % lib)
|
||||
|
||||
|
||||
def execute_command(cmd, cwd=None):
|
||||
|
@ -79,6 +89,10 @@ def main():
|
|||
'-o', '--output', dest='output', required=True,
|
||||
help='The output file. stdout is used if not given',
|
||||
type=str, action='store')
|
||||
parser.add_argument(
|
||||
'-L', dest='search_paths',
|
||||
help='Paths to search for the libraries along', action='append',
|
||||
nargs=1)
|
||||
parser.add_argument(
|
||||
'archives', metavar='archives', nargs='+',
|
||||
help='The archives to merge')
|
||||
|
@ -91,12 +105,9 @@ def main():
|
|||
|
||||
if len(args.archives) < 2:
|
||||
print_and_exit('fewer than 2 inputs provided')
|
||||
archives = []
|
||||
for ar in args.archives:
|
||||
diagnose_missing(ar)
|
||||
# Make the path absolute so it isn't affected when we change the PWD.
|
||||
archives += [os.path.abspath(ar)]
|
||||
|
||||
archives = [find_and_diagnose_missing(ar, args.search_paths)
|
||||
for ar in args.archives]
|
||||
print ('Merging archives: %s' % archives)
|
||||
if not os.path.exists(os.path.dirname(args.output)):
|
||||
print_and_exit("output path doesn't exist: '%s'" % args.output)
|
||||
|
||||
|
|
Loading…
Reference in New Issue