Skip to content

Commit

Permalink
Merge pull request #1 from mbrossard/feature/gcc
Browse files Browse the repository at this point in the history
Feature/gcc improvements
  • Loading branch information
flit committed Dec 5, 2020
2 parents 05e9dc2 + a86ad37 commit dfaec3d
Show file tree
Hide file tree
Showing 7 changed files with 177 additions and 30 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ tmp/
*.axf
*.S19
*.bin
*.hex
*.dep
*.FLM

Expand Down
2 changes: 1 addition & 1 deletion test/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
("k20dx_mimxrt1050_evk_hyper_if", True, 0x8000, "bin" ),
("k20dx_mimxrt1050_evk_qspi_if", True, 0x8000, "bin" ),
('k20dx_ep_agora_if', True, 0x0000, "bin" ),
('k20dx_ep_kairos_if', True, 0x0000, "bin" ),
('k20dx_ep_kairos_if', True, 0x0000, "bin" ),
("k26f_frdmk32w042_if", False, 0x8000, "bin" ),
("lpc11u35_archble_if", False, 0x0000, "bin" ),
("lpc11u35_archpro_if", False, 0x0000, "bin" ),
Expand Down
3 changes: 0 additions & 3 deletions tools/make_update_yml.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,7 @@

import logging

logging.basicConfig(format='Line: %(lineno)d %(message)s')
logger = logging.getLogger('yaml gen')
logger.setLevel(logging.DEBUG)


class DefaultList(list):
def sort(self, *args, **kwargs):
Expand Down
3 changes: 2 additions & 1 deletion tools/mbedcli_compile.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ def main():
shutil.rmtree(release_dir, ignore_errors=True)
print("Releasing directory: " + release_dir)
toolchain_dir = args.toolchain+"-CUSTOM_PROFILE"
package_release_files(args.build_folder, release_dir, release_version, toolchain_dir)
package_release_files(args.build_folder, release_dir, release_version, toolchain_dir,
info.PROJECT_RELEASE_INFO, info.SUPPORTED_CONFIGURATIONS)

main()
47 changes: 23 additions & 24 deletions tools/package_release_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,21 +22,8 @@
import argparse
import yaml
import subprocess

self_path = os.path.abspath(__file__)
tools_dir = os.path.dirname(self_path)
daplink_dir = os.path.dirname(tools_dir)
test_dir = os.path.join(daplink_dir, "test")
sys.path.append(test_dir)

import info

from make_update_yml import DefaultList
from make_update_yml import TargetList
from make_update_yml import InstructionsText
from make_update_yml import make_update_yml_file

import zipfile
from make_update_yml import DefaultList, TargetList, InstructionsText, make_update_yml_file

def make_bin_zip(dir, name):
working_dir = os.getcwd()
Expand All @@ -48,8 +35,7 @@ def make_bin_zip(dir, name):
#go back
os.chdir(working_dir)

def package_release_files(source, dest, version, toolchain):

def package_release_files(source, dest, version, toolchain, release_info, supported_configurations):
proj_dir = source
output_dir = dest
build_number = "%04i" % version
Expand All @@ -67,14 +53,18 @@ def package_release_files(source, dest, version, toolchain):

os.mkdir(output_dir)

for prj_name, legacy, offset, extension in info.PROJECT_RELEASE_INFO:
for prj_name, legacy, offset, extension in release_info:
legacy_str = "_legacy" if legacy else ""
source_offset_str = "_0x%04x" % offset if legacy else ""
source_name = prj_name + "_crc" + legacy_str + source_offset_str + "." + extension
source_dir_part = os.path.join(proj_dir, prj_name, toolchain).upper()
# The build path hierarchy is different between mbedcli and progen
if toolchain.startswith("projectfiles"):
source_dir_part = os.path.join(toolchain, prj_name, proj_dir)
else:
source_dir_part = os.path.join(proj_dir, prj_name, toolchain).upper()
source_path = os.path.join(source_dir_part, source_name)
if not os.path.isfile(source_path):
print("Warning %s not added to release" % prj_name)
print("Warning %s not added to release (expected file '%s')" % (prj_name, source_path))
continue
items = prj_name.split('_') # "k20dx_frdmk22f_if" -> ("k20dx", "frdmk22f", "if")
assert items[-1] == "if", "Unexpected string: %s" % items[2]
Expand All @@ -86,7 +76,7 @@ def package_release_files(source, dest, version, toolchain):
shutil.copyfile(source_path, dest_path)

