#!/bin/bash
# This script uses log file saved from make >log 2>&1. It parses and
# fixes the "file not found" errors by adding dependencies to reported
# modules' Android.mk file. It works for following types of issues:
# error: 'hardware/<file>.h' file not found
# error: 'system/<file>.h' file not found
# error: 'cutils/<file>.h' file not found
# error: 'utils/<file>.h' file not found
# error: 'log/<file>.h' file not found
#
# More can be added by expanding ADD_TO_*_LIBS string
#
# This script will create temp files log.<type> and log.<type>.paths
#
# This script requires manual intervention in 2 places:
# 1. Visually inspecting log.<type>.paths and removing undesirable lines
# 2. Manually checking in uncommitted files reported by repo status
if [ "$PWD" != "$ANDROID_BUILD_TOP" ]; then
echo "This script needs to be run at top level folder"
exit 1
fi
if [ ! -f "log" ]; then
echo "log file not found"
exit 1
fi
echo "Parsing log"
cat log | grep "FAILED\|error:" > log.error
#libs that should be added to LOCAL_HEADER_LIBRARIES
ADD_TO_HEADER_LIBS=(hardware system cutils utils)
#libs that should be added to LOCAL_SHARED_LIBRARIES
ADD_TO_SHARED_LIBS=(log)
ALL_LIBS=(${ADD_TO_HEADER_LIBS[@]} ${ADD_TO_SHARED_LIBS[@]})
for lib in "${ALL_LIBS[@]}"; do
echo "Parsing log.error for $lib"
cat log.error | grep -B1 "error: '$lib\/" | grep FAILED | awk 'BEGIN{FS="_intermediates"}{print $1}' | awk 'BEGIN{FS="S/";}{print $2}' | sort -u > log.$lib
echo "Parsing log.$lib"
for module in `cat log.$lib`; do find . -name Android.\* | xargs grep -w -H $module | grep "LOCAL_MODULE\|name:"; done > log.$lib.paths
echo "Please inspect log.$lib.paths and remove lines for devices other than the one you are compiling for."
echo "Also remove duplicate makefile paths, even if they have different module names."
echo "Then press Enter"
read enter
if [ -s "log.$lib.paths" ]; then
not_vendor_list=`cat log.$lib.paths | awk 'BEGIN{FS=":"}{print $1}' | xargs grep -L 'LOCAL_PROPRIETARY_MODULE\|LOCAL_VENDOR_MODULE'`
else
not_vendor_list=
fi
if [ ! -z "$not_vendor_list" ]; then
echo "These modules do NOT have proprietary or vendor flag set."
printf "%s\n" $not_vendor_list
echo "Please check the makefile and update log."$lib".paths, then press Enter"
read enter
fi
done
for lib in "${ADD_TO_HEADER_LIBS[@]}"; do
echo "Patching makefiles to fix "$lib" errors"
cat log.$lib.paths | awk 'BEGIN{FS=":"}{print $1}' | xargs sed -i '/include \$(BUILD/i LOCAL_HEADER_LIBRARIES += lib'$lib'_headers'
echo "Checking for unsaved files"
repo status
echo "Please COMMIT them, then press Enter:"
read enter
done
for lib in "${ADD_TO_SHARED_LIBS[@]}"; do
echo "Patching makefiles to fix "$lib" errors"
if [ $lib -eq "log" ]; then
cat log.$lib.paths | awk 'BEGIN{FS=":"}{print $1}' | xargs sed -i '/include \$(BUILD/i ifdef BOARD_VNDK_VERSION\nLOCAL_SHARED_LIBRARIES += lib'$lib'\nendif'
else
cat log.$lib.paths | awk 'BEGIN{FS=":"}{print $1}' | xargs sed -i '/include \$(BUILD/i LOCAL_SHARED_LIBRARIES += lib'$lib
fi
echo "Checking for unsaved files"
repo status
echo "Please COMMIT them, then press Enter:"
read enter
done