#!/usr/bin/env python # # Copyright (c) 2016 Stefan Seefeld # All rights reserved. # # This file is part of Faber. It is made available under the # Boost Software License, Version 1.0. # (Consult LICENSE or http://www.boost.org/LICENSE_1_0.txt) import argparse class PosArgsParser(argparse.Action): def __init__(self, option_strings, dest, **kwds): argparse.Action.__init__(self, option_strings, dest, **kwds) # Separates positional arguments into targets and parameters def __call__(self, parser, namespace, values, option_string=None): if namespace.parameters is None: namespace.parameters={} if not namespace.goals: namespace.goals=[] for v in values: if '=' in v: name, value = v.split('=', 1) if name in namespace.parameters: if type(namespace.parameters[name]) is not list: namespace.parameters[name] = [namespace.parameters[name]] namespace.parameters[name].append(value) else: namespace.parameters[name] = value else: namespace.goals.append(v) def make_parser(prog='faber'): parser = argparse.ArgumentParser(prog=prog, description='Faber is a construction tool.') parser.add_argument('goals', metavar='GOAL', nargs='*', action=PosArgsParser, help='a goal to update') parser.add_argument('parameters', metavar='PARAMETER=VALUE', nargs='*', action=PosArgsParser, help='a parameter value') parser.add_argument('--info', action='store_true', help='print information about the build logic') return parser def main(argv): parser = make_parser(argv[0]) args = parser.parse_args(argv[1:]) if __name__ == '__main__': import sys sys.exit(0 if main(sys.argv) else 1)