diff options
Diffstat (limited to 'scripts/build/verinfo.py')
-rw-r--r-- | scripts/build/verinfo.py | 256 |
1 files changed, 111 insertions, 145 deletions
diff --git a/scripts/build/verinfo.py b/scripts/build/verinfo.py index 59e383624cc..7e61012b796 100644 --- a/scripts/build/verinfo.py +++ b/scripts/build/verinfo.py @@ -1,171 +1,137 @@ #!/usr/bin/python3 ## ## license:BSD-3-Clause -## copyright-holders:Aaron Giles, Andrew Gardner +## copyright-holders:Vas Crabb +import argparse import io import re +import string import sys def parse_args(): - def usage(): - sys.stderr.write('Usage: verinfo.py [-b mame|mess|ume] [-r|-p] [-o <outfile>] <srcfile>\n') - sys.exit(1) - - flags = True - target = 'mame' - format = 'rc' - input = None - output = None - i = 1 - while i < len(sys.argv): - if flags and (sys.argv[i] == '-r'): - format = 'rc' - elif flags and (sys.argv[i] == '-p'): - format = 'plist' - elif flags and (sys.argv[i] == '-b'): - i += 1 - if i >= len(sys.argv): - usage() - else: - target = sys.argv[i] - elif flags and (sys.argv[i] == '-o'): - i += 1 - if (i >= len(sys.argv)) or (output is not None): - usage() - else: - output = sys.argv[i] - elif flags and (sys.argv[i] == '--'): - flags = False - elif flags and sys.argv[i].startswith('-'): - usage() - elif input is not None: - usage() - else: - input = sys.argv[i] - i += 1 - if input is None: - usage() - return target, format, input, output + parser = argparse.ArgumentParser() + parser.add_argument('--target', '-t', metavar='<target>', default='mame', help='target name') + parser.add_argument('--subtarget', '-s', metavar='<subtarget>', default='mame', help='subtarget name') + parser.add_argument('--executable', '-e', metavar='<executable>', default='mame', help='base executable name') + parser.add_argument('--format', '-f', choices=('rc', 'plist'), metavar='<format>', default='rc', help='output format') + parser.add_argument('--resources', '-r', metavar='<resfile>', help='resource file to include') + parser.add_argument('-o', metavar='<outfile>', help='output file name') + parser.add_argument('input', metavar='<srcfile>', help='version info source file') + return parser.parse_args() -def extract_version(input): +def extract_version(verinfo): pattern = re.compile('\s+BARE_BUILD_VERSION\s+"(([^."]+)\.([^."]+))"') - for line in input.readlines(): + for line in verinfo: match = pattern.search(line) if match: return match.group(1), match.group(2), match.group(3) return None, None, None -build, outfmt, srcfile, dstfile = parse_args() - -try: - fp = io.open(srcfile, 'r') -except IOError: - sys.stderr.write("Unable to open source file '%s'\n" % srcfile) - sys.exit(1) - -version_string, version_major, version_minor = extract_version(fp) -version_build = "0" -version_subbuild = "0" -if not version_string: - sys.stderr.write("Unable to extract version from source file '%s'\n" % srcfile) - sys.exit(1) -fp.close() +if __name__ == '__main__': + options = parse_args() -if dstfile is not None: try: - fp = open(dstfile, 'w') - except IOError: - sys.stderr.write("Unable to open output file '%s'\n" % dstfile) + with io.open(options.input, 'r') as verinfo: + verfull, vermajor, verminor = extract_version(verinfo) + verbuild = '0' + except IOError as e: + sys.stderr.write("Error reading source file '%s': %s\n" % (options.input, e)) sys.exit(1) -else: - fp = sys.stdout -if build == "mess": - # MESS - author = "MESS Team" - comments = "Multi Emulation Super System" - company_name = "MESS Team" - file_description = "MESS" - internal_name = "MESS" - original_filename = "MESS" - product_name = "MESS" - bundle_identifier = "org.mamedev.mess" -else: - # MAME - author = "Nicola Salmoria and the MAME Team" - comments = "Multi-purpose emulation framework" - company_name = "MAME Team" - file_description = "MAME" - internal_name = "MAME" if build == "mame" else build - original_filename = "MAME" if build == "mame" else build - product_name = "MAME" if build == "mame" else build - bundle_identifier = "org.mamedev." + build + if verfull is None: + sys.stderr.write("Unable to extract version from source file '%s'\n" % (options.input, )) + sys.exit(1) + + if options.format == 'plist': + template = string.Template( + '<?xml version="1.0" encoding="UTF-8"?>\n' \ + '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n' \ + '<plist version="1.0">\n' \ + '<dict>\n' \ + '\t<key>CFBundleDisplayName</key>\n' \ + '\t<string>${product}</string>\n' \ + '\t<key>CFBundleIdentifier</key>\n' \ + '\t<string>${rdns}</string>\n' \ + '\t<key>CFBundleInfoDictionaryVersion</key>\n' \ + '\t<string>6.0</string>\n' \ + '\t<key>CFBundleName</key>\n' \ + '\t<string>${product}</string>\n' \ + '\t<key>CFBundleShortVersionString</key>\n' \ + '\t<string>${major}.${minor}.${build}</string>\n' \ + '\t<key>NSPrincipalClass</key>\n' \ + '\t<string>NSApplication</string>\n' \ + '</dict>\n' \ + '</plist>\n') + else: + template = string.Template( + '#include <windows.h>\n' \ + '#pragma code_page(65001)\n' \ + 'VS_VERSION_INFO VERSIONINFO\n' \ + '\tFILEVERSION ${major},${minor},${build},${subbuild}\n' \ + '\tPRODUCTVERSION ${major},${minor},${build},${subbuild}\n' \ + '\tFILEFLAGSMASK 0x3fL\n' \ + '\tFILEFLAGS ${winfileflags}\n' \ + '\tFILEOS VOS_NT_WINDOWS32\n' \ + '\tFILETYPE VFT_APP\n' \ + '\tFILESUBTYPE VFT2_UNKNOWN\n' \ + 'BEGIN\n' \ + '\tBLOCK "StringFileInfo"\n' \ + '\tBEGIN\n' \ + '#ifdef UNICODE\n' \ + '\t\tBLOCK "040904b0"\n' \ + '#else\n' \ + '\t\tBLOCK "040904E4"\n' \ + '#endif\n' \ + '\t\tBEGIN\n' \ + '\t\t\tVALUE "Author", "${author}\\0"\n' \ + '\t\t\tVALUE "Comments", "${comments}\\0"\n' \ + '\t\t\tVALUE "CompanyName", "${company}\\0"\n' \ + '\t\t\tVALUE "FileDescription", "${filedesc}\\0"\n' \ + '\t\t\tVALUE "FileVersion", "${major}, ${minor}, ${build}, ${subbuild}\\0"\n' \ + '\t\t\tVALUE "InternalName", "${internal}\\0"\n' \ + '\t\t\tVALUE "LegalCopyright", "${copyright}\\0"\n' \ + '\t\t\tVALUE "OriginalFilename", "${original}\\0"\n' \ + '\t\t\tVALUE "ProductName", "${product}\\0"\n' \ + '\t\t\tVALUE "ProductVersion", "${version}\\0"\n' \ + '\t\tEND\n' \ + '\tEND\n' \ + '\tBLOCK "VarFileInfo"\n' \ + '\tBEGIN\n' \ + '#ifdef UNICODE\n' \ + '\t\tVALUE "Translation", 0x409, 1200\n' \ + '#else\n' \ + '\t\tVALUE "Translation", 0x409, 1252\n' \ + '#endif\n' \ + '\tEND\n' \ + 'END\n' \ + '#include "${resources}"\n') -legal_copyright = "Copyright Nicola Salmoria and the MAME team" + internal = options.target + '_' + options.subtarget if options.target != options.subtarget else options.target + text = template.substitute( + version=verfull, + major=vermajor, minor=verminor, build='0', subbuild='0', + author='MAMEdev and contributors', + comments='Multi-purpose emulation framework', + company='MAMEdev', + filedesc='MAME', + internal=internal, + original=options.executable, + product=('MAME' if options.target == 'mame' else options.target), + rdns=('org.mamedev.' + internal), + copyright='\u00a9 1997-2022 MAMEdev and contributors', + winfileflags=('0x0L' if verbuild == '0' else 'VS_FF_PRERELEASE'), + resources=(options.resources or 'mame.rc')) -if outfmt == 'rc': - fp.write('VS_VERSION_INFO VERSIONINFO\n') - fp.write('\tFILEVERSION %s,%s,%s,%s\n' % (version_major, version_minor, version_build, version_subbuild)) - fp.write('\tPRODUCTVERSION %s,%s,%s,%s\n' % (version_major, version_minor, version_build, version_subbuild)) - fp.write('\tFILEFLAGSMASK 0x3fL\n') - if version_build == 0: - fp.write('\tFILEFLAGS 0x0L\n') + if options.o is not None: + try: + with io.open(options.o, 'w', encoding='utf-8') as out: + out.write(text) + except IOError as e: + sys.stderr.write("Error writing output file '%s': %s\n" % (options.o, e)) + sys.exit(1) else: - fp.write('\tFILEFLAGS VS_FF_PRERELEASE\n') - fp.write('\tFILEOS VOS_NT_WINDOWS32\n') - fp.write('\tFILETYPE VFT_APP\n') - fp.write('\tFILESUBTYPE VFT2_UNKNOWN\n') - fp.write('BEGIN\n') - fp.write('\tBLOCK "StringFileInfo"\n') - fp.write('\tBEGIN\n') - fp.write('#ifdef UNICODE\n') - fp.write('\t\tBLOCK "040904b0"\n') - fp.write('#else\n') - fp.write('\t\tBLOCK "040904E4"\n') - fp.write('#endif\n') - fp.write('\t\tBEGIN\n') - fp.write('\t\t\tVALUE "Author", "%s\\0"\n' % author) - fp.write('\t\t\tVALUE "Comments", "%s\\0"\n' % comments) - fp.write('\t\t\tVALUE "CompanyName", "%s\\0"\n' % company_name) - fp.write('\t\t\tVALUE "FileDescription", "%s\\0"\n' % file_description) - fp.write('\t\t\tVALUE "FileVersion", "%s, %s, %s, %s\\0"\n' % (version_major, version_minor, version_build, version_subbuild)) - fp.write('\t\t\tVALUE "InternalName", "%s\\0"\n' % internal_name) - fp.write('\t\t\tVALUE "LegalCopyright", "%s\\0"\n' % legal_copyright) - fp.write('\t\t\tVALUE "OriginalFilename", "%s\\0"\n' % original_filename) - fp.write('\t\t\tVALUE "ProductName", "%s\\0"\n' % product_name) - fp.write('\t\t\tVALUE "ProductVersion", "%s\\0"\n' % version_string) - fp.write('\t\tEND\n') - fp.write('\tEND\n') - fp.write('\tBLOCK "VarFileInfo"\n') - fp.write('\tBEGIN\n') - fp.write('#ifdef UNICODE\n') - fp.write('\t\tVALUE "Translation", 0x409, 1200\n') - fp.write('#else\n') - fp.write('\t\tVALUE "Translation", 0x409, 1252\n') - fp.write('#endif\n') - fp.write('\tEND\n') - fp.write('END\n') -elif outfmt == 'plist': - fp.write('<?xml version="1.0" encoding="UTF-8"?>\n') - fp.write('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n') - fp.write('<plist version="1.0">\n') - fp.write('<dict>\n') - fp.write('\t<key>CFBundleDisplayName</key>\n') - fp.write('\t<string>%s</string>\n' % product_name) - fp.write('\t<key>CFBundleIdentifier</key>\n') - fp.write('\t<string>%s</string>\n' % bundle_identifier) - fp.write('\t<key>CFBundleInfoDictionaryVersion</key>\n') - fp.write('\t<string>6.0</string>\n') - fp.write('\t<key>CFBundleName</key>\n') - fp.write('\t<string>%s</string>\n' % product_name) - fp.write('\t<key>CFBundleShortVersionString</key>\n') - fp.write('\t<string>%s.%s.%s</string>\n' % (version_major, version_minor, version_build)) - fp.write('\t<key>NSPrincipalClass</key>\n') - fp.write('\t<string>NSApplication</string>\n') - fp.write('</dict>\n') - fp.write('</plist>\n') -fp.flush() + sys.stdout.write(text) |