android_build/tools/diff_package_overlays.py
Ying Wang 71004f8135 Clean common intermediate files if overlay changed
This change cleans the packages' intermediate files if their overlays
changed between incremental builds.
If two builds have different overlay, they will have different R
classes, and so the jar files in the common intermediate dirs can
not be shared. Therefore incremental build can't be applied.

This change detects the overlay changes on package's base.
If a package's overlay is different from the previous build, its common
intermediate dir is nuked.
This makes broader incremental builds possible.

Change-Id: I368610ebbbbc85a80f9aecd714ab22cd78da7f12
2012-06-04 18:02:55 -07:00

92 lines
2.9 KiB
Python
Executable File

#!/usr/bin/env python
#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Prints to stdout the package names that have overlay changes between
current_overlays.txt and previous_overlays.txt.
Usage: diff_package_overlays.py <current_packages.txt> <current_overlays.txt> <previous_overlays.txt>
current_packages.txt contains all package names separated by space in the current build.
This script modfies current_packages.txt if necessary: if there is a package in
previous_overlays.txt but absent from current_packages.txt, we copy that line
from previous_overlays.txt over to current_packages.txt. Usually that means we
just don't care that package in the current build (for example we are switching
from a full build to a partial build with mm/mmm), and we should carry on the
previous overlay config so current_overlays.txt always reflects the current
status of the entire tree.
Format of current_overlays.txt and previous_overlays.txt:
<package_name> <resource_overlay> [resource_overlay ...]
<package_name> <resource_overlay> [resource_overlay ...]
...
"""
import sys
def main(argv):
if len(argv) != 4:
print >> sys.stderr, __doc__
sys.exit(1)
f = open(argv[1])
all_packages = set(f.read().split())
f.close()
def load_overlay_config(filename):
f = open(filename)
result = {}
for line in f:
line = line.strip()
if not line or line.startswith("#"):
continue
words = line.split()
result[words[0]] = " ".join(words[1:])
f.close()
return result
current_overlays = load_overlay_config(argv[2])
previous_overlays = load_overlay_config(argv[3])
result = []
carryon = []
for p in current_overlays:
if p not in previous_overlays:
result.append(p)
elif current_overlays[p] != previous_overlays[p]:
result.append(p)
for p in previous_overlays:
if p not in current_overlays:
if p in all_packages:
# overlay changed
result.append(p)
else:
# we don't build p in the current build.
carryon.append(p)
# Add carryon to the current overlay config file.
if carryon:
f = open(argv[2], "a")
for p in carryon:
f.write(p + " " + previous_overlays[p] + "\n")
f.close()
# Print out the package names that have overlay change.
for r in result:
print r
if __name__ == "__main__":
main(sys.argv)