From 93067d0d63570425e473862de7ce72dc6091c34c Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Sun, 15 Feb 2015 01:44:38 -0800
Subject: [PATCH] Add profile option to spack script.

---
 bin/spack | 89 ++++++++++++++++++++++++++++++-------------------------
 1 file changed, 49 insertions(+), 40 deletions(-)

diff --git a/bin/spack b/bin/spack
index 626d9d9d11..c49caf37f9 100755
--- a/bin/spack
+++ b/bin/spack
@@ -58,14 +58,16 @@ parser = argparse.ArgumentParser(
     description='Spack: the Supercomputing PACKage Manager.')
 parser.add_argument('-V', '--version', action='version',
                     version="%s" % spack.spack_version)
-parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',
+parser.add_argument('-v', '--verbose', action='store_true',
                     help="Print additional output during builds")
-parser.add_argument('-d', '--debug', action='store_true', dest='debug',
+parser.add_argument('-d', '--debug', action='store_true',
                     help="Write out debug logs during compile")
-parser.add_argument('-k', '--insecure', action='store_true', dest='insecure',
+parser.add_argument('-k', '--insecure', action='store_true',
                     help="Do not check ssl certificates when downloading archives.")
-parser.add_argument('-m', '--mock', action='store_true', dest='mock',
+parser.add_argument('-m', '--mock', action='store_true',
                     help="Use mock packages instead of real ones.")
+parser.add_argument('-p', '--profile', action='store_true',
+                    help="Profile execution using cProfile.")
 
 # each command module implements a parser() function, to which we pass its
 # subparser for setup.
@@ -85,42 +87,49 @@ if len(sys.argv) == 1:
 # actually parse the args.
 args = parser.parse_args()
 
-# Set up environment based on args.
-tty.set_verbose(args.verbose)
-tty.set_debug(args.debug)
-spack.debug = args.debug
-
-spack.spack_working_dir = working_dir
-if args.mock:
-    from spack.packages import PackageDB
-    spack.db = PackageDB(spack.mock_packages_path)
-
-# If the user asked for it, don't check ssl certs.
-if args.insecure:
-    tty.warn("You asked for --insecure, which does not check SSL certificates or checksums.")
-    spack.curl.add_default_arg('-k')
-
-# Try to load the particular command asked for and run it
-command = spack.cmd.get_command(args.command)
-try:
-    return_val = command(parser, args)
-except SpackError, e:
-    if spack.debug:
-        # In debug mode, raise with a full stack trace.
-        raise
-    elif e.long_message:
-        tty.die(e.message, e.long_message)
+def main():
+    # Set up environment based on args.
+    tty.set_verbose(args.verbose)
+    tty.set_debug(args.debug)
+    spack.debug = args.debug
+
+    spack.spack_working_dir = working_dir
+    if args.mock:
+        from spack.packages import PackageDB
+        spack.db = PackageDB(spack.mock_packages_path)
+
+    # If the user asked for it, don't check ssl certs.
+    if args.insecure:
+        tty.warn("You asked for --insecure, which does not check SSL certificates or checksums.")
+        spack.curl.add_default_arg('-k')
+
+    # Try to load the particular command asked for and run it
+    command = spack.cmd.get_command(args.command)
+    try:
+        return_val = command(parser, args)
+    except SpackError, e:
+        if spack.debug:
+            # In debug mode, raise with a full stack trace.
+            raise
+        elif e.long_message:
+            tty.die(e.message, e.long_message)
+        else:
+            tty.die(e.message)
+
+    except KeyboardInterrupt:
+        sys.stderr.write('\n')
+        tty.die("Keyboard interrupt.")
+
+    # Allow commands to return values if they want to exit with some ohter code.
+    if return_val is None:
+        sys.exit(0)
+    elif isinstance(return_val, int):
+        sys.exit(return_val)
     else:
-        tty.die(e.message)
-
-except KeyboardInterrupt:
-    sys.stderr.write('\n')
-    tty.die("Keyboard interrupt.")
+        tty.die("Bad return value from command %s: %s" % (args.command, return_val))
 
-# Allow commands to return values if they want to exit with some ohter code.
-if return_val is None:
-    sys.exit(0)
-elif isinstance(return_val, int):
-    sys.exit(return_val)
+if args.profile:
+    import cProfile
+    cProfile.run('main()', sort='tottime')
 else:
-    tty.die("Bad return value from command %s: %s" % (args.command, return_val))
+    main()
-- 
GitLab