xref: /aosp_15_r20/hardware/interfaces/audio/common/all-versions/copyHAL.sh (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker#/usr/bin/env bash
2*4d7e907cSAndroid Build Coastguard Worker
3*4d7e907cSAndroid Build Coastguard Workerset -euo pipefail
4*4d7e907cSAndroid Build Coastguard Worker
5*4d7e907cSAndroid Build Coastguard Workerif (echo "$@" |grep -qe -h); then
6*4d7e907cSAndroid Build Coastguard Worker    echo "This script will generate a new HAL version identical to an other one."
7*4d7e907cSAndroid Build Coastguard Worker    echo "This helps creating the boilerplate for a new version."
8*4d7e907cSAndroid Build Coastguard Worker    echo
9*4d7e907cSAndroid Build Coastguard Worker    echo "USAGE: $0 [BASE_VERSION] [NEW_VERSION]"
10*4d7e907cSAndroid Build Coastguard Worker    echo "       BASE_VERSION default value is the highest version currently existing"
11*4d7e907cSAndroid Build Coastguard Worker    echo "       NEW_VERSION default value is BASE_VERSION + 1"
12*4d7e907cSAndroid Build Coastguard Worker    echo
13*4d7e907cSAndroid Build Coastguard Worker    echo "Example: to generate a V6.0 by copying V5, do: $0 5.0 6.0"
14*4d7e907cSAndroid Build Coastguard Worker    exit
15*4d7e907cSAndroid Build Coastguard Workerfi
16*4d7e907cSAndroid Build Coastguard Workerreadonly HAL_DIRECTORY=hardware/interfaces/audio
17*4d7e907cSAndroid Build Coastguard Workerreadonly HAL_VTS_DIRECTORY=core/all-versions/vts/functional
18*4d7e907cSAndroid Build Coastguard Workerreadonly HAL_VTS_FILE=AudioPrimaryHidlHalTest.cpp
19*4d7e907cSAndroid Build Coastguard Workerreadonly HAL_EFFECT_VTS_DIRECTORY=effect/all-versions/vts/functional
20*4d7e907cSAndroid Build Coastguard Workerreadonly HAL_SERVICE_DIRECTORY=common/all-versions/default/service/
21*4d7e907cSAndroid Build Coastguard Workerreadonly HAL_SERVICE_CPP=service.cpp
22*4d7e907cSAndroid Build Coastguard Worker
23*4d7e907cSAndroid Build Coastguard Workerreadonly FWK_DIRECTORY=frameworks/av/media/libaudiohal
24*4d7e907cSAndroid Build Coastguard Workerreadonly IMPL_DIRECTORY=impl
25*4d7e907cSAndroid Build Coastguard Workerreadonly IMPL_FACTORYHAL=FactoryHalHidl.cpp
26*4d7e907cSAndroid Build Coastguard Worker
27*4d7e907cSAndroid Build Coastguard Workerreadonly VTS_DIRECTORY=test/vts-testcase/hal/audio
28*4d7e907cSAndroid Build Coastguard Workerreadonly VTS_LIST=test/vts/tools/build/tasks/list/vts_test_lib_hidl_package_list.mk
29*4d7e907cSAndroid Build Coastguard Workerreadonly WATCHDOG=frameworks/base/services/core/java/com/android/server/Watchdog.java
30*4d7e907cSAndroid Build Coastguard Workerreadonly DUMP_UTILS=frameworks/native/libs/dumputils/dump_utils.cpp
31*4d7e907cSAndroid Build Coastguard Workerreadonly GSI_CURRENT=build/make/target/product/gsi/current.txt
32*4d7e907cSAndroid Build Coastguard Worker
33*4d7e907cSAndroid Build Coastguard Workerreadonly BASE_VERSION=${1:-$(ls $ANDROID_BUILD_TOP/$HAL_DIRECTORY | grep -E '[0-9]+\.[0-9]+' |
34*4d7e907cSAndroid Build Coastguard Worker                                  sort -n |tail -n1)}
35*4d7e907cSAndroid Build Coastguard Workerreadonly BASE_MAJOR_VERSION=${BASE_VERSION%.*}
36*4d7e907cSAndroid Build Coastguard Workerreadonly BASE_MINOR_VERSION=${BASE_VERSION##*.}
37*4d7e907cSAndroid Build Coastguard Worker
38*4d7e907cSAndroid Build Coastguard Workerreadonly NEW_VERSION="${2:-$((${BASE_MAJOR_VERSION} + 1)).0}"
39*4d7e907cSAndroid Build Coastguard Workerreadonly NEW_MAJOR_VERSION=${NEW_VERSION%.*}
40*4d7e907cSAndroid Build Coastguard Workerreadonly NEW_MINOR_VERSION=${NEW_VERSION##*.}
41*4d7e907cSAndroid Build Coastguard Worker
42*4d7e907cSAndroid Build Coastguard Worker
43*4d7e907cSAndroid Build Coastguard Workerreadonly BASE_VERSION_REGEX="${BASE_MAJOR_VERSION}[._]${BASE_MINOR_VERSION}"
44*4d7e907cSAndroid Build Coastguard Workerreadonly NEW_VERSION_REGEX="${NEW_MAJOR_VERSION}[._]${NEW_MINOR_VERSION}"
45*4d7e907cSAndroid Build Coastguard Worker
46*4d7e907cSAndroid Build Coastguard Workerreadonly BASE_VERSION_ESCAPE="${BASE_MAJOR_VERSION}\.${BASE_MINOR_VERSION}"
47*4d7e907cSAndroid Build Coastguard Workerreadonly BASE_VERSION_UNDERSCORE="${BASE_MAJOR_VERSION}_${BASE_MINOR_VERSION}"
48*4d7e907cSAndroid Build Coastguard Workerreadonly NEW_VERSION_UNDERSCORE="${NEW_MAJOR_VERSION}_${NEW_MINOR_VERSION}"
49*4d7e907cSAndroid Build Coastguard Worker
50*4d7e907cSAndroid Build Coastguard Workerreadonly HAL_VTS_CONFIG_FILE_GLOB="*Audio*V${BASE_VERSION_UNDERSCORE}*Test.xml"
51*4d7e907cSAndroid Build Coastguard Worker
52*4d7e907cSAndroid Build Coastguard WorkerupdateVersion() {
53*4d7e907cSAndroid Build Coastguard Worker    if [ $1 == "-e" ]; then
54*4d7e907cSAndroid Build Coastguard Worker        local -r REGEX="$2"; shift 2
55*4d7e907cSAndroid Build Coastguard Worker    else
56*4d7e907cSAndroid Build Coastguard Worker        local -r REGEX="$BASE_VERSION_REGEX"
57*4d7e907cSAndroid Build Coastguard Worker    fi
58*4d7e907cSAndroid Build Coastguard Worker    awk -i inplace -e "{if (!/$REGEX/) print; else {
59*4d7e907cSAndroid Build Coastguard Worker                            if (original_before) print
60*4d7e907cSAndroid Build Coastguard Worker                            if (original_after) original_line=\$0;
61*4d7e907cSAndroid Build Coastguard Worker
62*4d7e907cSAndroid Build Coastguard Worker                            gsub(/$BASE_VERSION_ESCAPE/,\"$NEW_VERSION\");
63*4d7e907cSAndroid Build Coastguard Worker                            gsub(/$BASE_VERSION_UNDERSCORE/,\"$NEW_VERSION_UNDERSCORE\");
64*4d7e907cSAndroid Build Coastguard Worker                            gsub(/MAJOR_VERSION=$BASE_MAJOR_VERSION/,
65*4d7e907cSAndroid Build Coastguard Worker                                 \"MAJOR_VERSION=$NEW_MAJOR_VERSION\");
66*4d7e907cSAndroid Build Coastguard Worker                            gsub(/MINOR_VERSION=$BASE_MINOR_VERSION/,
67*4d7e907cSAndroid Build Coastguard Worker                                 \"MINOR_VERSION=$NEW_MINOR_VERSION\");
68*4d7e907cSAndroid Build Coastguard Worker
69*4d7e907cSAndroid Build Coastguard Worker                            print
70*4d7e907cSAndroid Build Coastguard Worker                            if (original_after) print original_line
71*4d7e907cSAndroid Build Coastguard Worker                       }}" "$@"
72*4d7e907cSAndroid Build Coastguard Worker}
73*4d7e907cSAndroid Build Coastguard Worker
74*4d7e907cSAndroid Build Coastguard WorkerupdateAudioVersion() {
75*4d7e907cSAndroid Build Coastguard Worker    updateVersion -e "audio.*$BASE_VERSION_REGEX" "$@"
76*4d7e907cSAndroid Build Coastguard Worker}
77*4d7e907cSAndroid Build Coastguard Worker
78*4d7e907cSAndroid Build Coastguard WorkerupdateAudioVtsTargetVersion() {
79*4d7e907cSAndroid Build Coastguard Worker    updateVersion -e "Audio.*V$BASE_VERSION_REGEX" "$@"
80*4d7e907cSAndroid Build Coastguard Worker}
81*4d7e907cSAndroid Build Coastguard Worker
82*4d7e907cSAndroid Build Coastguard WorkerupdateLicenceDates() {
83*4d7e907cSAndroid Build Coastguard Worker    # Update date on the 2 first lines
84*4d7e907cSAndroid Build Coastguard Worker    sed -i "1,2 s/20[0-9][0-9]/$(date +"%Y")/g" "$@"
85*4d7e907cSAndroid Build Coastguard Worker}
86*4d7e907cSAndroid Build Coastguard Worker
87*4d7e907cSAndroid Build Coastguard Workerecho "Creating new audio HAL V$NEW_VERSION based on V$BASE_VERSION"
88*4d7e907cSAndroid Build Coastguard Workerecho "Press Ctrl-C to cancel, Enter to continue"
89*4d7e907cSAndroid Build Coastguard Workerread
90*4d7e907cSAndroid Build Coastguard Worker
91*4d7e907cSAndroid Build Coastguard WorkerMODIFIED=
92*4d7e907cSAndroid Build Coastguard WorkerrunIfNeeded() {
93*4d7e907cSAndroid Build Coastguard Worker    local -r TARGET=$1; shift
94*4d7e907cSAndroid Build Coastguard Worker    cd $ANDROID_BUILD_TOP/$TARGET
95*4d7e907cSAndroid Build Coastguard Worker    if grep -q -r "audio.*$NEW_VERSION_REGEX"; then
96*4d7e907cSAndroid Build Coastguard Worker        echo "  Skipping $TARGET as already up to date"
97*4d7e907cSAndroid Build Coastguard Worker    else
98*4d7e907cSAndroid Build Coastguard Worker        echo "  Updating $PWD"
99*4d7e907cSAndroid Build Coastguard Worker        MODIFIED+=$'\n - '$TARGET
100*4d7e907cSAndroid Build Coastguard Worker        "$@"
101*4d7e907cSAndroid Build Coastguard Worker    fi
102*4d7e907cSAndroid Build Coastguard Worker}
103*4d7e907cSAndroid Build Coastguard Worker
104*4d7e907cSAndroid Build Coastguard WorkercreateHALVersion() {
105*4d7e907cSAndroid Build Coastguard Worker    local -r DIRS=". common effect"
106*4d7e907cSAndroid Build Coastguard Worker    local COPY=
107*4d7e907cSAndroid Build Coastguard Worker    echo "Copy $BASE_VERSION to $NEW_VERSION in $DIRS"
108*4d7e907cSAndroid Build Coastguard Worker    for DIR in $DIRS; do
109*4d7e907cSAndroid Build Coastguard Worker        cp -Tar $DIR/$BASE_VERSION $DIR/$NEW_VERSION
110*4d7e907cSAndroid Build Coastguard Worker        COPY+=" $DIR/$NEW_VERSION"
111*4d7e907cSAndroid Build Coastguard Worker    done
112*4d7e907cSAndroid Build Coastguard Worker    local COPY_FILES_TO=
113*4d7e907cSAndroid Build Coastguard Worker    for FILE_FROM in $(find . -type f -name "$HAL_VTS_CONFIG_FILE_GLOB"); do
114*4d7e907cSAndroid Build Coastguard Worker        local FILE_TO=${FILE_FROM/$BASE_VERSION_UNDERSCORE/$NEW_VERSION_UNDERSCORE}
115*4d7e907cSAndroid Build Coastguard Worker        cp "$FILE_FROM" "$FILE_TO"
116*4d7e907cSAndroid Build Coastguard Worker        COPY_FILES_TO+=" $FILE_TO"
117*4d7e907cSAndroid Build Coastguard Worker    done
118*4d7e907cSAndroid Build Coastguard Worker
119*4d7e907cSAndroid Build Coastguard Worker    echo "Replacing $BASE_VERSION by $NEW_VERSION in the copied files"
120*4d7e907cSAndroid Build Coastguard Worker    updateVersion $(find $COPY -type f)
121*4d7e907cSAndroid Build Coastguard Worker    updateVersion $COPY_FILES_TO
122*4d7e907cSAndroid Build Coastguard Worker    updateLicenceDates $(find $COPY -type f)
123*4d7e907cSAndroid Build Coastguard Worker
124*4d7e907cSAndroid Build Coastguard Worker    echo "Update implementation and VTS generic code"
125*4d7e907cSAndroid Build Coastguard Worker    local -r FILES="*/all-versions/default/Android.bp */all-versions/vts/functional/Android.bp"
126*4d7e907cSAndroid Build Coastguard Worker    updateVersion -v original_before=1 -v RS= -v ORS='\n\n' $FILES
127*4d7e907cSAndroid Build Coastguard Worker    sed -i '${/^$/d}' $FILES # Remove \n at the end of the files
128*4d7e907cSAndroid Build Coastguard Worker
129*4d7e907cSAndroid Build Coastguard Worker    updateVersion -v original_before=1 $HAL_SERVICE_DIRECTORY/Android.bp
130*4d7e907cSAndroid Build Coastguard Worker
131*4d7e907cSAndroid Build Coastguard Worker    updateVersion -e "audio::.*$BASE_VERSION_REGEX" -v original_after=1 \
132*4d7e907cSAndroid Build Coastguard Worker        $HAL_SERVICE_DIRECTORY/$HAL_SERVICE_CPP
133*4d7e907cSAndroid Build Coastguard Worker    updateVersion -e "audio\/.*$BASE_VERSION_REGEX" -v original_before=1 \
134*4d7e907cSAndroid Build Coastguard Worker        $HAL_SERVICE_DIRECTORY/$HAL_SERVICE_CPP
135*4d7e907cSAndroid Build Coastguard Worker
136*4d7e907cSAndroid Build Coastguard Worker    local -r HAL_VTS_PATH=$HAL_VTS_DIRECTORY/$NEW_VERSION/$HAL_VTS_FILE
137*4d7e907cSAndroid Build Coastguard Worker    mkdir -p $(dirname $HAL_VTS_PATH)
138*4d7e907cSAndroid Build Coastguard Worker    cat > $HAL_VTS_PATH <<EOF
139*4d7e907cSAndroid Build Coastguard Worker/*
140*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) $(date +"%Y") The Android Open Source Project
141*4d7e907cSAndroid Build Coastguard Worker *
142*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
143*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
144*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at
145*4d7e907cSAndroid Build Coastguard Worker *
146*4d7e907cSAndroid Build Coastguard Worker *      http://www.apache.org/licenses/LICENSE-2.0
147*4d7e907cSAndroid Build Coastguard Worker *
148*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
149*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
150*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
151*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
152*4d7e907cSAndroid Build Coastguard Worker * limitations under the License.
153*4d7e907cSAndroid Build Coastguard Worker */
154*4d7e907cSAndroid Build Coastguard Worker
155*4d7e907cSAndroid Build Coastguard Worker// pull in all the <= $BASE_VERSION tests
156*4d7e907cSAndroid Build Coastguard Worker#include "$BASE_VERSION/$(basename AudioPrimaryHidlHalTest.cpp)"
157*4d7e907cSAndroid Build Coastguard WorkerEOF
158*4d7e907cSAndroid Build Coastguard Worker
159*4d7e907cSAndroid Build Coastguard Worker    echo "New HAL version $NEW_VERSION successfully created"
160*4d7e907cSAndroid Build Coastguard Worker}
161*4d7e907cSAndroid Build Coastguard Worker
162*4d7e907cSAndroid Build Coastguard Workerecho "Creating new audio HAL definition, default impl and VTS"
163*4d7e907cSAndroid Build Coastguard WorkerrunIfNeeded $HAL_DIRECTORY createHALVersion
164*4d7e907cSAndroid Build Coastguard Worker
165*4d7e907cSAndroid Build Coastguard Worker
166*4d7e907cSAndroid Build Coastguard WorkercreateFrameworkAdapter() {
167*4d7e907cSAndroid Build Coastguard Worker    updateVersion -v original_before=1 Android.bp
168*4d7e907cSAndroid Build Coastguard Worker    updateVersion -v original_before=1 -v RS= -v ORS='\n\n' $IMPL_DIRECTORY/Android.bp
169*4d7e907cSAndroid Build Coastguard Worker    updateVersion -v original_after=1 $IMPL_FACTORYHAL
170*4d7e907cSAndroid Build Coastguard Worker}
171*4d7e907cSAndroid Build Coastguard Workerecho "Now creating the framework adapter version"
172*4d7e907cSAndroid Build Coastguard WorkerrunIfNeeded $FWK_DIRECTORY createFrameworkAdapter
173*4d7e907cSAndroid Build Coastguard Worker
174*4d7e907cSAndroid Build Coastguard Workerecho "Now register new VTS"
175*4d7e907cSAndroid Build Coastguard WorkerPREV_MODIFIED="$MODIFIED"
176*4d7e907cSAndroid Build Coastguard WorkerrunIfNeeded $(dirname $VTS_LIST) updateAudioVersion -v original_before=1 $(basename $VTS_LIST)
177*4d7e907cSAndroid Build Coastguard Workerif [[ "$PREV_MODIFIED" != "$MODIFIED" ]]; then
178*4d7e907cSAndroid Build Coastguard Worker    updateAudioVtsTargetVersion -v original_after=1 $(basename $VTS_LIST)
179*4d7e907cSAndroid Build Coastguard Workerfi
180*4d7e907cSAndroid Build Coastguard Worker
181*4d7e907cSAndroid Build Coastguard Workerecho "Now update watchdog"
182*4d7e907cSAndroid Build Coastguard WorkerrunIfNeeded $(dirname $WATCHDOG) updateAudioVersion -v original_before=1 $(basename $WATCHDOG)
183*4d7e907cSAndroid Build Coastguard Worker
184*4d7e907cSAndroid Build Coastguard Workerecho "Now update dumputils"
185*4d7e907cSAndroid Build Coastguard WorkerrunIfNeeded $(dirname $DUMP_UTILS) updateAudioVersion -v original_before=1 $(basename $DUMP_UTILS)
186*4d7e907cSAndroid Build Coastguard Worker
187*4d7e907cSAndroid Build Coastguard Workerecho "Now update GSI current.txt"
188*4d7e907cSAndroid Build Coastguard WorkerrunIfNeeded $(dirname $GSI_CURRENT) update-vndk-list.sh
189*4d7e907cSAndroid Build Coastguard Worker
190*4d7e907cSAndroid Build Coastguard Workerif ! [ "$MODIFIED" ]; then
191*4d7e907cSAndroid Build Coastguard Worker    echo
192*4d7e907cSAndroid Build Coastguard Worker    echo "$NEW_VERSION already exist, nothing to do"
193*4d7e907cSAndroid Build Coastguard Worker    exit
194*4d7e907cSAndroid Build Coastguard Workerfi
195*4d7e907cSAndroid Build Coastguard Worker
196*4d7e907cSAndroid Build Coastguard Workercat << EOF
197*4d7e907cSAndroid Build Coastguard Worker
198*4d7e907cSAndroid Build Coastguard WorkerAll File generated successfully. Please submit a patch in all those directories: $MODIFIED
199*4d7e907cSAndroid Build Coastguard Worker
200*4d7e907cSAndroid Build Coastguard Worker-----------------------------------------------------------
201*4d7e907cSAndroid Build Coastguard WorkerWHAT WAS *NOT* DONE, and you need to do now:
202*4d7e907cSAndroid Build Coastguard Worker 1) You need to choose if the new HAL is optional or not for new devices.
203*4d7e907cSAndroid Build Coastguard Worker    Either add or replace $BASE_VERSION by $NEW_VERSION in
204*4d7e907cSAndroid Build Coastguard Worker    compatibility_matrices/compatibility_matrix.current.xml
205*4d7e907cSAndroid Build Coastguard Worker    Do not forget to update both the "audio" and "audio.effects" HAL'
206*4d7e907cSAndroid Build Coastguard Worker
207*4d7e907cSAndroid Build Coastguard Worker 2) Then you need to choose a device to update its audio HAL implementation:
208*4d7e907cSAndroid Build Coastguard Worker    a) Update the HAL manifest of your device: open your device manifest.xml
209*4d7e907cSAndroid Build Coastguard Worker       and replace $BASE_VERSION by $NEW_VERSION for both
210*4d7e907cSAndroid Build Coastguard Worker        - android.hardware.audio
211*4d7e907cSAndroid Build Coastguard Worker        - android.hardware.audio.effect
212*4d7e907cSAndroid Build Coastguard Worker    b) Go to your device device.mk (usually next to the manifest) and replace:
213*4d7e907cSAndroid Build Coastguard Worker        - android.hardware.audio@$BASE_VERSION-impl by
214*4d7e907cSAndroid Build Coastguard Worker          android.hardware.audio@$NEW_VERSION-impl
215*4d7e907cSAndroid Build Coastguard Worker        - android.hardware.audio.effect@$BASE_VERSION-impl by
216*4d7e907cSAndroid Build Coastguard Worker          android.hardware.audio.effect@$NEW_VERSION-impl
217*4d7e907cSAndroid Build Coastguard WorkerEOF
218