summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSatori <comfycallum@gmail.com>2020-11-23 23:08:00 +0000
committerRick Gibbed <rick@gibbed.us>2020-11-25 14:15:58 -0600
commit30b9719ee3a3322e5fb0fc41995ed00e202571a4 (patch)
tree4e641592bb2d7983ede53aac444e929b0b8e3125
parentd353cade76cf74136dbdfdd884f170b74160f207 (diff)
[Build] Add stub command for source file generation
-rwxr-xr-xxenia-build96
1 files changed, 95 insertions, 1 deletions
diff --git a/xenia-build b/xenia-build
index 20c56cb51..4fcf03f44 100755
--- a/xenia-build
+++ b/xenia-build
@@ -7,7 +7,7 @@
Run with --help or no arguments for possible commands.
"""
from __future__ import print_function
-
+from datetime import datetime
import argparse
import json
import os
@@ -271,6 +271,48 @@ def generate_version_h():
with open('build/version.h', 'w') as f:
f.write(contents)
+def generate_source_class(path):
+ header_path = '{}.h'.format(path)
+ source_path = '{}.cc'.format(path)
+
+ if os.path.isfile(header_path) or os.path.isfile(source_path):
+ print('ERROR: Target file already exists')
+ return 1
+
+ if generate_source_file(header_path) > 0:
+ return 1
+ if generate_source_file(source_path) > 0:
+ # remove header if source file generation failed
+ os.remove(os.path.join(source_root, header_path))
+ return 1
+
+ return 0
+
+def generate_source_file(path):
+ """Generates a source file at the specified path containing copyright notice
+ """
+ copyright = '''/**
+ ******************************************************************************
+ * Xenia : Xbox 360 Emulator Research Project *
+ ******************************************************************************
+ * Copyright {} Ben Vanik. All rights reserved. *
+ * Released under the BSD license - see LICENSE in the root for more details. *
+ ******************************************************************************
+ */'''.format(datetime.now().year)
+
+ if os.path.isfile(path):
+ print('ERROR: Target file already exists')
+ return 1
+ try:
+ with open(path, 'w') as f:
+ f.write(copyright)
+ except Exception as e:
+ print('ERROR: Could not write to file [path {}]'.format(path))
+ return 1
+
+ return 0
+
+
def git_get_head_info():
"""Queries the current branch and commit checksum from git.
@@ -513,6 +555,7 @@ def discover_commands(subparsers):
'format': FormatCommand(subparsers),
'style': StyleCommand(subparsers),
'tidy': TidyCommand(subparsers),
+ 'stub': StubCommand(subparsers),
}
if sys.platform == 'win32':
commands['buildhlsl'] = BuildHlslCommand(subparsers)
@@ -1540,6 +1583,57 @@ class TidyCommand(Command):
print('Tidy completed successfully.')
return 0
+class StubCommand(Command):
+ """'stub' command."""
+
+ def __init__(self, subparsers, *args, **kwargs):
+ super(StubCommand, self).__init__(
+ subparsers,
+ name='stub',
+ help_short='Create new file(s) in the xenia source tree and run premake',
+ *args, **kwargs)
+ self.parser.add_argument(
+ '--file', default=None,
+ help='Generate a source file at the provided location in the source tree')
+ self.parser.add_argument(
+ '--class', default=None,
+ help='Generate a class pair (.cc/.h) at the provided location in the source tree')
+ self.parser.add_argument(
+ '--target_os', default=None,
+ help='Target OS passed to premake, for cross-compilation')
+
+ def execute(self, args, pass_args, cwd):
+ root = os.path.dirname(os.path.realpath(__file__))
+ source_root = os.path.join(root, os.path.normpath('src/xenia'))
+
+ if args['class']:
+ path = os.path.normpath(os.path.join(source_root, args['class']))
+ target_dir = os.path.dirname(path)
+ class_name = os.path.basename(path)
+
+ status = generate_source_class(path)
+ if status > 0:
+ return status
+
+ print('Created class \'{0}\' at {1}'.format(class_name, target_dir))
+
+ elif args['file']:
+ path = os.path.normpath(os.path.join(source_root, args['file']))
+ target_dir = os.path.dirname(path)
+ file_name = os.path.basename(path)
+
+ status = generate_source_file(path)
+ if status > 0:
+ return status
+
+ print('Created file \'{0}\' at {1}'.format(file_name, target_dir))
+
+ else:
+ print('ERROR: Please specify a file/class to generate')
+ return 1
+
+ run_platform_premake(target_os_override=args['target_os'])
+ return 0
class DevenvCommand(Command):
"""'devenv' command."""