xref: /aosp_15_r20/system/linkerconfig/rundiff.sh (revision e5eeaa8e05bc25a862c0c861bda7c8a6bfb42dad)
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