mirror of https://github.com/ARMmbed/mbed-os.git
110 lines
3.3 KiB
Python
110 lines
3.3 KiB
Python
#! /usr/bin/env python2
|
|
"""
|
|
mbed SDK
|
|
Copyright (c) 2019 ARM Limited
|
|
|
|
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.
|
|
|
|
LIBRARIES BUILD
|
|
"""
|
|
from __future__ import print_function, division, absolute_import
|
|
|
|
import sys
|
|
from os.path import join, abspath, dirname, normpath
|
|
import json
|
|
from shutil import copyfile
|
|
from argparse import ArgumentParser
|
|
from copy import copy
|
|
|
|
# Be sure that the tools directory is in the search path
|
|
ROOT = abspath(join(dirname(__file__), "../../../"))
|
|
sys.path.insert(0, ROOT)
|
|
|
|
from tools.regions import merge_region_list, UPDATE_WHITELIST
|
|
from tools.notifier.term import TerminalNotifier
|
|
from tools.config import Region
|
|
from tools.utils import split_path, run_cmd_ext, generate_update_filename
|
|
|
|
|
|
if __name__ == "__main__":
|
|
parser = ArgumentParser()
|
|
|
|
parser.add_argument(
|
|
"toolchain_path",
|
|
help="Path to the Keil folder"
|
|
)
|
|
|
|
parser.add_argument(
|
|
"linker_output",
|
|
help="Path to the built axf file"
|
|
)
|
|
|
|
options = parser.parse_args()
|
|
axf_file = normpath(options.linker_output)
|
|
output_directory, output_name, output_ext = split_path(axf_file)
|
|
hex_file = join(output_directory, output_name + ".hex")
|
|
combined_hex_file = join(output_directory, output_name + "_combined.hex")
|
|
|
|
command = [
|
|
join(normpath(options.toolchain_path), "ARM/ARMCC/bin/fromelf.exe"),
|
|
"--i32", "--output", hex_file, axf_file
|
|
]
|
|
stdout, stderr, retcode = run_cmd_ext(command)
|
|
|
|
if retcode:
|
|
err_msg = (
|
|
"Failed to convert axf to hex.\r\n"
|
|
"Command: {}\r\n"
|
|
"retcode: {}\r\n"
|
|
"stdout: {}\r\n"
|
|
"stderr: {}"
|
|
).format(command, retcode, stdout, stderr)
|
|
raise Exception(err_msg)
|
|
|
|
with open(join("export_info.json"), "r") as export_info_file:
|
|
export_info_data = json.load(export_info_file)
|
|
|
|
region_list = [Region(*r) for r in export_info_data.get("region_list", [])]
|
|
|
|
for index, region in enumerate(copy(region_list)):
|
|
if region.name == "application":
|
|
region_data = region._asdict()
|
|
region_data["filename"] = hex_file
|
|
region_list[index] = Region(**region_data)
|
|
break
|
|
else:
|
|
raise Exception("No application region found")
|
|
|
|
notify = TerminalNotifier()
|
|
restrict_size = export_info_data.get("target", {}).get("restrict_size")
|
|
merge_region_list(
|
|
region_list, combined_hex_file, notify, restrict_size=restrict_size
|
|
)
|
|
|
|
update_regions = [
|
|
r for r in region_list if r.name in UPDATE_WHITELIST
|
|
]
|
|
|
|
if update_regions:
|
|
update_res = normpath(
|
|
join(
|
|
output_directory,
|
|
generate_update_filename(output_name, None)
|
|
)
|
|
)
|
|
merge_region_list(
|
|
update_regions, update_res, notify, restrict_size=restrict_size
|
|
)
|
|
|
|
sys.exit(0)
|