Nicolas Borla
/
BBR_1Ebene
BBR 1 Ebene
Diff: mbed-os/tools/options.py
- Revision:
- 0:fbdae7e6d805
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-os/tools/options.py Mon May 14 11:29:06 2018 +0000 @@ -0,0 +1,138 @@ +""" +mbed SDK +Copyright (c) 2011-2013 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. +""" +from __future__ import print_function, division, absolute_import + +from json import load +from os.path import join, dirname +from os import listdir +from argparse import ArgumentParser, ArgumentTypeError + +from .toolchains import TOOLCHAINS +from .targets import TARGET_NAMES, Target, update_target_data +from .utils import (argparse_force_uppercase_type, argparse_deprecate, + argparse_lowercase_hyphen_type, argparse_many, + argparse_filestring_type, args_error, + argparse_profile_filestring_type) + +FLAGS_DEPRECATION_MESSAGE = "Please use the --profile argument instead.\n"\ + "Documentation may be found in "\ + "docs/Toolchain_Profiles.md" + +def get_default_options_parser(add_clean=True, add_options=True, + add_app_config=False): + """Create a new options parser with the default compiler options added + + Keyword arguments: + add_clean - add the clean argument? + add_options - add the options argument? + """ + parser = ArgumentParser() + + targetnames = TARGET_NAMES + targetnames.sort() + toolchainlist = list(TOOLCHAINS) + toolchainlist.sort() + + parser.add_argument("-m", "--mcu", + help=("build for the given MCU (%s)" % + ', '.join(targetnames)), + metavar="MCU") + + parser.add_argument("-t", "--tool", + help=("build using the given TOOLCHAIN (%s)" % + ', '.join(toolchainlist)), + metavar="TOOLCHAIN", + type=argparse_many( + argparse_force_uppercase_type( + toolchainlist, "toolchain"))) + + parser.add_argument("--color", + help="print Warnings, and Errors in color", + action="store_true", default=False) + + parser.add_argument("--cflags", + type=argparse_deprecate(FLAGS_DEPRECATION_MESSAGE), + help="Deprecated. " + FLAGS_DEPRECATION_MESSAGE) + + parser.add_argument("--asmflags", + type=argparse_deprecate(FLAGS_DEPRECATION_MESSAGE), + help="Deprecated. " + FLAGS_DEPRECATION_MESSAGE) + + parser.add_argument("--ldflags", + type=argparse_deprecate(FLAGS_DEPRECATION_MESSAGE), + help="Deprecated. " + FLAGS_DEPRECATION_MESSAGE) + + if add_clean: + parser.add_argument("-c", "--clean", action="store_true", default=False, + help="clean the build directory") + + if add_options: + parser.add_argument("--profile", dest="profile", action="append", + type=argparse_profile_filestring_type, + help="Build profile to use. Can be either path to json" \ + "file or one of the default one ({})".format(", ".join(list_profiles())), + default=[]) + if add_app_config: + parser.add_argument("--app-config", default=None, dest="app_config", + type=argparse_filestring_type, + help="Path of an app configuration file (Default is to look for 'mbed_app.json')") + + return parser + +def list_profiles(): + """Lists available build profiles + + Checks default profile directory (mbed-os/tools/profiles/) for all the json files and return list of names only + """ + return [fn.replace(".json", "") for fn in listdir(join(dirname(__file__), "profiles")) if fn.endswith(".json")] + +def extract_profile(parser, options, toolchain, fallback="develop"): + """Extract a Toolchain profile from parsed options + + Positional arguments: + parser - parser used to parse the command line arguments + options - The parsed command line arguments + toolchain - the toolchain that the profile should be extracted for + """ + profiles = [] + filenames = options.profile or [join(dirname(__file__), "profiles", + fallback + ".json")] + for filename in filenames: + contents = load(open(filename)) + if toolchain not in contents: + args_error(parser, ("argument --profile: toolchain {} is not" + " supported by profile {}").format(toolchain, + filename)) + profiles.append(contents) + + return profiles + +def extract_mcus(parser, options): + try: + if options.source_dir: + for source_dir in options.source_dir: + Target.add_extra_targets(source_dir) + update_target_data() + except KeyError: + pass + targetnames = TARGET_NAMES + targetnames.sort() + try: + return argparse_many(argparse_force_uppercase_type(targetnames, "MCU"))(options.mcu) + except ArgumentTypeError as exc: + args_error(parser, "argument -m/--mcu: {}".format(str(exc))) +