1*e5eeaa8eSAndroid Build Coastguard Worker#!/bin/bash 2*e5eeaa8eSAndroid Build Coastguard Worker 3*e5eeaa8eSAndroid Build Coastguard Worker# Copyright (C) 2020 The Android Open Source Project 4*e5eeaa8eSAndroid Build Coastguard Worker# 5*e5eeaa8eSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*e5eeaa8eSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*e5eeaa8eSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*e5eeaa8eSAndroid Build Coastguard Worker# 9*e5eeaa8eSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*e5eeaa8eSAndroid Build Coastguard Worker# 11*e5eeaa8eSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*e5eeaa8eSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*e5eeaa8eSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*e5eeaa8eSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*e5eeaa8eSAndroid Build Coastguard Worker# limitations under the License. 16*e5eeaa8eSAndroid Build Coastguard Worker 17*e5eeaa8eSAndroid Build Coastguard Workerset -e 18*e5eeaa8eSAndroid Build Coastguard Workershopt -s extglob 19*e5eeaa8eSAndroid Build Coastguard Workershopt -s globstar 20*e5eeaa8eSAndroid Build Coastguard Worker 21*e5eeaa8eSAndroid Build Coastguard Worker# to use relative paths 22*e5eeaa8eSAndroid Build Coastguard Workercd $(dirname $0) 23*e5eeaa8eSAndroid Build Coastguard Worker 24*e5eeaa8eSAndroid Build Coastguard WorkerRUN_FROM_SERVER=0 25*e5eeaa8eSAndroid Build Coastguard Worker 26*e5eeaa8eSAndroid Build Coastguard Worker# when executed directly from commandline, build dependencies 27*e5eeaa8eSAndroid Build Coastguard Workerif [[ $(basename $0) == "rundiff.sh" ]]; then 28*e5eeaa8eSAndroid Build Coastguard Worker if [ -z $ANDROID_BUILD_TOP ]; then 29*e5eeaa8eSAndroid Build Coastguard Worker echo "You need to source and lunch before you can use this script" 30*e5eeaa8eSAndroid Build Coastguard Worker exit 1 31*e5eeaa8eSAndroid Build Coastguard Worker fi 32*e5eeaa8eSAndroid Build Coastguard Worker $ANDROID_BUILD_TOP/build/soong/soong_ui.bash --make-mode linkerconfig conv_apex_manifest conv_linker_config 33*e5eeaa8eSAndroid Build Coastguard Workerelse 34*e5eeaa8eSAndroid Build Coastguard Worker # workaround to use host tools on build server 35*e5eeaa8eSAndroid Build Coastguard Worker export PATH=$(dirname $0):$PATH 36*e5eeaa8eSAndroid Build Coastguard Worker RUN_FROM_SERVER=1 37*e5eeaa8eSAndroid Build Coastguard Workerfi 38*e5eeaa8eSAndroid Build Coastguard Worker 39*e5eeaa8eSAndroid Build Coastguard Worker# Simulate build process 40*e5eeaa8eSAndroid Build Coastguard Worker# $1: input tree (with *.json) 41*e5eeaa8eSAndroid Build Coastguard Worker# $2: output tree (*.json files are converted into *.pb) 42*e5eeaa8eSAndroid Build Coastguard Workerfunction build_root { 43*e5eeaa8eSAndroid Build Coastguard Worker cp -R $1/* $2 44*e5eeaa8eSAndroid Build Coastguard Worker 45*e5eeaa8eSAndroid Build Coastguard Worker for json in $2/**/linker.config.json; do 46*e5eeaa8eSAndroid Build Coastguard Worker conv_linker_config proto -s $json -o ${json%.json}.pb 47*e5eeaa8eSAndroid Build Coastguard Worker rm $json 48*e5eeaa8eSAndroid Build Coastguard Worker done 49*e5eeaa8eSAndroid Build Coastguard Worker for json in $2/**/apex_manifest.json; do 50*e5eeaa8eSAndroid Build Coastguard Worker conv_apex_manifest proto $json -o ${json%.json}.pb 51*e5eeaa8eSAndroid Build Coastguard Worker rm $json 52*e5eeaa8eSAndroid Build Coastguard Worker done 53*e5eeaa8eSAndroid Build Coastguard Worker} 54*e5eeaa8eSAndroid Build Coastguard Worker 55*e5eeaa8eSAndroid Build Coastguard Workerfunction run_linkerconfig_stage1 { 56*e5eeaa8eSAndroid Build Coastguard Worker # prepare root 57*e5eeaa8eSAndroid Build Coastguard Worker echo "Prepare root for stage 1" 58*e5eeaa8eSAndroid Build Coastguard Worker TMP_PATH=$2/stage1 59*e5eeaa8eSAndroid Build Coastguard Worker mkdir $TMP_PATH 60*e5eeaa8eSAndroid Build Coastguard Worker build_root testdata/root $TMP_PATH 61*e5eeaa8eSAndroid Build Coastguard Worker ./testdata/prepare_root.sh --bootstrap --root $TMP_PATH 62*e5eeaa8eSAndroid Build Coastguard Worker 63*e5eeaa8eSAndroid Build Coastguard Worker mkdir -p $1/stage1 64*e5eeaa8eSAndroid Build Coastguard Worker echo "Running linkerconfig for stage 1" 65*e5eeaa8eSAndroid Build Coastguard Worker linkerconfig -z -r $TMP_PATH -t $1/stage1 66*e5eeaa8eSAndroid Build Coastguard Worker 67*e5eeaa8eSAndroid Build Coastguard Worker echo "Stage 1 completed" 68*e5eeaa8eSAndroid Build Coastguard Worker} 69*e5eeaa8eSAndroid Build Coastguard Worker 70*e5eeaa8eSAndroid Build Coastguard Workerfunction run_linkerconfig_stage2 { 71*e5eeaa8eSAndroid Build Coastguard Worker # prepare root 72*e5eeaa8eSAndroid Build Coastguard Worker echo "Prepare root for stage 2" 73*e5eeaa8eSAndroid Build Coastguard Worker TMP_PATH=$2/stage2 74*e5eeaa8eSAndroid Build Coastguard Worker mkdir $TMP_PATH 75*e5eeaa8eSAndroid Build Coastguard Worker build_root testdata/root $TMP_PATH 76*e5eeaa8eSAndroid Build Coastguard Worker ./testdata/prepare_root.sh --all --root $TMP_PATH 77*e5eeaa8eSAndroid Build Coastguard Worker 78*e5eeaa8eSAndroid Build Coastguard Worker mkdir -p $1/stage2 79*e5eeaa8eSAndroid Build Coastguard Worker echo "Running linkerconfig for stage 2" 80*e5eeaa8eSAndroid Build Coastguard Worker linkerconfig -z -r $TMP_PATH -t $1/stage2 81*e5eeaa8eSAndroid Build Coastguard Worker 82*e5eeaa8eSAndroid Build Coastguard Worker # skip prepare_root (reuse the previous setup) 83*e5eeaa8eSAndroid Build Coastguard Worker mkdir -p $1/vendor_with_vndk 84*e5eeaa8eSAndroid Build Coastguard Worker echo "Running linkerconfig with VNDK available on the vendor partition" 85*e5eeaa8eSAndroid Build Coastguard Worker linkerconfig -v R -z -r $TMP_PATH -t $1/vendor_with_vndk 86*e5eeaa8eSAndroid Build Coastguard Worker 87*e5eeaa8eSAndroid Build Coastguard Worker # skip prepare_root (reuse the previous setup) 88*e5eeaa8eSAndroid Build Coastguard Worker mkdir -p $1/gen-only-a-single-apex 89*e5eeaa8eSAndroid Build Coastguard Worker echo "Running linkerconfig for gen-only-a-single-apex" 90*e5eeaa8eSAndroid Build Coastguard Worker linkerconfig -v R -z -r $TMP_PATH --apex com.vendor.service2 -t $1/gen-only-a-single-apex 91*e5eeaa8eSAndroid Build Coastguard Worker 92*e5eeaa8eSAndroid Build Coastguard Worker echo "Stage 2 completed" 93*e5eeaa8eSAndroid Build Coastguard Worker} 94*e5eeaa8eSAndroid Build Coastguard Worker 95*e5eeaa8eSAndroid Build Coastguard Workerfunction run_linkerconfig_others { 96*e5eeaa8eSAndroid Build Coastguard Worker # prepare root 97*e5eeaa8eSAndroid Build Coastguard Worker echo "Prepare root for stage others" 98*e5eeaa8eSAndroid Build Coastguard Worker TMP_PATH=$2/others 99*e5eeaa8eSAndroid Build Coastguard Worker mkdir $TMP_PATH 100*e5eeaa8eSAndroid Build Coastguard Worker build_root testdata/root $TMP_PATH 101*e5eeaa8eSAndroid Build Coastguard Worker ./testdata/prepare_root.sh --all --block com.android.art:com.android.vndk.vR --root $TMP_PATH 102*e5eeaa8eSAndroid Build Coastguard Worker 103*e5eeaa8eSAndroid Build Coastguard Worker mkdir -p $1/guest 104*e5eeaa8eSAndroid Build Coastguard Worker echo "Running linkerconfig for guest" 105*e5eeaa8eSAndroid Build Coastguard Worker linkerconfig -v R -p R -z -r $TMP_PATH -t $1/guest 106*e5eeaa8eSAndroid Build Coastguard Worker 107*e5eeaa8eSAndroid Build Coastguard Worker echo "Stage others completed" 108*e5eeaa8eSAndroid Build Coastguard Worker} 109*e5eeaa8eSAndroid Build Coastguard Worker 110*e5eeaa8eSAndroid Build Coastguard Worker# $1: target output directory 111*e5eeaa8eSAndroid Build Coastguard Workerfunction run_linkerconfig_to { 112*e5eeaa8eSAndroid Build Coastguard Worker # delete old output 113*e5eeaa8eSAndroid Build Coastguard Worker rm -rf $1 114*e5eeaa8eSAndroid Build Coastguard Worker 115*e5eeaa8eSAndroid Build Coastguard Worker TMP_ROOT=$(mktemp -d -t linkerconfig-root-XXXXXXXX) 116*e5eeaa8eSAndroid Build Coastguard Worker 117*e5eeaa8eSAndroid Build Coastguard Worker # stage 0 is no longer tested because linkerconfig do not generate ld.config.txt for stage 0 118*e5eeaa8eSAndroid Build Coastguard Worker 119*e5eeaa8eSAndroid Build Coastguard Worker run_linkerconfig_stage1 $1 $TMP_ROOT & 120*e5eeaa8eSAndroid Build Coastguard Worker 121*e5eeaa8eSAndroid Build Coastguard Worker run_linkerconfig_stage2 $1 $TMP_ROOT & 122*e5eeaa8eSAndroid Build Coastguard Worker 123*e5eeaa8eSAndroid Build Coastguard Worker run_linkerconfig_others $1 $TMP_ROOT & 124*e5eeaa8eSAndroid Build Coastguard Worker 125*e5eeaa8eSAndroid Build Coastguard Worker for job in `jobs -p` 126*e5eeaa8eSAndroid Build Coastguard Worker do 127*e5eeaa8eSAndroid Build Coastguard Worker wait $job 128*e5eeaa8eSAndroid Build Coastguard Worker done 129*e5eeaa8eSAndroid Build Coastguard Worker 130*e5eeaa8eSAndroid Build Coastguard Worker # Remove temp root if required 131*e5eeaa8eSAndroid Build Coastguard Worker if [[ $RUN_FROM_SERVER -ne 1 ]]; then 132*e5eeaa8eSAndroid Build Coastguard Worker rm -rf $TMP_ROOT 133*e5eeaa8eSAndroid Build Coastguard Worker fi 134*e5eeaa8eSAndroid Build Coastguard Worker} 135*e5eeaa8eSAndroid Build Coastguard Worker 136*e5eeaa8eSAndroid Build Coastguard Worker# update golden_output 137*e5eeaa8eSAndroid Build Coastguard Workerif [[ $1 == "--update" ]]; then 138*e5eeaa8eSAndroid Build Coastguard Worker run_linkerconfig_to ./testdata/golden_output 139*e5eeaa8eSAndroid Build Coastguard Worker echo "Updated" 140*e5eeaa8eSAndroid Build Coastguard Worker exit 0 141*e5eeaa8eSAndroid Build Coastguard Workerfi 142*e5eeaa8eSAndroid Build Coastguard Worker 143*e5eeaa8eSAndroid Build Coastguard Workerecho "Running linkerconfig diff test..." 144*e5eeaa8eSAndroid Build Coastguard Worker 145*e5eeaa8eSAndroid Build Coastguard Workerrun_linkerconfig_to ./testdata/output 146*e5eeaa8eSAndroid Build Coastguard Worker 147*e5eeaa8eSAndroid Build Coastguard Workerecho "Running diff from test output" 148*e5eeaa8eSAndroid Build Coastguard Workerif diff -ruN ./testdata/golden_output ./testdata/output ; then 149*e5eeaa8eSAndroid Build Coastguard Worker echo "No changes." 150*e5eeaa8eSAndroid Build Coastguard Workerelse 151*e5eeaa8eSAndroid Build Coastguard Worker echo 152*e5eeaa8eSAndroid Build Coastguard Worker echo "------------------------------------------------------------------------------------------" 153*e5eeaa8eSAndroid Build Coastguard Worker echo "if change looks fine, run following:" 154*e5eeaa8eSAndroid Build Coastguard Worker echo " \$ANDROID_BUILD_TOP/system/linkerconfig/rundiff.sh --update" 155*e5eeaa8eSAndroid Build Coastguard Worker echo "------------------------------------------------------------------------------------------" 156*e5eeaa8eSAndroid Build Coastguard Worker # fail 157*e5eeaa8eSAndroid Build Coastguard Worker exit 1 158*e5eeaa8eSAndroid Build Coastguard Workerfi