product_code = 'NOT SUPPORTED'
for board_id, family_id, fimware, bootloader, target in info.SUPPORTED_CONFIGURATIONS:
for board_id, family_id, fimware, bootloader, target in supported_configurations:
if fimware == prj_name:
product_code = board_id
if target is not None:
Expand All @@ -98,28 +88,37 @@ def package_release_files(source, dest, version, toolchain):
for fw_name_key in InstructionsText:
if fw_name_key in dest_name.lower():
fw_instuction = InstructionsText[fw_name_key]
break;
break

if extension == 'bin':
update_yml_entries.append({target_name:TargetList([
('name', target_name),
('product_code', "'" + format(product_code, '04x') + "'"),
('fw_name', host_mcu + "_" + base_name + dest_offset_str),
('instructions', fw_instuction)
])});
])})

make_bin_zip(output_dir, build_number + '_release_package_' + subprocess.check_output(['git', 'rev-parse', '--short', 'HEAD']).decode().strip() + '.zip')

make_update_yml_file(os.path.join(output_dir, 'update.yml'), update_yml_entries, explicit_start=True)

if __name__ == "__main__":
self_path = os.path.abspath(__file__)
tools_dir = os.path.dirname(self_path)
daplink_dir = os.path.dirname(tools_dir)
test_dir = os.path.join(daplink_dir, "test")
sys.path.append(test_dir)

import info

parser = argparse.ArgumentParser(description='Package a release for distribution')
parser.add_argument('source', help='Release directory to grab files from')
parser.add_argument('dest', help='Directory to create and place files in')
parser.add_argument('version', type=int, help='Version number of this release')
parser.add_argument('--toolchain', type=str, default='', help='Toolchain directory if present')
args = parser.parse_args()

print("args",args.source,args.dest,args.version,args.toolchain)
print("args", args.source, args.dest, args.version, args.toolchain)

package_release_files(args.source,args.dest,args.version,args.toolchain)
package_release_files(args.source, args.dest, args.version, args.toolchain,
info.PROJECT_RELEASE_INFO, info.SUPPORTED_CONFIGURATIONS)
2 changes: 1 addition & 1 deletion tools/pre_build_script.sh
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
TOOLS=../../../tools
DIR=../../../source/daplink

python --version
# python --version

# Run python script to delete default version_git.h and create the real one
python ${TOOLS}/pre_build_script.py --version_git_dir=${DIR}
149 changes: 149 additions & 0 deletions tools/progen_compile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
#!/usr/bin/env python
#
# DAPLink Interface Firmware
# Copyright (c) 2009-2020, ARM Limited, All Rights Reserved
# SPDX-License-Identifier: Apache-2.0
#
# 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.
#

from package_release_files import package_release_files
from post_build_script import post_build_script
from project_generator import generate
from pre_build_script import generate_version_file
import argparse
import logging
import shutil
import yaml
import sys
import os

self_path = os.path.abspath(__file__)
tools_dir = os.path.dirname(self_path)
daplink_dir = os.path.dirname(tools_dir)

PROJECTS_YAML = os.path.join(daplink_dir, "projects.yaml")
VERSION_YAML = os.path.join(daplink_dir, "records", "tools", "version.yaml")

def load_project_list(path):
project_list = []
with open(path, 'r') as top_yaml:
try:
topdict = yaml.safe_load(top_yaml)
for dict_key in topdict:
if dict_key == 'projects':
for project in topdict[dict_key]:
project_list.append(project)
break
except yaml.YAMLError as ex:
print("Found yaml parse error", ex)
return project_list


def build_projects(file, projects, tool, build=True, clean=False, ignore_errors=True):
generator = generate.Generator(file)
cores = 4
try:
import multiprocessing
cores = multiprocessing.cpu_count()
except:
pass

