summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2019-06-02 01:14:31 +0000
committerPetr Hosek <phosek@chromium.org>2019-06-02 01:14:31 +0000
commit737de4d363ede4b90dd5609af0494fb39af53865 (patch)
tree6287ff3064181d33b26508765285564b90f1e4fb
parentfe699c32a2081bde203e99593ed906fce651b3dd (diff)
downloadbcm5719-llvm-737de4d363ede4b90dd5609af0494fb39af53865.tar.gz
bcm5719-llvm-737de4d363ede4b90dd5609af0494fb39af53865.zip
[libcxx] Use libtool when merging archives on Apple platforms
ar doesn't produce the correct results when used for linking static archives on Apple platforms, so instead use libtool -static which is the official way to build static archives on those platforms. Differential Revision: https://reviews.llvm.org/D62770 llvm-svn: 362311
-rw-r--r--libcxx/src/CMakeLists.txt4
-rwxr-xr-xlibcxx/utils/merge_archives.py22
-rw-r--r--libcxxabi/src/CMakeLists.txt5
3 files changed, 29 insertions, 2 deletions
diff --git a/libcxx/src/CMakeLists.txt b/libcxx/src/CMakeLists.txt
index 4fe4db47d2a..2a8ff2c2d89 100644
--- a/libcxx/src/CMakeLists.txt
+++ b/libcxx/src/CMakeLists.txt
@@ -375,12 +375,16 @@ if (LIBCXX_ENABLE_STATIC)
set(MERGE_ARCHIVES_ABI_TARGET
"${CMAKE_STATIC_LIBRARY_PREFIX}${LIBCXX_CXX_STATIC_ABI_LIBRARY}${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif()
+ if (APPLE)
+ set(MERGE_ARCHIVES_LIBTOOL "--use-libtool" "--libtool" "${CMAKE_LIBTOOL}")
+ 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>
--ar "${CMAKE_AR}"
+ ${MERGE_ARCHIVES_LIBTOOL}
"$<TARGET_LINKER_FILE:cxx_static>"
"${MERGE_ARCHIVES_ABI_TARGET}"
"${MERGE_ARCHIVES_SEARCH_PATHS}"
diff --git a/libcxx/utils/merge_archives.py b/libcxx/utils/merge_archives.py
index 75d7a54e47d..5c04bc915a4 100755
--- a/libcxx/utils/merge_archives.py
+++ b/libcxx/utils/merge_archives.py
@@ -98,6 +98,12 @@ def main():
help='The ar executable to use, finds \'ar\' in the path if not given',
type=str, action='store')
parser.add_argument(
+ '--use-libtool', dest='use_libtool', action='store_true', default=False)
+ parser.add_argument(
+ '--libtool', dest='libtool_exe', required=False,
+ help='The libtool executable to use, finds \'libtool\' in the path if not given',
+ type=str, action='store')
+ parser.add_argument(
'archives', metavar='archives', nargs='+',
help='The archives to merge')
@@ -109,6 +115,13 @@ def main():
if not ar_exe:
print_and_exit("failed to find 'ar' executable")
+ if args.use_libtool:
+ libtool_exe = args.libtool_exe
+ if not libtool_exe:
+ libtool_exe = distutils.spawn.find_executable('libtool')
+ if not libtool_exe:
+ print_and_exit("failed to find 'libtool' executable")
+
if len(args.archives) < 2:
print_and_exit('fewer than 2 inputs provided')
archives = [find_and_diagnose_missing(ar, args.search_paths)
@@ -127,8 +140,13 @@ def main():
out = execute_command_verbose([ar_exe, 't', arc])
files.extend(out.splitlines())
- execute_command_verbose([ar_exe, 'rcs', args.output] + files,
- cwd=temp_directory_root, verbose=args.verbose)
+ if args.use_libtool:
+ files = [f for f in files if not f.startswith('__.SYMDEF')]
+ execute_command_verbose([libtool_exe, '-static', '-o', args.output] + files,
+ cwd=temp_directory_root, verbose=args.verbose)
+ else:
+ execute_command_verbose([ar_exe, 'rcs', args.output] + files,
+ cwd=temp_directory_root, verbose=args.verbose)
if __name__ == '__main__':
diff --git a/libcxxabi/src/CMakeLists.txt b/libcxxabi/src/CMakeLists.txt
index e4e1fac34bb..77f00987097 100644
--- a/libcxxabi/src/CMakeLists.txt
+++ b/libcxxabi/src/CMakeLists.txt
@@ -226,6 +226,10 @@ if (LIBCXXABI_ENABLE_STATIC)
list(APPEND LIBCXXABI_INSTALL_TARGETS "cxxabi_static")
endif()
+ if (APPLE)
+ set(MERGE_ARCHIVES_LIBTOOL "--use-libtool" "--libtool" "${CMAKE_LIBTOOL}")
+ endif()
+
# Merge the the libc++abi.a and libunwind.a into one.
if(LIBCXXABI_USE_LLVM_UNWINDER AND LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY)
add_custom_command(TARGET cxxabi_static POST_BUILD
@@ -233,6 +237,7 @@ if (LIBCXXABI_ENABLE_STATIC)
ARGS
-o "$<TARGET_LINKER_FILE:cxxabi_static>"
--ar "${CMAKE_AR}"
+ ${MERGE_ARCHIVES_LIBTOOL}
"$<TARGET_LINKER_FILE:cxxabi_static>"
"$<TARGET_LINKER_FILE:unwind_static>"
WORKING_DIRECTORY ${LIBCXXABI_BUILD_DIR}
OpenPOWER on IntegriCloud