xref: /aosp_15_r20/system/linkerconfig/testdata/prepare_root.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 Worker
19*e5eeaa8eSAndroid Build Coastguard Workerbootstrap=
20*e5eeaa8eSAndroid Build Coastguard Workerall=
21*e5eeaa8eSAndroid Build Coastguard Workerroot=
22*e5eeaa8eSAndroid Build Coastguard Workerblock_apexes=
23*e5eeaa8eSAndroid Build Coastguard Worker
24*e5eeaa8eSAndroid Build Coastguard Workerfunction usage() {
25*e5eeaa8eSAndroid Build Coastguard Worker  echo "usage: $0 [--bootstrap|--all] [--block apexes(colol-separated)] --root root" && exit 1
26*e5eeaa8eSAndroid Build Coastguard Worker}
27*e5eeaa8eSAndroid Build Coastguard Worker
28*e5eeaa8eSAndroid Build Coastguard Workerwhile [[ $# -gt 0 ]]; do
29*e5eeaa8eSAndroid Build Coastguard Worker  case "$1" in
30*e5eeaa8eSAndroid Build Coastguard Worker    --bootstrap)
31*e5eeaa8eSAndroid Build Coastguard Worker      bootstrap=yes
32*e5eeaa8eSAndroid Build Coastguard Worker      shift
33*e5eeaa8eSAndroid Build Coastguard Worker      ;;
34*e5eeaa8eSAndroid Build Coastguard Worker    --all)
35*e5eeaa8eSAndroid Build Coastguard Worker      all=yes
36*e5eeaa8eSAndroid Build Coastguard Worker      shift
37*e5eeaa8eSAndroid Build Coastguard Worker      ;;
38*e5eeaa8eSAndroid Build Coastguard Worker    --block)
39*e5eeaa8eSAndroid Build Coastguard Worker      block_apexes=$2
40*e5eeaa8eSAndroid Build Coastguard Worker      shift
41*e5eeaa8eSAndroid Build Coastguard Worker      shift
42*e5eeaa8eSAndroid Build Coastguard Worker      ;;
43*e5eeaa8eSAndroid Build Coastguard Worker    --root)
44*e5eeaa8eSAndroid Build Coastguard Worker      root=$2
45*e5eeaa8eSAndroid Build Coastguard Worker      shift
46*e5eeaa8eSAndroid Build Coastguard Worker      shift
47*e5eeaa8eSAndroid Build Coastguard Worker      ;;
48*e5eeaa8eSAndroid Build Coastguard Worker    *)
49*e5eeaa8eSAndroid Build Coastguard Worker      usage
50*e5eeaa8eSAndroid Build Coastguard Worker  esac
51*e5eeaa8eSAndroid Build Coastguard Workerdone
52*e5eeaa8eSAndroid Build Coastguard Worker
53*e5eeaa8eSAndroid Build Coastguard Workerif [ -z $root ]; then
54*e5eeaa8eSAndroid Build Coastguard Worker  usage
55*e5eeaa8eSAndroid Build Coastguard Workerfi
56*e5eeaa8eSAndroid Build Coastguard Worker
57*e5eeaa8eSAndroid Build Coastguard Workerif [ ! -z $bootstrap ] && [ ! -z $all ]; then
58*e5eeaa8eSAndroid Build Coastguard Worker  usage
59*e5eeaa8eSAndroid Build Coastguard Workerfi
60*e5eeaa8eSAndroid Build Coastguard Worker
61*e5eeaa8eSAndroid Build Coastguard Workeractivate_level=0
62*e5eeaa8eSAndroid Build Coastguard Workerif [ ! -z $bootstrap ]; then
63*e5eeaa8eSAndroid Build Coastguard Worker  activate_level=1
64*e5eeaa8eSAndroid Build Coastguard Workerelif [ ! -z $all ]; then
65*e5eeaa8eSAndroid Build Coastguard Worker  activate_level=2
66*e5eeaa8eSAndroid Build Coastguard Workerfi
67*e5eeaa8eSAndroid Build Coastguard Worker
68*e5eeaa8eSAndroid Build Coastguard Workerfunction get_level() {
69*e5eeaa8eSAndroid Build Coastguard Worker  case $1 in
70*e5eeaa8eSAndroid Build Coastguard Worker    com.android.art|com.android.runtime|com.android.i18n|com.android.tzdata|com.android.vndk.vR)
71*e5eeaa8eSAndroid Build Coastguard Worker      echo 1 ;;
72*e5eeaa8eSAndroid Build Coastguard Worker    *)
73*e5eeaa8eSAndroid Build Coastguard Worker      echo 2 ;;
74*e5eeaa8eSAndroid Build Coastguard Worker  esac
75*e5eeaa8eSAndroid Build Coastguard Worker}
76*e5eeaa8eSAndroid Build Coastguard Worker
77*e5eeaa8eSAndroid Build Coastguard Workerfunction abs() {
78*e5eeaa8eSAndroid Build Coastguard Worker  if [[ $1 = /* ]]; then
79*e5eeaa8eSAndroid Build Coastguard Worker    echo $1
80*e5eeaa8eSAndroid Build Coastguard Worker  else
81*e5eeaa8eSAndroid Build Coastguard Worker    echo $(realpath $(pwd)/$1)
82*e5eeaa8eSAndroid Build Coastguard Worker  fi
83*e5eeaa8eSAndroid Build Coastguard Worker}
84*e5eeaa8eSAndroid Build Coastguard Worker
85*e5eeaa8eSAndroid Build Coastguard WorkerROOT=$(abs $root)
86*e5eeaa8eSAndroid Build Coastguard Worker
87*e5eeaa8eSAndroid Build Coastguard Worker# to use relative paths
88*e5eeaa8eSAndroid Build Coastguard Workercd $(dirname $0)
89*e5eeaa8eSAndroid Build Coastguard Worker
90*e5eeaa8eSAndroid Build Coastguard Worker# clean /apex directory
91*e5eeaa8eSAndroid Build Coastguard Workerrm -iRf $ROOT/apex
92*e5eeaa8eSAndroid Build Coastguard Worker
93*e5eeaa8eSAndroid Build Coastguard Worker# prepare /apex directory
94*e5eeaa8eSAndroid Build Coastguard Worker# 1) activate APEXes
95*e5eeaa8eSAndroid Build Coastguard Worker# 2) generate /apex/apex-info-list.xml
96*e5eeaa8eSAndroid Build Coastguard Worker
97*e5eeaa8eSAndroid Build Coastguard Workermkdir -p $ROOT/apex
98*e5eeaa8eSAndroid Build Coastguard Worker
99*e5eeaa8eSAndroid Build Coastguard WorkerblockIndex=1
100*e5eeaa8eSAndroid Build Coastguard WorkerapexInfo=$ROOT/apex/apex-info-list.xml
101*e5eeaa8eSAndroid Build Coastguard Workerecho "<?xml version=\"1.0\" encoding=\"utf-8\"?>" > $apexInfo
102*e5eeaa8eSAndroid Build Coastguard Workerecho "<apex-info-list>" > $apexInfo
103*e5eeaa8eSAndroid Build Coastguard Worker
104*e5eeaa8eSAndroid Build Coastguard Workerfor partition in system product system_ext vendor odm; do
105*e5eeaa8eSAndroid Build Coastguard Worker  if [ -d $ROOT/$partition/apex ]; then
106*e5eeaa8eSAndroid Build Coastguard Worker    for src in $ROOT/$partition/apex/*/; do
107*e5eeaa8eSAndroid Build Coastguard Worker      if test ! -d $src; then
108*e5eeaa8eSAndroid Build Coastguard Worker        continue
109*e5eeaa8eSAndroid Build Coastguard Worker      fi
110*e5eeaa8eSAndroid Build Coastguard Worker      name=$(basename $src)
111*e5eeaa8eSAndroid Build Coastguard Worker      dst=$ROOT/apex/$name
112*e5eeaa8eSAndroid Build Coastguard Worker      # b/234792422 Atest is running with PATH prebuilts/build-tools/path/linux-x86
113*e5eeaa8eSAndroid Build Coastguard Worker      # where the realpath does not support --relative-to option. Use shell
114*e5eeaa8eSAndroid Build Coastguard Worker      # parameter expansion to avoid invalid options.
115*e5eeaa8eSAndroid Build Coastguard Worker      module_path="${src/$ROOT/}"
116*e5eeaa8eSAndroid Build Coastguard Worker      # simulate block apexes are activated from /dev/block/vdaN
117*e5eeaa8eSAndroid Build Coastguard Worker      if [[ "$block_apexes" == *"$name"* ]]; then
118*e5eeaa8eSAndroid Build Coastguard Worker        module_path=/dev/block/vda$blockIndex
119*e5eeaa8eSAndroid Build Coastguard Worker        ((blockIndex=blockIndex+1))
120*e5eeaa8eSAndroid Build Coastguard Worker      fi
121*e5eeaa8eSAndroid Build Coastguard Worker      if [ $(get_level $name) -le $activate_level ]; then
122*e5eeaa8eSAndroid Build Coastguard Worker        # simulate "activation" by copying "apex dir" into /apex
123*e5eeaa8eSAndroid Build Coastguard Worker        cp -r $src $dst
124*e5eeaa8eSAndroid Build Coastguard Worker        echo " <apex-info moduleName=\"$name\" modulePath=\"$module_path\" partition=\"${partition^^}\" isFactory=\"true\" isActive=\"true\" />" >> $apexInfo
125*e5eeaa8eSAndroid Build Coastguard Worker      fi
126*e5eeaa8eSAndroid Build Coastguard Worker    done
127*e5eeaa8eSAndroid Build Coastguard Worker  fi
128*e5eeaa8eSAndroid Build Coastguard Workerdone
129*e5eeaa8eSAndroid Build Coastguard Worker
130*e5eeaa8eSAndroid Build Coastguard Workerecho "</apex-info-list>" >> $apexInfo
131