android_build/tools/releasetools/merge_dynamic_partition_met...

150 lines
5.7 KiB
Python

#!/usr/bin/env python
# Copyright (c) 2019, The Linux Foundation. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
# * Neither the name of The Linux Foundation nor the names of its
# contributors may be used to endorse or promote products derived
# from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE US
"""
This script merges the contents of the dynamic_partition_metadata.txt
files from the qssi directory and the target directory, placing the merged
result in the merged dynamic partition metadata file.
Usage: merge_dynamic_partition_metadata.py [args]
--qssi-dpm-file : File containing QSSI dynamic partition
information generated during QSSI lunch make.
--target-dpm-file : File containing QSSI dynamic partition
information generated during target lunch make.
--merged-dpm-file : This file will contain collated metadata
information of dynamic partitions from qssi and target.
"""
from __future__ import print_function
import common
import sys
import os
import logging
logger = logging.getLogger(__name__)
OPTIONS = common.OPTIONS
OPTIONS.verbose = True
OPTIONS.qssi_dynamic_partition_metadata_file = None
OPTIONS.target_dynamic_partition_metadata_file = None
OPTIONS.merged_dynamic_partition_metadata_file = None
def merge_dynamic_partition_metadata(
qssi_dynamic_partition_metadata_file,
target_dynamic_partition_metadata_file,
merged_dynamic_partition_metadata_file):
"""
This function merges the contents of the dynamic_partition_metadata.txt
files from the qssi directory and the target directory, placing the merged
result in the merged dynamic partition metadata file.
Args:
qssi_dynamic_partition_metadata_file: File containing QSSI dynamic partition
information generated during QSSI lunch make.
target_dynamic_partition_metadata_file: File containing QSSI dynamic partition
information generated during target lunch make.
merged_dynamic_partition_metadata_file : This file will contain collated metadata
information of dynamic partitions from qssi and target.
"""
def read_helper(dynamic_metadata_file):
with open(dynamic_metadata_file) as f:
return list(f.read().splitlines())
qssi_metadata_dict = common.LoadDictionaryFromLines(
read_helper(qssi_dynamic_partition_metadata_file))
merged_metadata_dict = common.LoadDictionaryFromLines(
read_helper(target_dynamic_partition_metadata_file))
if merged_metadata_dict['use_dynamic_partitions'] == 'true':
merged_metadata_dict['dynamic_partition_list'] = '%s %s' % (
qssi_metadata_dict.get('dynamic_partition_list', ''),
merged_metadata_dict.get('dynamic_partition_list', ''))
else:
logger.warning("Dynamic patiitions is not enabled, Exiting!!")
sys.exit(1)
for partition_group in merged_metadata_dict['super_partition_groups'].split(' '):
key = 'super_%s_partition_list' % partition_group
merged_metadata_dict[key] = '%s %s' % (
qssi_metadata_dict.get(key, ''),
merged_metadata_dict.get(key, ''))
sorted_keys = sorted(merged_metadata_dict.keys())
if os.path.exists(merged_dynamic_partition_metadata_file):
os.remove(merged_dynamic_partition_metadata_file)
with open(merged_dynamic_partition_metadata_file, 'w') as merged_dpm_file:
for key in sorted_keys:
merged_dpm_file.write('{}={}\n'.format(key, merged_metadata_dict[key]))
logger.info("Generated merged dynamic partition metdata file : %s",merged_dynamic_partition_metadata_file)
def main():
common.InitLogging()
def option_handler(o, a):
if o == '--qssi-dpm-file':
OPTIONS.qssi_dynamic_partition_metadata_file = a
elif o == '--target-dpm-file':
OPTIONS.target_dynamic_partition_metadata_file = a
elif o == '--merged-dpm-file':
OPTIONS.merged_dynamic_partition_metadata_file = a
else:
return False
return True
args = common.ParseOptions(
sys.argv[1:], __doc__,
extra_long_opts=[
'qssi-dpm-file=',
'target-dpm-file=',
'merged-dpm-file=',
],
extra_option_handler=option_handler)
if (len(args) != 0 or
OPTIONS.qssi_dynamic_partition_metadata_file is None or
OPTIONS.target_dynamic_partition_metadata_file is None or
OPTIONS.merged_dynamic_partition_metadata_file is None):
common.Usage(__doc__)
sys.exit(1)
merge_dynamic_partition_metadata(
OPTIONS.qssi_dynamic_partition_metadata_file,
OPTIONS.target_dynamic_partition_metadata_file,
OPTIONS.merged_dynamic_partition_metadata_file)
if __name__ == '__main__':
main()