Index: llvm/cmake/modules/LLVMExternalProjectUtils.cmake =================================================================== --- llvm/cmake/modules/LLVMExternalProjectUtils.cmake +++ llvm/cmake/modules/LLVMExternalProjectUtils.cmake @@ -35,12 +35,14 @@ # Extra targets in the subproject to generate targets for # PASSTHROUGH_PREFIXES prefix... # Extra variable prefixes (name is always included) to pass down +# USE_STRIP path +# Use provided strip tool/script instead of the default one. # ) function(llvm_ExternalProject_Add name source_dir) cmake_parse_arguments(ARG "USE_TOOLCHAIN;EXCLUDE_FROM_ALL;NO_INSTALL;ALWAYS_CLEAN" "SOURCE_DIR" - "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES" + "CMAKE_ARGS;TOOLCHAIN_TOOLS;RUNTIME_LIBRARIES;DEPENDS;EXTRA_TARGETS;PASSTHROUGH_PREFIXES;USE_STRIP" ${ARGN}) canonicalize_tool_name(${name} nameCanon) if(NOT ARG_TOOLCHAIN_TOOLS) @@ -125,12 +127,16 @@ if(llvm-objcopy IN_LIST TOOLCHAIN_TOOLS) list(APPEND compiler_args -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy) endif() - if(llvm-strip IN_LIST TOOLCHAIN_TOOLS) + if(llvm-strip IN_LIST TOOLCHAIN_TOOLS AND NOT ARG_USE_STRIP) list(APPEND compiler_args -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip) endif() list(APPEND ARG_DEPENDS ${TOOLCHAIN_TOOLS}) endif() + if(ARG_USE_STRIP) + list(APPEND compiler_args -DCMAKE_STRIP=${ARG_USE_STRIP}) + endif() + add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${name}-clobber-stamp DEPENDS ${ARG_DEPENDS} Index: llvm/runtimes/CMakeLists.txt =================================================================== --- llvm/runtimes/CMakeLists.txt +++ llvm/runtimes/CMakeLists.txt @@ -318,6 +318,12 @@ list(APPEND runtime_names ${projName}) endforeach() + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/llvm-strip-link.in + ${CMAKE_CURRENT_BINARY_DIR}/llvm-strip-link + @ONLY + ) + function(runtime_default_target) cmake_parse_arguments(ARG "" "" "DEPENDS;PREFIXES" ${ARGN}) @@ -446,6 +452,7 @@ ${${name}_extra_args} PASSTHROUGH_PREFIXES LLVM_ENABLE_RUNTIMES TOOLCHAIN_TOOLS clang lld llvm-ar llvm-ranlib llvm-nm llvm-objcopy llvm-objdump llvm-strip + USE_STRIP ${CMAKE_CURRENT_BINARY_DIR}/llvm-strip-link EXTRA_TARGETS ${${name}_extra_targets} ${${name}_test_targets} USE_TOOLCHAIN Index: llvm/runtimes/llvm-strip-link.in =================================================================== --- /dev/null +++ llvm/runtimes/llvm-strip-link.in @@ -0,0 +1,27 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import os +import sys +import subprocess + + +ELF_MAGIC = '\x7fELF' + +with open(sys.argv[1], "rb") as f: + buf = f.read(len(ELF_MAGIC)) + if buf != ELF_MAGIC: + sys.exit(0) + +llvm_objcopy = os.path.join('@LLVM_RUNTIME_OUTPUT_INTDIR@', 'llvm-objcopy') +install_dir = os.path.join(os.getenv('DESTDIR', ''), '@CMAKE_INSTALL_PREFIX@') +link_dir = os.path.join(install_dir, 'lib', 'debug', '.build-id') + +sys.exit(subprocess.call([ + llvm_objcopy, + '--strip-sections', + '--build-id-link-dir=' + link_dir, + '--build-id-link-input=.debug', + '--build-id-link-output=', + sys.argv[1], +]))