1*333d2b36SAndroid Build Coastguard Worker#!/bin/bash -e 2*333d2b36SAndroid Build Coastguard Worker 3*333d2b36SAndroid Build Coastguard Worker# Copyright 2019 Google Inc. All rights reserved. 4*333d2b36SAndroid Build Coastguard Worker# 5*333d2b36SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*333d2b36SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*333d2b36SAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*333d2b36SAndroid Build Coastguard Worker# 9*333d2b36SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*333d2b36SAndroid Build Coastguard Worker# 11*333d2b36SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*333d2b36SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*333d2b36SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*333d2b36SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*333d2b36SAndroid Build Coastguard Worker# limitations under the License. 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Worker# Script to extract and repack an archive with specified object files. 18*333d2b36SAndroid Build Coastguard Worker# Inputs: 19*333d2b36SAndroid Build Coastguard Worker# Environment: 20*333d2b36SAndroid Build Coastguard Worker# CLANG_BIN: path to the clang bin directory 21*333d2b36SAndroid Build Coastguard Worker# Arguments: 22*333d2b36SAndroid Build Coastguard Worker# -i ${file}: input file 23*333d2b36SAndroid Build Coastguard Worker# -o ${file}: output file 24*333d2b36SAndroid Build Coastguard Worker# -d ${file}: deps file 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerset -o pipefail 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard WorkerOPTSTRING=d:i:o: 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Workerusage() { 31*333d2b36SAndroid Build Coastguard Worker cat <<EOF 32*333d2b36SAndroid Build Coastguard WorkerUsage: archive_repack.sh [options] <objects to repack> 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard WorkerOPTIONS: 35*333d2b36SAndroid Build Coastguard Worker -i <file>: input file 36*333d2b36SAndroid Build Coastguard Worker -o <file>: output file 37*333d2b36SAndroid Build Coastguard Worker -d <file>: deps file 38*333d2b36SAndroid Build Coastguard WorkerEOF 39*333d2b36SAndroid Build Coastguard Worker exit 1 40*333d2b36SAndroid Build Coastguard Worker} 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Workerwhile getopts $OPTSTRING opt; do 43*333d2b36SAndroid Build Coastguard Worker case "$opt" in 44*333d2b36SAndroid Build Coastguard Worker d) depsfile="${OPTARG}" ;; 45*333d2b36SAndroid Build Coastguard Worker i) infile="${OPTARG}" ;; 46*333d2b36SAndroid Build Coastguard Worker o) outfile="${OPTARG}" ;; 47*333d2b36SAndroid Build Coastguard Worker ?) usage ;; 48*333d2b36SAndroid Build Coastguard Worker esac 49*333d2b36SAndroid Build Coastguard Workerdone 50*333d2b36SAndroid Build Coastguard Workershift "$(($OPTIND -1))" 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Workerif [ -z "${infile}" ]; then 53*333d2b36SAndroid Build Coastguard Worker echo "-i argument is required" 54*333d2b36SAndroid Build Coastguard Worker usage 55*333d2b36SAndroid Build Coastguard Workerfi 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Workerif [ -z "${outfile}" ]; then 58*333d2b36SAndroid Build Coastguard Worker echo "-o argument is required" 59*333d2b36SAndroid Build Coastguard Worker usage 60*333d2b36SAndroid Build Coastguard Workerfi 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker# Produce deps file 63*333d2b36SAndroid Build Coastguard Workerif [ ! -z "${depsfile}" ]; then 64*333d2b36SAndroid Build Coastguard Worker cat <<EOF > "${depsfile}" 65*333d2b36SAndroid Build Coastguard Worker${outfile}: ${infile} ${CLANG_BIN}/llvm-ar 66*333d2b36SAndroid Build Coastguard WorkerEOF 67*333d2b36SAndroid Build Coastguard Workerfi 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker# Get absolute path for outfile and llvm-ar. 70*333d2b36SAndroid Build Coastguard WorkerLLVM_AR="${PWD}/${CLANG_BIN}/llvm-ar" 71*333d2b36SAndroid Build Coastguard Workerif [[ "$outfile" != /* ]]; then 72*333d2b36SAndroid Build Coastguard Worker outfile="${PWD}/${outfile}" 73*333d2b36SAndroid Build Coastguard Workerfi 74*333d2b36SAndroid Build Coastguard Worker 75*333d2b36SAndroid Build Coastguard Workertempdir="${outfile}.tmp" 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Worker# Clean up any previous temporary files. 78*333d2b36SAndroid Build Coastguard Workerrm -f "${outfile}" 79*333d2b36SAndroid Build Coastguard Workerrm -rf "${tempdir}" 80*333d2b36SAndroid Build Coastguard Worker 81*333d2b36SAndroid Build Coastguard Worker# Do repack 82*333d2b36SAndroid Build Coastguard Worker# We have to change working directory since ar only allows extracting to CWD. 83*333d2b36SAndroid Build Coastguard Workermkdir "${tempdir}" 84*333d2b36SAndroid Build Coastguard Workercp "${infile}" "${tempdir}/archive" 85*333d2b36SAndroid Build Coastguard Workercd "${tempdir}" 86*333d2b36SAndroid Build Coastguard Worker"${LLVM_AR}" x "archive" 87*333d2b36SAndroid Build Coastguard Worker"${LLVM_AR}" --format=gnu qc "${outfile}" "$@" 88