xref: /aosp_15_r20/tools/external_updater/regen_bp.sh (revision 3c875a214f382db1236d28570d1304ce57138f32)
1*3c875a21SAndroid Build Coastguard Worker#!/bin/bash
2*3c875a21SAndroid Build Coastguard Worker#
3*3c875a21SAndroid Build Coastguard Worker# Copyright (C) 2020 The Android Open Source Project
4*3c875a21SAndroid Build Coastguard Worker#
5*3c875a21SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*3c875a21SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*3c875a21SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*3c875a21SAndroid Build Coastguard Worker#
9*3c875a21SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
10*3c875a21SAndroid Build Coastguard Worker#
11*3c875a21SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*3c875a21SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*3c875a21SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*3c875a21SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*3c875a21SAndroid Build Coastguard Worker# limitations under the License.
16*3c875a21SAndroid Build Coastguard Worker
17*3c875a21SAndroid Build Coastguard Worker# This script is used by external_updater to replace a package.
18*3c875a21SAndroid Build Coastguard Worker# It can also be invoked directly.  It is used in two ways:
19*3c875a21SAndroid Build Coastguard Worker# (1) in a .../external/* rust directory with .bp and Cargo.toml;
20*3c875a21SAndroid Build Coastguard Worker#     cargo_embargo must be in PATH
21*3c875a21SAndroid Build Coastguard Worker# (2) in a tmp new directory with .bp and Cargo.toml,
22*3c875a21SAndroid Build Coastguard Worker#     and $1 equals to the rust Android source tree root,
23*3c875a21SAndroid Build Coastguard Worker#     and $2 equals to the rust sub-directory path name under external.
24*3c875a21SAndroid Build Coastguard Worker
25*3c875a21SAndroid Build Coastguard Workerset -e
26*3c875a21SAndroid Build Coastguard Worker
27*3c875a21SAndroid Build Coastguard Worker# Wrapper around cargo2android.
28*3c875a21SAndroid Build Coastguard WorkerSANDBOX="/google/bin/releases/android-rust/cargo2android/sandbox.par"
29*3c875a21SAndroid Build Coastguard WorkerSANDBOX_FLAGS="--updater"
30*3c875a21SAndroid Build Coastguard WorkerSANDBOX_RULESMK_FLAGS="--rulesmk"
31*3c875a21SAndroid Build Coastguard Worker
32*3c875a21SAndroid Build Coastguard Workerfunction main() {
33*3c875a21SAndroid Build Coastguard Worker  check_files $*
34*3c875a21SAndroid Build Coastguard Worker  update_files_with_cargo_pkg_vars
35*3c875a21SAndroid Build Coastguard Worker  # Save Cargo.lock if it existed before this update.
36*3c875a21SAndroid Build Coastguard Worker  [ ! -f Cargo.lock ] || mv Cargo.lock Cargo.lock.saved
37*3c875a21SAndroid Build Coastguard Worker  if [[ "$CARGO_EMBARGO" = 'true' ]]; then
38*3c875a21SAndroid Build Coastguard Worker    echo "Updating Android.bp or rules.mk: cargo_embargo generate cargo_embargo.json"
39*3c875a21SAndroid Build Coastguard Worker    cargo_embargo generate cargo_embargo.json
40*3c875a21SAndroid Build Coastguard Worker  fi
41*3c875a21SAndroid Build Coastguard Worker  if [[ "$C2R" = 'true' ]]; then
42*3c875a21SAndroid Build Coastguard Worker    echo "Updating rules.mk: cargo2rulesmk.py $C2R_SCRIPT_FLAGS"
43*3c875a21SAndroid Build Coastguard Worker    cargo2rulesmk.py $C2R_SCRIPT_FLAGS
44*3c875a21SAndroid Build Coastguard Worker  fi
45*3c875a21SAndroid Build Coastguard Worker  copy_cargo_out_files $*
46*3c875a21SAndroid Build Coastguard Worker  rm -rf target.tmp cargo.metadata cargo.out Cargo.lock
47*3c875a21SAndroid Build Coastguard Worker  # Restore Cargo.lock if it existed before this update.
48*3c875a21SAndroid Build Coastguard Worker  [ ! -f Cargo.lock.saved ] || mv Cargo.lock.saved Cargo.lock
49*3c875a21SAndroid Build Coastguard Worker}
50*3c875a21SAndroid Build Coastguard Worker
51*3c875a21SAndroid Build Coastguard Workerfunction abort() {
52*3c875a21SAndroid Build Coastguard Worker  echo "$1" >&2
53*3c875a21SAndroid Build Coastguard Worker  exit 1
54*3c875a21SAndroid Build Coastguard Worker}
55*3c875a21SAndroid Build Coastguard Worker
56*3c875a21SAndroid Build Coastguard Workerfunction check_files() {
57*3c875a21SAndroid Build Coastguard Worker  if [ "$1" == "" ]; then
58*3c875a21SAndroid Build Coastguard Worker    EXTERNAL_DIR=`pwd`
59*3c875a21SAndroid Build Coastguard Worker  else
60*3c875a21SAndroid Build Coastguard Worker    EXTERNAL_DIR="$2"  # e.g. rust/crates/bytes
61*3c875a21SAndroid Build Coastguard Worker  fi
62*3c875a21SAndroid Build Coastguard Worker  [ -f "$SANDBOX" ] || abort "ERROR: cannot find $SANDBOX"
63*3c875a21SAndroid Build Coastguard Worker  if [ -f Android.bp ]; then
64*3c875a21SAndroid Build Coastguard Worker    LINE1=`head -1 Android.bp`
65*3c875a21SAndroid Build Coastguard Worker    if [[ "$LINE1" =~ ^.*cargo_embargo.*$ ]]; then
66*3c875a21SAndroid Build Coastguard Worker      CARGO_EMBARGO='true'
67*3c875a21SAndroid Build Coastguard Worker    fi
68*3c875a21SAndroid Build Coastguard Worker  fi
69*3c875a21SAndroid Build Coastguard Worker  [ -f Cargo.toml ] || abort "ERROR: cannot find ./Cargo.toml."
70*3c875a21SAndroid Build Coastguard Worker
71*3c875a21SAndroid Build Coastguard Worker  if [ -f rules.mk ]; then
72*3c875a21SAndroid Build Coastguard Worker    LINE1=`head -1 rules.mk`
73*3c875a21SAndroid Build Coastguard Worker    if [[ "$LINE1" =~ ^.*cargo_embargo.*$ ]]; then
74*3c875a21SAndroid Build Coastguard Worker      CARGO_EMBARGO='true'
75*3c875a21SAndroid Build Coastguard Worker    elif [[ "$LINE1" =~ ^.*cargo2rulesmk.py.*$ ]]; then
76*3c875a21SAndroid Build Coastguard Worker      C2R='true'
77*3c875a21SAndroid Build Coastguard Worker      C2R_SCRIPT_FLAGS=`echo "$LINE1" | sed -e 's:^.*cargo2rulesmk.py ::;s:\.$::'`
78*3c875a21SAndroid Build Coastguard Worker    fi
79*3c875a21SAndroid Build Coastguard Worker  fi
80*3c875a21SAndroid Build Coastguard Worker
81*3c875a21SAndroid Build Coastguard Worker  if [ ! "$CARGO_EMBARGO" = 'true' ] && [ ! "$C2R" = 'true']; then
82*3c875a21SAndroid Build Coastguard Worker    echo 'No need to run cargo_embargo or cargo2rules.mk.py; skip regen_bp'
83*3c875a21SAndroid Build Coastguard Worker    exit 0
84*3c875a21SAndroid Build Coastguard Worker  fi
85*3c875a21SAndroid Build Coastguard Worker}
86*3c875a21SAndroid Build Coastguard Worker
87*3c875a21SAndroid Build Coastguard Workerfunction copy_cargo_out_files() {
88*3c875a21SAndroid Build Coastguard Worker  if [ -d $2/out ]; then
89*3c875a21SAndroid Build Coastguard Worker    # copy files generated by cargo build to out directory
90*3c875a21SAndroid Build Coastguard Worker    PKGNAME=`basename $2`
91*3c875a21SAndroid Build Coastguard Worker    for f in $2/out/*
92*3c875a21SAndroid Build Coastguard Worker    do
93*3c875a21SAndroid Build Coastguard Worker      OUTF=`basename $f`
94*3c875a21SAndroid Build Coastguard Worker      SRC=`ls ./target.tmp/*/debug/build/$PKGNAME-*/out/$OUTF ||
95*3c875a21SAndroid Build Coastguard Worker           ls ./target.tmp/debug/build/$PKGNAME-*/out/$OUTF || true`
96*3c875a21SAndroid Build Coastguard Worker      if [ "$SRC" != "" ]; then
97*3c875a21SAndroid Build Coastguard Worker        echo "Copying $SRC to out/$OUTF"
98*3c875a21SAndroid Build Coastguard Worker        mkdir -p out
99*3c875a21SAndroid Build Coastguard Worker        cp $SRC out/$OUTF
100*3c875a21SAndroid Build Coastguard Worker      fi
101*3c875a21SAndroid Build Coastguard Worker    done
102*3c875a21SAndroid Build Coastguard Worker  fi
103*3c875a21SAndroid Build Coastguard Worker}
104*3c875a21SAndroid Build Coastguard Worker
105*3c875a21SAndroid Build Coastguard Workerfunction update_files_with_cargo_pkg_vars() {
106*3c875a21SAndroid Build Coastguard Worker  FILES=`grep -r -l --include \*.rs \
107*3c875a21SAndroid Build Coastguard Worker    --exclude-dir .git --exclude build.rs \
108*3c875a21SAndroid Build Coastguard Worker    --exclude-dir target.tmp --exclude-dir target \
109*3c875a21SAndroid Build Coastguard Worker    -E 'env!\("CARGO_PKG_(NAME|VERSION|AUTHORS|DESCRIPTION)"\)' * || true`
110*3c875a21SAndroid Build Coastguard Worker  if [ "$FILES" != "" ]; then
111*3c875a21SAndroid Build Coastguard Worker    printf "INFO: to update FILES: %s\n" "`echo ${FILES} | paste -s -d' '`"
112*3c875a21SAndroid Build Coastguard Worker    # Find in ./Cargo.toml the 'name', 'version', 'authors', 'description'
113*3c875a21SAndroid Build Coastguard Worker    # strings and use them to replace env!("CARGO_PKG_*") in $FILES.
114*3c875a21SAndroid Build Coastguard Worker    grep_cargo_key_values
115*3c875a21SAndroid Build Coastguard Worker    update_files
116*3c875a21SAndroid Build Coastguard Worker  fi
117*3c875a21SAndroid Build Coastguard Worker}
118*3c875a21SAndroid Build Coastguard Worker
119*3c875a21SAndroid Build Coastguard Workerfunction grep_one_key_value()
120*3c875a21SAndroid Build Coastguard Worker{
121*3c875a21SAndroid Build Coastguard Worker  # Grep the first key $1 in Cargo.toml and return its value.
122*3c875a21SAndroid Build Coastguard Worker  grep "^$1 = " Cargo.toml | head -1 | sed -e "s:^$1 = ::" \
123*3c875a21SAndroid Build Coastguard Worker    || abort "ERROR: Cannot find '$1' in ./Cargo.toml"
124*3c875a21SAndroid Build Coastguard Worker}
125*3c875a21SAndroid Build Coastguard Worker
126*3c875a21SAndroid Build Coastguard Workerfunction grep_cargo_key_values()
127*3c875a21SAndroid Build Coastguard Worker{
128*3c875a21SAndroid Build Coastguard Worker  NAME=`grep_one_key_value name`
129*3c875a21SAndroid Build Coastguard Worker  VERSION=`grep_one_key_value version`
130*3c875a21SAndroid Build Coastguard Worker  AUTHORS=`grep_one_key_value authors`
131*3c875a21SAndroid Build Coastguard Worker  DESCRIPTION=`grep_one_key_value description`
132*3c875a21SAndroid Build Coastguard Worker  if [ "$DESCRIPTION" == "\"\"\"" ]; then
133*3c875a21SAndroid Build Coastguard Worker    # Old Cargo.toml description format, found only in the 'shlex' crate.
134*3c875a21SAndroid Build Coastguard Worker    DESCRIPTION=`printf '"%s-%s"' "$NAME" "$VERSION"`
135*3c875a21SAndroid Build Coastguard Worker    printf "WARNING: use %s for its CARGO_PKG_DESCRIPTION." "$DESCRIPTION"
136*3c875a21SAndroid Build Coastguard Worker  fi
137*3c875a21SAndroid Build Coastguard Worker  # CARGO_PKG_AUTHORS uses ':' as the separator.
138*3c875a21SAndroid Build Coastguard Worker  AUTHORS="$AUTHORS.join(\":\")"
139*3c875a21SAndroid Build Coastguard Worker}
140*3c875a21SAndroid Build Coastguard Worker
141*3c875a21SAndroid Build Coastguard Workerfunction build_sed_cmd()
142*3c875a21SAndroid Build Coastguard Worker{
143*3c875a21SAndroid Build Coastguard Worker  # Replace '\' with '\\' to keep escape sequence in the sed command.
144*3c875a21SAndroid Build Coastguard Worker  # NAME and VERSION are simple stings without escape sequence.
145*3c875a21SAndroid Build Coastguard Worker  s1=`printf "$1" "NAME" "$NAME"`
146*3c875a21SAndroid Build Coastguard Worker  s2=`printf "$1" "VERSION" "$VERSION"`
147*3c875a21SAndroid Build Coastguard Worker  s3=`printf "$1" "AUTHORS" "${AUTHORS//\\\\/\\\\\\\\}"`
148*3c875a21SAndroid Build Coastguard Worker  s4=`printf "$1" "DESCRIPTION" "${DESCRIPTION//\\\\/\\\\\\\\}"`
149*3c875a21SAndroid Build Coastguard Worker  echo "$s1;$s2;$s3;$s4"
150*3c875a21SAndroid Build Coastguard Worker}
151*3c875a21SAndroid Build Coastguard Worker
152*3c875a21SAndroid Build Coastguard Workerfunction update_files()
153*3c875a21SAndroid Build Coastguard Worker{
154*3c875a21SAndroid Build Coastguard Worker  # Replace option_env!("...") with Some("...")
155*3c875a21SAndroid Build Coastguard Worker  # Replace env!("...") with string literal "..."
156*3c875a21SAndroid Build Coastguard Worker  # Do not replace run-time std::env::var("....") with
157*3c875a21SAndroid Build Coastguard Worker  #   (Ok("...".to_string()) as std::result::Result<...>)
158*3c875a21SAndroid Build Coastguard Worker  local cmd=`build_sed_cmd 's%%option_env!("CARGO_PKG_%s")%%Some(%s)%%g'`
159*3c875a21SAndroid Build Coastguard Worker  cmd="$cmd;"`build_sed_cmd 's%%env!("CARGO_PKG_%s")%%%s%%g'`
160*3c875a21SAndroid Build Coastguard Worker  sed -i -e "$cmd" $FILES
161*3c875a21SAndroid Build Coastguard Worker}
162*3c875a21SAndroid Build Coastguard Worker
163*3c875a21SAndroid Build Coastguard Workermain $*
164