1#!/bin/bash -u
2#
3# Copyright 2016 Google Inc. All Rights Reserved.
4#
5# This script is intended to be used by binary_search_state.py, as
6# part of the binary search triage on Android NDK apps. This script simply
7# deletes all given objects, signaling gradle to execute a recompilation of said
8# object files.
9#
10
11# Input is a file, with newline seperated list of files we will be switching
12OBJ_LIST_FILE=$1
13
14# Check that number of arguments == 1
15if [ $# -ne 1 ] ; then
16  echo "ERROR:"
17  echo "Got multiple inputs to switch script!"
18  echo "Run binary_search_state.py with --file_args"
19  exit 1
20fi
21
22# Remove any file that's being switched. This is because Gradle only recompiles
23# if:
24#   1. The resultant object file doesn't exist
25#   2. The hash of the source file has changed
26#
27# Because we have no reliable way to edit the source file, we instead remove the
28# object file and have the compiler wrapper insert the file from the appropriate
29# cache (good or bad).
30#
31# Not entirely relevant to the Teapot example, but something to consider:
32# This removing strategy has the side effect that all switched items cause the
33# invocation of the compiler wrapper, which can add up and slow the build
34# process. With Android's source tree, Make checks the timestamp of the object
35# file. So we symlink in the appropriate file and touch it to tell Make it needs
36# to be relinked. This avoids having to call the compiler wrapper in the
37# majority of cases.
38#
39# However, a similar construct doesn't seem to exist in Gradle. It may be better
40# to add a build target to Gradle that will always relink all given object
41# files. This way we can avoid calling the compiler wrapper while Triaging and
42# save some time. Not really necessary
43
44cat $OBJ_LIST_FILE | xargs rm
45exit 0
46
47