Make verinfo.py capable of producing Info.plist for OSX

This commit is contained in:
Vas Crabb 2015-02-21 13:27:13 +11:00
parent 89e74e4b9c
commit a7eb44f3e2

View File

@ -2,48 +2,71 @@
from __future__ import with_statement
import sys
import os
import re
import sys
def usage():
sys.stderr.write('Usage: verinfo.py [-b mame|mess|ume] <filename>\n')
return 0
build = "mame"
if (len(sys.argv)==1):
usage()
sys.exit(1)
def parse_args():
def usage():
sys.stderr.write('Usage: verinfo.py [-b mame|mess|ume] [-r|-p] <filename>\n')
sys.exit(1)
if (sys.argv[1]=='-b'):
if (sys.argv[2]=='mame'):
build = "mame"
elif (sys.argv[2]=='mess'):
build = "mess"
elif (sys.argv[2]=='ume'):
build = "ume"
else :
usage()
sys.exit(1)
flags = True
target = 'mame'
input = None
output = 'rc'
i = 1
while i < len(sys.argv):
if flags and (sys.argv[i] == '-r'):
output = 'rc'
elif flags and (sys.argv[i] == '-p'):
output = 'plist'
elif flags and (sys.argv[i] == '-b'):
i += 1;
if (i >= len(sys.argv)) or (sys.argv[i] not in ('mame', 'mess', 'ume')):
usage()
else:
target = 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, input, output
def extract_version(input):
pattern = re.compile('\s+BARE_BUILD_VERSION\s+"(([^."]+)\.([^."]+))"')
for line in input.readlines():
match = pattern.search(line)
if match:
return match.group(1), match.group(2), match.group(3)
return None, None, None
build, srcfile, outfmt = parse_args()
srcfile = sys.argv[len(sys.argv)-1]
try:
fp = open(srcfile, 'rb')
fp = open(srcfile, 'rb')
except IOError:
sys.stderr.write("Unable to open source file '%s'" % srcfile)
sys.exit(1)
sys.stderr.write("Unable to open source file '%s'\n" % srcfile)
sys.exit(1)
for line in fp.readlines():
if line.find("BARE_BUILD_VERSION")!=-1 and line.find('"')!=-1 and line.find('.')!=-1:
version_string = line[line.find('"')+1:]
version_string = version_string[0:version_string.find('"')]
break
version_major = version_string[0:version_string.find('.')]
version_minor = version_string[version_string.find('.')+1:]
version_string, version_major, version_minor = extract_version(fp)
version_build = "0"
version_subbuild = "0"
if (build == "mess") :
if not version_string:
sys.stderr.write("Unable to extract version from source file '%s'\n" % srcfile)
sys.exit(1)
if build == "mess":
# MESS
author = "MESS Team";
comments = "Multi Emulation Super System";
@ -52,7 +75,8 @@ if (build == "mess") :
internal_name = "MESS";
original_filename = "MESS";
product_name = "MESS";
elif (build == "ume") :
bundle_identifier = "org.mamedev.mess"
elif build == "ume":
# UME
author = "MAME and MESS Team"
comments = "Universal Machine Emulator"
@ -61,7 +85,8 @@ elif (build == "ume") :
internal_name = "UME"
original_filename = "UME"
product_name = "UME"
else :
bundle_identifier = "org.mamedev.ume"
else:
# MAME
author = "Nicola Salmoria and the MAME Team"
comments = "Multiple Arcade Machine Emulator"
@ -70,47 +95,66 @@ else :
internal_name = "MAME"
original_filename = "MAME"
product_name = "MAME"
bundle_identifier = "org.mamedev.mame"
legal_copyright = "Copyright Nicola Salmoria and the MAME team"
print("VS_VERSION_INFO VERSIONINFO")
print("\tFILEVERSION %s,%s,%s,%s" % (version_major, version_minor, version_build, version_subbuild))
print("\tPRODUCTVERSION %s,%s,%s,%s" % (version_major, version_minor, version_build, version_subbuild))
print("\tFILEFLAGSMASK 0x3fL")
if (version_build == 0) :
print("\tFILEFLAGS 0x0L")
else :
print("\tFILEFLAGS VS_FF_PRERELEASE")
print("\tFILEOS VOS_NT_WINDOWS32")
print("\tFILETYPE VFT_APP")
print("\tFILESUBTYPE VFT2_UNKNOWN")
print("BEGIN")
print("\tBLOCK \"StringFileInfo\"")
print("\tBEGIN")
print("#ifdef UNICODE")
print("\t\tBLOCK \"040904b0\"")
print("#else")
print("\t\tBLOCK \"040904E4\"")
print("#endif")
print("\t\tBEGIN")
print("\t\t\tVALUE \"Author\", \"%s\\0\"" % author)
print("\t\t\tVALUE \"Comments\", \"%s\\0\"" % comments)
print("\t\t\tVALUE \"CompanyName\", \"%s\\0\"" % company_name)
print("\t\t\tVALUE \"FileDescription\", \"%s\\0\"" % file_description)
print("\t\t\tVALUE \"FileVersion\", \"%s, %s, %s, %s\\0\"" % (version_major, version_minor, version_build, version_subbuild))
print("\t\t\tVALUE \"InternalName\", \"%s\\0\"" % internal_name)
print("\t\t\tVALUE \"LegalCopyright\", \"%s\\0\"" % legal_copyright)
print("\t\t\tVALUE \"OriginalFilename\", \"%s\\0\"" % original_filename)
print("\t\t\tVALUE \"ProductName\", \"%s\\0\"" % product_name)
print("\t\t\tVALUE \"ProductVersion\", \"%s\\0\"" % version_string)
print("\t\tEND")
print("\tEND")
print("\tBLOCK \"VarFileInfo\"")
print("\tBEGIN")
print("#ifdef UNICODE")
print("\t\tVALUE \"Translation\", 0x409, 1200")
print("#else")
print("\t\tVALUE \"Translation\", 0x409, 1252")
print("#endif")
print("\tEND")
print("END")
if outfmt == 'rc':
print("VS_VERSION_INFO VERSIONINFO")
print("\tFILEVERSION %s,%s,%s,%s" % (version_major, version_minor, version_build, version_subbuild))
print("\tPRODUCTVERSION %s,%s,%s,%s" % (version_major, version_minor, version_build, version_subbuild))
print("\tFILEFLAGSMASK 0x3fL")
if (version_build == 0) :
print("\tFILEFLAGS 0x0L")
else :
print("\tFILEFLAGS VS_FF_PRERELEASE")
print("\tFILEOS VOS_NT_WINDOWS32")
print("\tFILETYPE VFT_APP")
print("\tFILESUBTYPE VFT2_UNKNOWN")
print("BEGIN")
print("\tBLOCK \"StringFileInfo\"")
print("\tBEGIN")
print("#ifdef UNICODE")
print("\t\tBLOCK \"040904b0\"")
print("#else")
print("\t\tBLOCK \"040904E4\"")
print("#endif")
print("\t\tBEGIN")
print("\t\t\tVALUE \"Author\", \"%s\\0\"" % author)
print("\t\t\tVALUE \"Comments\", \"%s\\0\"" % comments)
print("\t\t\tVALUE \"CompanyName\", \"%s\\0\"" % company_name)
print("\t\t\tVALUE \"FileDescription\", \"%s\\0\"" % file_description)
print("\t\t\tVALUE \"FileVersion\", \"%s, %s, %s, %s\\0\"" % (version_major, version_minor, version_build, version_subbuild))
print("\t\t\tVALUE \"InternalName\", \"%s\\0\"" % internal_name)
print("\t\t\tVALUE \"LegalCopyright\", \"%s\\0\"" % legal_copyright)
print("\t\t\tVALUE \"OriginalFilename\", \"%s\\0\"" % original_filename)
print("\t\t\tVALUE \"ProductName\", \"%s\\0\"" % product_name)
print("\t\t\tVALUE \"ProductVersion\", \"%s\\0\"" % version_string)
print("\t\tEND")
print("\tEND")
print("\tBLOCK \"VarFileInfo\"")
print("\tBEGIN")
print("#ifdef UNICODE")
print("\t\tVALUE \"Translation\", 0x409, 1200")
print("#else")
print("\t\tVALUE \"Translation\", 0x409, 1252")
print("#endif")
print("\tEND")
print("END")
elif outfmt == 'plist':
print('<?xml version="1.0" encoding="UTF-8"?>')
print('<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">')
print('<plist version="1.0">')
print('<dict>')
print('\t<key>CFBundleDisplayName</key>')
print('\t<string>%s</string>' % product_name)
print('\t<key>CFBundleIdentifier</key>')
print('\t<string>%s</string>' % bundle_identifier)
print('\t<key>CFBundleInfoDictionaryVersion</key>')
print('\t<string>6.0</string>')
print('\t<key>CFBundleName</key>')
print('\t<string>%s</string>' % product_name)
print('\t<key>CFBundleShortVersionString</key>')
print('\t<string>%s.%s.%s</string>' % (version_major, version_minor, version_build))
print('</dict>')
print('</plist>')