Teach claude to understand --debug in gn, build & test steps

Debug builds are useful for building and debugging. This doesn't support
uploading debug binaries because we do not (yet) having a naming scheme
for debug builds.

patch from issue 1154763005 at patchset 1 (http://crrev.com/1154763005#ps1)

(original patch by jamesr, updated/fixed by me)

TBR=jamesr@chromium.org

Review URL: https://codereview.chromium.org/1187323002.
diff --git a/claude.py b/claude.py
index 66c3ed5..967baa6 100755
--- a/claude.py
+++ b/claude.py
@@ -11,8 +11,17 @@
 
 _logger = logging.getLogger()
 _root_path = os.path.realpath(os.path.dirname(__file__))
-_linux_out_dir = os.path.join(_root_path, 'out/Release')
-_android_out_dir = os.path.join(_root_path, 'out/android_Release')
+
+def _linux_out_dir(args):
+  if args.debug:
+      return os.path.join(_root_path, 'out/Debug')
+  return os.path.join(_root_path, 'out/Release')
+
+def _android_out_dir(args):
+  if args.debug:
+    return os.path.join(_root_path, 'out/android_Debug')
+  return os.path.join(_root_path, 'out/android_Release')
+
 
 def _init_logging(verbose_count):
   if verbose_count == 0:
@@ -41,7 +50,8 @@
 def _gn(args):
   _logger.debug('_gn()')
 
-  gn_args = ['is_debug = false']
+  gn_args = ['is_debug = ' + ('true' if args.debug else 'false')]
+
   if 'goma' in args:
     goma_dir = os.environ.get('GOMA_DIR')
     goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma')
@@ -52,12 +62,12 @@
       gn_args.append(_goma_dir_str + '"' + goma_home_dir + '"')
       gn_args.append(_use_goma_str + 'true')
 
-  retcode = _run_gn(gn_args, _linux_out_dir)
+  retcode = _run_gn(gn_args, _linux_out_dir(args))
   if retcode != 0:
     return retcode
   gn_args.append('target_os="android"')
   gn_args.append('target_cpu="arm"')
-  return _run_gn(gn_args, _android_out_dir)
+  return _run_gn(gn_args, _android_out_dir(args))
 
 def _run_build(out_dir):
   gn_file = os.path.join(out_dir, 'args.gn')
@@ -86,10 +96,10 @@
 # Unused argument - pylint: disable=W0613
 def _build(args):
   _logger.debug('_build()')
-  retcode = _run_build(_linux_out_dir)
+  retcode = _run_build(_linux_out_dir(args))
   if retcode != 0:
     return retcode
-  return _run_build(_android_out_dir)
+  return _run_build(_android_out_dir(args))
 
 # Unused argument - pylint: disable=W0613
 def _test(args):
@@ -100,9 +110,12 @@
       'mojo:network_service_apptests'])
 
 def _upload(args):
+  if args.debug:
+    print "Only upload release binaries (for now)"
+    return 1
   base_command = ['tools/upload_service.py',
-                  '--linux-x64-binary-dir', _linux_out_dir,
-                  '--android-arm-binary-dir', _android_out_dir]
+                  '--linux-x64-binary-dir', _linux_out_dir(args),
+                  '--android-arm-binary-dir', _android_out_dir(args)]
   if args.dry_run:
     base_command.append('--dry-run')
   _logger.info('Uploading network service binary')
@@ -122,6 +135,12 @@
                              help='Be verbose (multiple times for more)',
                              default=0, dest='verbose_count', action='count')
 
+  debug_group = parent_parser.add_mutually_exclusive_group()
+  debug_group.add_argument('--debug', help='Debug build (default)',
+                           default=True, action='store_true')
+  debug_group.add_argument('--release', help='Release build', default=False,
+                           dest='debug', action='store_false')
+
   subparsers = parser.add_subparsers()
 
   gn_parser = subparsers.add_parser('gn', parents=[parent_parser],