Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: export/__init__.py
- Revision:
- 43:2a7da56ebd24
- Parent:
- 40:7d3fa6b99b2b
diff -r 2cf3f29fece1 -r 2a7da56ebd24 export/__init__.py
--- a/export/__init__.py Mon Nov 06 13:17:14 2017 -0600
+++ b/export/__init__.py Tue Sep 25 13:43:09 2018 -0500
@@ -15,53 +15,49 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+from __future__ import print_function, division, absolute_import
+
import sys
-from os.path import join, abspath, dirname, exists
+from os.path import join, abspath, dirname, exists, isfile
from os.path import basename, relpath, normpath, splitext
from os import makedirs, walk
import copy
from shutil import rmtree, copyfile
import zipfile
-ROOT = abspath(join(dirname(__file__), ".."))
-sys.path.insert(0, ROOT)
-from tools.build_api import prepare_toolchain
-from tools.build_api import scan_resources
-from tools.toolchains import Resources
-from tools.export import lpcxpresso, ds5_5, iar, makefile
-from tools.export import embitz, coide, kds, simplicity, atmelstudio, mcuxpresso
-from tools.export import sw4stm32, e2studio, zip, cmsis, uvision, cdt, vscode
-from tools.export import gnuarmeclipse
-from tools.export import qtcreator
-from tools.targets import TARGET_NAMES
+from ..resources import Resources, FileType, FileRef
+from ..config import ALLOWED_FEATURES
+from ..build_api import prepare_toolchain
+from ..targets import TARGET_NAMES
+from . import (lpcxpresso, ds5_5, iar, makefile, embitz, coide, kds, simplicity,
+ atmelstudio, mcuxpresso, sw4stm32, e2studio, zip, cmsis, uvision,
+ cdt, vscode, gnuarmeclipse, qtcreator, cmake, nb, cces, codeblocks)
EXPORTERS = {
- 'uvision5': uvision.Uvision,
- 'uvision': uvision.Uvision,
- 'lpcxpresso': lpcxpresso.LPCXpresso,
- 'gcc_arm': makefile.GccArm,
- 'make_gcc_arm': makefile.GccArm,
- 'make_armc5': makefile.Armc5,
- 'make_armc6': makefile.Armc6,
- 'make_iar': makefile.IAR,
- 'ds5_5': ds5_5.DS5_5,
- 'iar': iar.IAR,
- 'embitz' : embitz.EmBitz,
- 'coide' : coide.CoIDE,
- 'kds' : kds.KDS,
- 'simplicityv3' : simplicity.SimplicityV3,
- 'atmelstudio' : atmelstudio.AtmelStudio,
- 'sw4stm32' : sw4stm32.Sw4STM32,
- 'e2studio' : e2studio.E2Studio,
- 'eclipse_gcc_arm' : cdt.EclipseGcc,
- 'eclipse_iar' : cdt.EclipseIAR,
- 'eclipse_armc5' : cdt.EclipseArmc5,
- 'gnuarmeclipse': gnuarmeclipse.GNUARMEclipse,
- 'mcuxpresso': mcuxpresso.MCUXpresso,
- 'qtcreator': qtcreator.QtCreator,
- 'vscode_gcc_arm' : vscode.VSCodeGcc,
- 'vscode_iar' : vscode.VSCodeIAR,
- 'vscode_armc5' : vscode.VSCodeArmc5
+ u'uvision6': uvision.UvisionArmc6,
+ u'uvision5': uvision.UvisionArmc5,
+ u'make_gcc_arm': makefile.GccArm,
+ u'make_armc5': makefile.Armc5,
+ u'make_armc6': makefile.Armc6,
+ u'make_iar': makefile.IAR,
+ u'ds5_5': ds5_5.DS5_5,
+ u'iar': iar.IAR,
+ u'embitz' : embitz.EmBitz,
+ u'sw4stm32' : sw4stm32.Sw4STM32,
+ u'e2studio' : e2studio.E2Studio,
+ u'eclipse_gcc_arm' : cdt.EclipseGcc,
+ u'eclipse_iar' : cdt.EclipseIAR,
+ u'eclipse_armc5' : cdt.EclipseArmc5,
+ u'gnuarmeclipse': gnuarmeclipse.GNUARMEclipse,
+ u'mcuxpresso': mcuxpresso.MCUXpresso,
+ u'netbeans': nb.GNUARMNetbeans,
+ u'qtcreator': qtcreator.QtCreator,
+ u'vscode_gcc_arm' : vscode.VSCodeGcc,
+ u'vscode_iar' : vscode.VSCodeIAR,
+ u'vscode_armc5' : vscode.VSCodeArmc5,
+ u'cmake_gcc_arm': cmake.GccArm,
+ u'cces' : cces.CCES,
+ u'codeblocks': codeblocks.CodeBlocks
}
ERROR_MESSAGE_UNSUPPORTED_TOOLCHAIN = """
@@ -142,48 +138,6 @@
return EXPORTERS[ide], EXPORTERS[ide].TOOLCHAIN
-def rewrite_basepath(file_name, resources, export_path, loc):
- """ Replace the basepath of filename with export_path
-
- Positional arguments:
- file_name - the absolute path to a file
- resources - the resources object that the file came from
- export_path - the final destination of the file after export
- """
- new_f = join(loc, relpath(file_name, resources.file_basepath[file_name]))
- resources.file_basepath[new_f] = export_path
- return new_f
-
-
-def subtract_basepath(resources, export_path, loc=""):
- """ Rewrite all of the basepaths with the export_path
-
- Positional arguments:
- resources - the resource object to rewrite the basepaths of
- export_path - the final destination of the resources with respect to the
- generated project files
- """
- keys = ['s_sources', 'c_sources', 'cpp_sources', 'hex_files',
- 'objects', 'libraries', 'inc_dirs', 'headers', 'linker_script',
- 'lib_dirs']
- for key in keys:
- vals = getattr(resources, key)
- if isinstance(vals, set):
- vals = list(vals)
- if isinstance(vals, list):
- new_vals = []
- for val in vals:
- new_vals.append(rewrite_basepath(val, resources, export_path,
- loc))
- if isinstance(getattr(resources, key), set):
- setattr(resources, key, set(new_vals))
- else:
- setattr(resources, key, new_vals)
- elif vals:
- setattr(resources, key, rewrite_basepath(vals, resources,
- export_path, loc))
-
-
def generate_project_files(resources, export_path, target, name, toolchain, ide,
macros=None):
"""Generate the project files for a project
@@ -209,7 +163,25 @@
return files, exporter
-def zip_export(file_name, prefix, resources, project_files, inc_repos):
+def _inner_zip_export(resources, prj_files, inc_repos):
+ to_zip = sum((resources.get_file_refs(ftype) for ftype
+ in Resources.ALL_FILE_TYPES),
+ [])
+ to_zip.extend(FileRef(basename(pfile), pfile) for pfile in prj_files)
+ for dest, source in resources.get_file_refs(FileType.BLD_REF):
+ target_dir, _ = splitext(dest)
+ dest = join(target_dir, ".bld", "bldrc")
+ to_zip.append(FileRef(dest, source))
+ if inc_repos:
+ for dest, source in resources.get_file_refs(FileType.REPO_DIRS):
+ for root, _, files in walk(source):
+ for repo_file in files:
+ file_source = join(root, repo_file)
+ file_dest = join(dest, relpath(file_source, source))
+ to_zip.append(FileRef(file_dest, file_source))
+ return to_zip
+
+def zip_export(file_name, prefix, resources, project_files, inc_repos, notify):
"""Create a zip file from an exported project.
Positional Parameters:
@@ -219,43 +191,26 @@
project_files - a list of extra files to be added to the root of the prefix
directory
"""
+ to_zip_list = sorted(set(_inner_zip_export(
+ resources, project_files, inc_repos)))
+ total_files = len(to_zip_list)
+ zipped = 0
with zipfile.ZipFile(file_name, "w") as zip_file:
- for prj_file in project_files:
- zip_file.write(prj_file, join(prefix, basename(prj_file)))
- for loc, res in resources.iteritems():
- to_zip = (
- res.headers + res.s_sources + res.c_sources +\
- res.cpp_sources + res.libraries + res.hex_files + \
- [res.linker_script] + res.bin_files + res.objects + \
- res.json_files + res.lib_refs + res.lib_builds)
- if inc_repos:
- for directory in res.repo_dirs:
- for root, _, files in walk(directory):
- for repo_file in files:
- source = join(root, repo_file)
- to_zip.append(source)
- res.file_basepath[source] = res.base_path
- to_zip += res.repo_files
- for source in to_zip:
- if source:
- zip_file.write(
- source,
- join(prefix, loc,
- relpath(source, res.file_basepath[source])))
- for source in res.lib_builds:
- target_dir, _ = splitext(source)
- dest = join(prefix, loc,
- relpath(target_dir, res.file_basepath[source]),
- ".bld", "bldrc")
- zip_file.write(source, dest)
-
+ for dest, source in to_zip_list:
+ if source and isfile(source):
+ zip_file.write(source, join(prefix, dest))
+ zipped += 1
+ notify.progress("Zipping", source,
+ 100 * (zipped / total_files))
+ else:
+ zipped += 1
def export_project(src_paths, export_path, target, ide, libraries_paths=None,
- linker_script=None, notify=None, verbose=False, name=None,
- inc_dirs=None, jobs=1, silent=False, extra_verbose=False,
- config=None, macros=None, zip_proj=None, inc_repos=False,
- build_profile=None, app_config=None):
+ linker_script=None, notify=None, name=None, inc_dirs=None,
+ jobs=1, config=None, macros=None, zip_proj=None,
+ inc_repos=False, build_profile=None, app_config=None,
+ ignore=None):
"""Generates a project file and creates a zip archive if specified
Positional Arguments:
@@ -269,17 +224,14 @@
linker_script - path to the linker script for the specified target
notify - function is passed all events, and expected to handle notification
of the user, emit the events to a log, etc.
- verbose - assigns the notify function to toolchains print_notify_verbose
name - project name
inc_dirs - additional include directories
jobs - number of threads
- silent - silent build - no output
- extra_verbose - assigns the notify function to toolchains
- print_notify_verbose
config - toolchain's config object
macros - User-defined macros
zip_proj - string name of the zip archive you wish to creat (exclude arg
if you do not wish to create an archive
+ ignore - list of paths to add to mbedignore
"""
# Convert src_path to a list if needed
@@ -306,32 +258,23 @@
# Pass all params to the unified prepare_resources()
toolchain = prepare_toolchain(
paths, "", target, toolchain_name, macros=macros, jobs=jobs,
- notify=notify, silent=silent, verbose=verbose,
- extra_verbose=extra_verbose, config=config, build_profile=build_profile,
- app_config=app_config)
- # The first path will give the name to the library
+ notify=notify, config=config, build_profile=build_profile,
+ app_config=app_config, ignore=ignore)
+
toolchain.RESPONSE_FILES = False
if name is None:
name = basename(normpath(abspath(src_paths[0])))
- # Call unified scan_resources
- resource_dict = {loc: scan_resources(path, toolchain, inc_dirs=inc_dirs, collect_ignores=True)
- for loc, path in src_paths.iteritems()}
- resources = Resources()
+ resources = Resources(notify, collect_ignores=True)
+ resources.add_toolchain_labels(toolchain)
+ for loc, path in src_paths.items():
+ for p in path:
+ resources.add_directory(p, into_path=loc)
toolchain.build_dir = export_path
+ toolchain.config.load_resources(resources)
+ toolchain.set_config_data(toolchain.config.get_config_data())
config_header = toolchain.get_config_header()
- resources.headers.append(config_header)
- resources.file_basepath[config_header] = dirname(config_header)
-
- if zip_proj:
- subtract_basepath(resources, ".")
- for loc, res in resource_dict.iteritems():
- temp = copy.deepcopy(res)
- subtract_basepath(temp, ".", loc)
- resources.add(temp)
- else:
- for _, res in resource_dict.iteritems():
- resources.add(res)
+ resources.add_file_ref(FileType.HEADER, basename(config_header), config_header)
# Change linker script if specified
if linker_script is not None:
@@ -340,18 +283,14 @@
files, exporter = generate_project_files(resources, export_path,
target, name, toolchain, ide,
macros=macros)
- files.append(config_header)
if zip_proj:
- for resource in resource_dict.values():
- for label, res in resource.features.iteritems():
- if label not in toolchain.target.features:
- resource.add(res)
+ resources.add_features(ALLOWED_FEATURES)
if isinstance(zip_proj, basestring):
- zip_export(join(export_path, zip_proj), name, resource_dict,
- files + list(exporter.static_files), inc_repos)
+ zip_export(join(export_path, zip_proj), name, resources,
+ files + list(exporter.static_files), inc_repos, notify)
else:
- zip_export(zip_proj, name, resource_dict,
- files + list(exporter.static_files), inc_repos)
+ zip_export(zip_proj, name, resources,
+ files + list(exporter.static_files), inc_repos, notify)
else:
for static_file in exporter.static_files:
if not exists(join(export_path, basename(static_file))):
