xref: /aosp_15_r20/build/soong/scripts/archive_repack.sh (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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