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