|  | #!/bin/bash -e | 
|  |  | 
|  | # Copyright 2019 Google Inc. All rights reserved. | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  |  | 
|  | # Script to extract and repack an archive with specified object files. | 
|  | # Inputs: | 
|  | #  Environment: | 
|  | #   CLANG_BIN: path to the clang bin directory | 
|  | #  Arguments: | 
|  | #   -i ${file}: input file | 
|  | #   -o ${file}: output file | 
|  | #   -d ${file}: deps file | 
|  |  | 
|  | set -o pipefail | 
|  |  | 
|  | OPTSTRING=d:i:o: | 
|  |  | 
|  | usage() { | 
|  | cat <<EOF | 
|  | Usage: archive_repack.sh [options] <objects to repack> | 
|  |  | 
|  | OPTIONS: | 
|  | -i <file>: input file | 
|  | -o <file>: output file | 
|  | -d <file>: deps file | 
|  | EOF | 
|  | exit 1 | 
|  | } | 
|  |  | 
|  | while getopts $OPTSTRING opt; do | 
|  | case "$opt" in | 
|  | d) depsfile="${OPTARG}" ;; | 
|  | i) infile="${OPTARG}" ;; | 
|  | o) outfile="${OPTARG}" ;; | 
|  | ?) usage ;; | 
|  | esac | 
|  | done | 
|  | shift "$(($OPTIND -1))" | 
|  |  | 
|  | if [ -z "${infile}" ]; then | 
|  | echo "-i argument is required" | 
|  | usage | 
|  | fi | 
|  |  | 
|  | if [ -z "${outfile}" ]; then | 
|  | echo "-o argument is required" | 
|  | usage | 
|  | fi | 
|  |  | 
|  | # Produce deps file | 
|  | if [ ! -z "${depsfile}" ]; then | 
|  | cat <<EOF > "${depsfile}" | 
|  | ${outfile}: ${infile} ${CLANG_BIN}/llvm-ar | 
|  | EOF | 
|  | fi | 
|  |  | 
|  | # Get absolute path for outfile and llvm-ar. | 
|  | LLVM_AR="${PWD}/${CLANG_BIN}/llvm-ar" | 
|  | if [[ "$outfile" != /* ]]; then | 
|  | outfile="${PWD}/${outfile}" | 
|  | fi | 
|  |  | 
|  | tempdir="${outfile}.tmp" | 
|  |  | 
|  | # Clean up any previous temporary files. | 
|  | rm -f "${outfile}" | 
|  | rm -rf "${tempdir}" | 
|  |  | 
|  | # Do repack | 
|  | # We have to change working directory since ar only allows extracting to CWD. | 
|  | mkdir "${tempdir}" | 
|  | cp "${infile}" "${tempdir}/archive" | 
|  | cd "${tempdir}" | 
|  | "${LLVM_AR}" x "archive" | 
|  | "${LLVM_AR}" --format=gnu qc "${outfile}" "$@" |