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