for p_name in projects:
for project in generator.generate(p_name):
failed = False
if hasattr(project, 'workspace_name') and (project.workspace_name is not None):
logger.info("Generating %s for %s in workspace %s", tool, project.name, project.workspace_name)
else:
logger.info("Generating %s for %s", tool, project.name)
if clean:
if project.clean(tool) == -1:
logger.error("Error cleaning project %s", project.name)
failed = True
if not failed and project.generate(tool) == -1:
logger.error("Error generating project %s", project.name)
failed = True
if build and not failed:
if project.build(tool, jobs=cores) == -1:
logger.error("Error building project %s", project.name)
failed = True
if failed and not ignore_errors:
return -1

project_list = load_project_list(PROJECTS_YAML)
parser = argparse.ArgumentParser(description='project-generator compile support for DAPLink',
epilog="List of supported projects (%d): %s" % (len(project_list), ", ".join(project_list)),
formatter_class=argparse.RawDescriptionHelpFormatter)
parser.add_argument('projects', help='Selectively compile only the firmware specified otherwise all projects',
nargs='*', type=str, default=[])
parser.add_argument('--release', dest='release', action='store_true', help='Create a release with the yaml version file')
parser.add_argument('--release-folder', type=str, default='firmware', help='Directory to create and place files in')
parser.add_argument('--toolchain', type=str, default='GCC', help='Toolchain ("GCC" or "ARM", default: %(default)s',
choices=['GCC', 'ARM'])
parser.add_argument('--clean', dest='clean', action='store_true', help='Rebuild or delete build folder before compile')
parser.add_argument('-v', dest='verbosity', action='count', help='Increase verbosity (can be specify multiple times)', default=0)
parser.set_defaults(build=True)
parser.set_defaults(clean=False)
parser.set_defaults(release=False)
args = parser.parse_args()

toolchain = "make_gcc_arm" if args.toolchain in ['GCC'] else 'make_armcc'
logging_level = logging.DEBUG if args.verbosity >= 2 else (logging.INFO if args.verbosity >= 1 else logging.WARNING)
# logging_level = logging.DEBUG
logging.basicConfig(format="%(asctime)s %(name)020s %(levelname)s\t%(message)s", level=logging_level)
logger = logging.getLogger('progen_build')

if args.release:
sys.path.append(os.path.join(daplink_dir, "test"))
from info import SUPPORTED_CONFIGURATIONS, PROJECT_RELEASE_INFO
version_git_dir = os.path.join(daplink_dir, "source", "daplink")
generate_version_file(version_git_dir)

projects = args.projects if len(args.projects) > 0 else project_list
print(projects)
build_projects(PROJECTS_YAML, projects, toolchain, args.build, args.clean)

if args.release:
id_map = {}
for board_id, family_id, firmware, bootloader, target in SUPPORTED_CONFIGURATIONS:
if firmware in id_map:
id_map[firmware].append((hex(board_id), hex(family_id)))
else:
id_map[firmware] = [(hex(board_id), hex(family_id))]
for project in projects:
output = "projectfiles/%s/%s/build/%s" % (toolchain, project, project)
hex = output + ".hex"
crc = output + "_crc"
post_build_script(hex, crc)
# do a build with board_id and family_id
if project in id_map:
for (boardid, familyid) in id_map[project]:
print(project, boardid, familyid)
post_build_script(hex, crc, boardid, familyid)

if args.release:
release_version = 0
with open(VERSION_YAML, 'r') as ver_yaml:
try:
verdict = yaml.safe_load(ver_yaml)
release_version = int(verdict['common']['macros'][0].split('=')[1])
except yaml.YAMLError as ex:
print("Found yaml parse error", ex)

release_dir = args.release_folder + "_%04i" % release_version
if os.path.exists(release_dir):
logger.info("Deleting: %s" % release_dir)
shutil.rmtree(release_dir, ignore_errors=True)
logger.info("Releasing directory: %s" % release_dir)
package_release_files("build", release_dir, release_version, "projectfiles/" + toolchain,
PROJECT_RELEASE_INFO, SUPPORTED_CONFIGURATIONS)

0 comments on commit dfaec3d

Please sign in to comment.