1#!/bin/bash 2# This script uses log file saved from make >log 2>&1. It parses and 3# fixes the "file not found" errors by adding dependencies to reported 4# modules' Android.mk file. It works for following types of issues: 5# error: 'hardware/<file>.h' file not found 6# error: 'system/<file>.h' file not found 7# error: 'cutils/<file>.h' file not found 8# error: 'utils/<file>.h' file not found 9# error: 'log/<file>.h' file not found 10# 11# More can be added by expanding ADD_TO_*_LIBS string 12# 13# This script will create temp files log.<type> and log.<type>.paths 14# 15# This script requires manual intervention in 2 places: 16# 1. Visually inspecting log.<type>.paths and removing undesirable lines 17# 2. Manually checking in uncommitted files reported by repo status 18 19 20if [ "$PWD" != "$ANDROID_BUILD_TOP" ]; then 21 echo "This script needs to be run at top level folder" 22 exit 1 23fi 24if [ ! -f "log" ]; then 25 echo "log file not found" 26 exit 1 27fi 28 29echo "Parsing log" 30cat log | grep "FAILED\|error:" > log.error 31 32#libs that should be added to LOCAL_HEADER_LIBRARIES 33ADD_TO_HEADER_LIBS=(hardware system cutils utils) 34 35#libs that should be added to LOCAL_SHARED_LIBRARIES 36ADD_TO_SHARED_LIBS=(log) 37 38ALL_LIBS=(${ADD_TO_HEADER_LIBS[@]} ${ADD_TO_SHARED_LIBS[@]}) 39 40for lib in "${ALL_LIBS[@]}"; do 41 echo "Parsing log.error for $lib" 42 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 43 44 echo "Parsing log.$lib" 45 for module in `cat log.$lib`; do find . -name Android.\* | xargs grep -w -H $module | grep "LOCAL_MODULE\|name:"; done > log.$lib.paths 46 47 echo "Please inspect log.$lib.paths and remove lines for devices other than the one you are compiling for." 48 echo "Also remove duplicate makefile paths, even if they have different module names." 49 echo "Then press Enter" 50 read enter 51 if [ -s "log.$lib.paths" ]; then 52 not_vendor_list=`cat log.$lib.paths | awk 'BEGIN{FS=":"}{print $1}' | xargs grep -L 'LOCAL_PROPRIETARY_MODULE\|LOCAL_VENDOR_MODULE'` 53 else 54 not_vendor_list= 55 fi 56 if [ ! -z "$not_vendor_list" ]; then 57 echo "These modules do NOT have proprietary or vendor flag set." 58 printf "%s\n" $not_vendor_list 59 echo "Please check the makefile and update log."$lib".paths, then press Enter" 60 read enter 61 fi 62done 63 64for lib in "${ADD_TO_HEADER_LIBS[@]}"; do 65 echo "Patching makefiles to fix "$lib" errors" 66 cat log.$lib.paths | awk 'BEGIN{FS=":"}{print $1}' | xargs sed -i '/include \$(BUILD/i LOCAL_HEADER_LIBRARIES += lib'$lib'_headers' 67 echo "Checking for unsaved files" 68 repo status 69 echo "Please COMMIT them, then press Enter:" 70 read enter 71done 72 73for lib in "${ADD_TO_SHARED_LIBS[@]}"; do 74 echo "Patching makefiles to fix "$lib" errors" 75 if [ $lib -eq "log" ]; then 76 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' 77 else 78 cat log.$lib.paths | awk 'BEGIN{FS=":"}{print $1}' | xargs sed -i '/include \$(BUILD/i LOCAL_SHARED_LIBRARIES += lib'$lib 79 fi 80 echo "Checking for unsaved files" 81 repo status 82 echo "Please COMMIT them, then press Enter:" 83 read enter 84done 85 86