def build_argparser(): common_args = argparse.ArgumentParser(add_help=False) common_args.add_argument( "--scratch-path", help="Where to maintain checkouts and build dirs" ) common_args.add_argument( "--install-prefix", help=( "Where the final build products will be installed " "(default is [scratch-path]/installed)" ), ) common_args.add_argument( "--num-jobs", type=int, help=( "Number of concurrent jobs to use while building. " "(default=number of cpu cores)" ), ) common_args.add_argument( "--use-shipit", help="use the real ShipIt instead of the simple shipit transformer", action="store_true", default=False, ) common_args.add_argument( "--facebook-internal", help="Setup the build context as an FB internal build", action="store_true", default=False, ) ap = argparse.ArgumentParser( description="Get and build dependencies and projects", parents=[common_args] ) sub = ap.add_subparsers( # metavar suppresses the long and ugly default list of subcommands on a # single line. We still render the nicer list below where we would # have shown the nasty one. metavar="", title="Available commands", help="", ) add_subcommands(sub, common_args) return ap
def parse_args(): # We want to allow common arguments to be specified either before or after # the subcommand name. In order to do this we add them to the main parser # and to subcommand parsers. In order for this to work, we need to tell # argparse that the default value is SUPPRESS, so that the default values # from the subparser arguments won't override values set by the user from # the main parser. We maintain our own list of desired defaults in the # common_defaults dictionary, and manually set those if the argument wasn't # present at all. common_args = argparse.ArgumentParser(add_help=False) common_defaults = {} def add_common_arg(*args, **kwargs): var_name = get_arg_var_name(args) default_value = kwargs.pop("default", None) common_defaults[var_name] = default_value kwargs["default"] = argparse.SUPPRESS common_args.add_argument(*args, **kwargs) add_common_arg("--scratch-path", help="Where to maintain checkouts and build dirs") add_common_arg("--vcvars-path", default=None, help="Path to the vcvarsall.bat on Windows.") add_common_arg( "--install-prefix", help=("Where the final build products will be installed " "(default is [scratch-path]/installed)"), ) add_common_arg( "--num-jobs", type=int, help=("Number of concurrent jobs to use while building. " "(default=number of cpu cores)"), ) add_common_arg( "--use-shipit", help="use the real ShipIt instead of the simple shipit transformer", action="store_true", default=False, ) add_common_arg( "--facebook-internal", help="Setup the build context as an FB internal build", action="store_true", default=None, ) add_common_arg( "--no-facebook-internal", help= "Perform a non-FB internal build, even when in an fbsource repository", action="store_false", dest="facebook_internal", ) add_common_arg( "--allow-system-packages", help="Allow satisfying third party deps from installed system packages", action="store_true", default=False, ) ap = argparse.ArgumentParser( description="Get and build dependencies and projects", parents=[common_args]) sub = ap.add_subparsers( # metavar suppresses the long and ugly default list of subcommands on a # single line. We still render the nicer list below where we would # have shown the nasty one. metavar="", title="Available commands", help="", ) add_subcommands(sub, common_args) args = ap.parse_args() for var_name, default_value in common_defaults.items(): if not hasattr(args, var_name): setattr(args, var_name, default_value) return ap, args