aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/llvm.py106
1 files changed, 106 insertions, 0 deletions
diff --git a/scripts/llvm.py b/scripts/llvm.py
new file mode 100644
index 0000000..762f9e7
--- /dev/null
+++ b/scripts/llvm.py
@@ -0,0 +1,106 @@
+"""This is the main tool for handling llvm builds, bisects etc."""
+
+import os
+from sys import exit
+
+from modules.llvm import LLVMSubproject, LLVMSourceConfig
+from linaropy.git.clone import Clone
+from linaropy.proj import Proj
+
+from argparse import Action, ArgumentParser, RawTextHelpFormatter
+
+
+def die(message, config_to_dump=None):
+ """Print an error message and exit."""
+ print message
+
+ if config_to_dump is not None:
+ dump_config(config_to_dump)
+
+ exit(1)
+
+# Figure out the path to the LLVM repos
+if "LLVM_ROOT" not in os.environ:
+ die("Please, define $LLVM_ROOT to point to the root\n"
+ "path where the worktree setup should be performed")
+llvm_repos_root = os.path.join(os.environ["LLVM_ROOT"], "repos")
+
+# Figure out the path to the current LLVM tree
+if "LLVM_SRC" not in os.environ:
+ die("Please, define $LLVM_SRC to point to the current LLVM\n"
+ "worktree directory, or run llvm-env to set it for you")
+llvm_worktree_root = os.environ["LLVM_SRC"]
+
+
+def dump_config(config):
+ """Dump the list of projects that are enabled in the given config."""
+
+ print "Projects linked:"
+ enabled = config.get_enabled_subprojects()
+ if not enabled:
+ print "none"
+ else:
+ for subproj in sorted(enabled):
+ print " + {}".format(subproj)
+
+
+def projects(args):
+ """Add/remove subprojects based on the values in args."""
+
+ proj = Proj()
+ config = LLVMSourceConfig(proj, llvm_worktree_root)
+
+ if not args.add and not args.remove:
+ # Nothing to change, just print the current configuration
+ dump_config(config)
+ exit(0)
+
+ to_add = {}
+ if args.add:
+ for subproj in args.add:
+ repo = Clone(proj, os.path.join(llvm_repos_root, subproj))
+ to_add[subproj] = repo
+
+ try:
+ config.update(to_add, args.remove)
+ except (EnvironmentError, ValueError) as exc:
+ die("Failed to update subprojects because:\n{}".format(str(exc)))
+
+ dump_config(config)
+
+##########################################################################
+# Command line parsing #
+##########################################################################
+
+# If we decide we want shorthands for the subprojects, we can append to this
+# list
+valid_subprojects = LLVMSubproject.get_all_subprojects().keys()
+
+options = ArgumentParser(formatter_class=RawTextHelpFormatter)
+subcommands = options.add_subparsers()
+
+# Subcommand for adding / removing subprojects
+projs = subcommands.add_parser("projects", help="Add/remove LLVM subprojects")
+projs.set_defaults(run_command=projects)
+
+# TODO: Overwriting previous values is not necessarily what users expect (so for
+# instance --add S1 S2 --remove S3 --add S4 would lead to adding only S4). We
+# can do better by using action='append', which would create a list (of lists?
+# or of lists and scalars?) that we can flatten to obtain all the values passed
+# by the user.
+projs.add_argument(
+ '-a', '--add',
+ nargs='+',
+ choices=valid_subprojects,
+ metavar='subproject',
+ help="Link given subprojects. Valid values are:\n\t{}\n".format(
+ "\n\t".join(valid_subprojects)))
+projs.add_argument(
+ '-r', '--remove',
+ nargs='+',
+ choices=valid_subprojects,
+ metavar='subproject',
+ help="Unlink given subprojects.")
+
+args = options.parse_args()
+args.run_command(args)