verinfo to python (nw)

This commit is contained in:
Miodrag Milanovic 2015-02-13 15:25:13 +01:00
parent f89a72489a
commit 9c75643564
6 changed files with 122 additions and 333 deletions

View File

@ -20,17 +20,14 @@ OBJDIRS += \
MAKEDEP_TARGET = $(BUILDOUT)/makedep$(BUILD_EXE) MAKEDEP_TARGET = $(BUILDOUT)/makedep$(BUILD_EXE)
MAKEMAK_TARGET = $(BUILDOUT)/makemak$(BUILD_EXE) MAKEMAK_TARGET = $(BUILDOUT)/makemak$(BUILD_EXE)
VERINFO_TARGET = $(BUILDOUT)/verinfo$(BUILD_EXE)
MAKEDEP = $(MAKEDEP_TARGET) MAKEDEP = $(MAKEDEP_TARGET)
MAKEMAK = $(MAKEMAK_TARGET) MAKEMAK = $(MAKEMAK_TARGET)
VERINFO = $(VERINFO_TARGET)
ifneq ($(TERM),cygwin) ifneq ($(TERM),cygwin)
ifeq ($(OS),Windows_NT) ifeq ($(OS),Windows_NT)
MAKEDEP = $(subst /,\,$(MAKEDEP_TARGET)) MAKEDEP = $(subst /,\,$(MAKEDEP_TARGET))
MAKEMAK = $(subst /,\,$(MAKEMAK_TARGET)) MAKEMAK = $(subst /,\,$(MAKEMAK_TARGET))
VERINFO = $(subst /,\,$(VERINFO_TARGET))
endif endif
endif endif
@ -38,7 +35,6 @@ ifneq ($(CROSS_BUILD),1)
BUILD += \ BUILD += \
$(MAKEDEP_TARGET) \ $(MAKEDEP_TARGET) \
$(MAKEMAK_TARGET) \ $(MAKEMAK_TARGET) \
$(VERINFO_TARGET) \
@ -78,18 +74,6 @@ $(MAKEMAK_TARGET): $(MAKEMAKOBJS) $(LIBOCORE) $(ZLIB)
$(LD) $(LDFLAGS) $^ $(BASELIBS) -o $@ $(LD) $(LDFLAGS) $^ $(BASELIBS) -o $@
#-------------------------------------------------
# verinfo
#-------------------------------------------------
VERINFOOBJS = \
$(BUILDOBJ)/verinfo.o
$(VERINFO_TARGET): $(VERINFOOBJS) $(LIBOCORE)
@echo Linking $@...
$(LD) $(LDFLAGS) $^ $(BASELIBS) -o $@
else else
#------------------------------------------------- #-------------------------------------------------
# It's a CROSS_BUILD. Ensure the targets exist. # It's a CROSS_BUILD. Ensure the targets exist.
@ -97,7 +81,4 @@ else
$(MAKEDEP_TARGET): $(MAKEDEP_TARGET):
@echo $@ should be built natively. Nothing to do. @echo $@ should be built natively. Nothing to do.
$(VERINFO_TARGET):
@echo $@ should be built natively. Nothing to do.
endif # CROSS_BUILD endif # CROSS_BUILD

View File

@ -1,308 +0,0 @@
//============================================================
//
// verinfo.c - Version resource emitter code
//
// Copyright Nicola Salmoria and the MAME Team.
// Visit http://mamedev.org for licensing and usage restrictions.
//
//============================================================
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
typedef unsigned char UINT8;
#define ARRAY_LENGTH(x) (sizeof(x) / sizeof(x[0]))
#define BUILD_MAME (0)
#define BUILD_MESS (1)
#define BUILD_UME (2)
//============================================================
// TYPE DEFINITIONS
//============================================================
struct version_info
{
int version_major;
int version_minor;
int version_build;
int version_subbuild;
const char *version_string;
const char *author;
const char *comments;
const char *company_name;
const char *file_description;
const char *internal_name;
const char *legal_copyright;
const char *original_filename;
const char *product_name;
};
//============================================================
// STATIC
//============================================================
static int build;
//============================================================
// emit_version_info
//============================================================
static void emit_version_info(const version_info *v)
{
printf("VS_VERSION_INFO VERSIONINFO\n");
printf("\tFILEVERSION %d,%d,%d,%d\n", v->version_major, v->version_minor, v->version_build, v->version_subbuild);
printf("\tPRODUCTVERSION %d,%d,%d,%d\n", v->version_major, v->version_minor, v->version_build, v->version_subbuild);
printf("\tFILEFLAGSMASK 0x3fL\n");
#ifdef MAME_DEBUG
if (v->version_build == 0)
printf("\tFILEFLAGS VS_FF_DEBUG\n");
else
printf("\tFILEFLAGS VS_FF_PRERELEASE | VS_FF_DEBUG\n");
#else
if (v->version_build == 0)
printf("\tFILEFLAGS 0x0L\n");
else
printf("\tFILEFLAGS VS_FF_PRERELEASE\n");
#endif
printf("\tFILEOS VOS_NT_WINDOWS32\n");
printf("\tFILETYPE VFT_APP\n");
printf("\tFILESUBTYPE VFT2_UNKNOWN\n");
printf("BEGIN\n");
printf("\tBLOCK \"StringFileInfo\"\n");
printf("\tBEGIN\n");
printf("#ifdef UNICODE\n");
printf("\t\tBLOCK \"040904b0\"\n");
printf("#else\n");
printf("\t\tBLOCK \"040904E4\"\n");
printf("#endif\n");
printf("\t\tBEGIN\n");
if (v->author != NULL)
printf("\t\t\tVALUE \"Author\", \"%s\\0\"\n", v->author);
if (v->comments != NULL)
printf("\t\t\tVALUE \"Comments\", \"%s\\0\"\n", v->comments);
if (v->company_name != NULL)
printf("\t\t\tVALUE \"CompanyName\", \"%s\\0\"\n", v->company_name);
if (v->file_description != NULL)
printf("\t\t\tVALUE \"FileDescription\", \"%s\\0\"\n", v->file_description);
printf("\t\t\tVALUE \"FileVersion\", \"%d, %d, %d, %d\\0\"\n", v->version_major, v->version_minor, v->version_build, v->version_subbuild);
if (v->internal_name != NULL)
printf("\t\t\tVALUE \"InternalName\", \"%s\\0\"\n", v->internal_name);
if (v->legal_copyright != NULL)
printf("\t\t\tVALUE \"LegalCopyright\", \"%s\\0\"\n", v->legal_copyright);
if (v->original_filename != NULL)
printf("\t\t\tVALUE \"OriginalFilename\", \"%s\\0\"\n", v->original_filename);
if (v->product_name != NULL)
printf("\t\t\tVALUE \"ProductName\", \"%s\\0\"\n", v->product_name);
printf("\t\t\tVALUE \"ProductVersion\", \"%s\\0\"\n", v->version_string);
printf("\t\tEND\n");
printf("\tEND\n");
printf("\tBLOCK \"VarFileInfo\"\n");
printf("\tBEGIN\n");
printf("#ifdef UNICODE\n");
printf("\t\tVALUE \"Translation\", 0x409, 1200\n");
printf("#else\n");
printf("\t\tVALUE \"Translation\", 0x409, 1252\n");
printf("#endif\n");
printf("\tEND\n");
printf("END\n");
}
//============================================================
// parse_version_digit
//============================================================
static bool parse_version_digit(const char *str, int *position, int* value)
{
int res = 0;
while (str[*position] != 0 && !isspace((UINT8)str[*position]) && !isdigit((UINT8)str[*position]))
(*position)++;
if (str[*position] != 0 && isdigit((UINT8)str[*position]))
{
res = sscanf(&str[*position], "%d", value);
while (isdigit((UINT8)str[*position]))
(*position)++;
}
return res == 1;
}
//============================================================
// parse_version
//============================================================
static int parse_version(char *str, int *version_major, int *version_minor, const char **version_string)
{
char *version;
int position = 0;
// find the version string
version = strstr(str, "BARE_BUILD_VERSION");
if (version != NULL)
version = strchr(version, '"');
if (version == NULL || *version == '\0' || strchr(version, '.') == NULL)
{
fprintf(stderr, "Unable to find version string\n");
return 1;
}
version++;
*strchr(version, '"') = 0;
*version_string = version;
if (!parse_version_digit(version, &position, version_major))
{
fprintf(stderr, "Unable to parse major version\n");
return 1;
}
if (!parse_version_digit(version, &position, version_minor))
{
fprintf(stderr, "Unable to parse minor version\n");
return 1;
}
return 0;
}
//============================================================
// main
//============================================================
static int usage(char *me)
{
fprintf(stderr, "Usage: %s [-b mame|mess|ume] <filename>\n", me);
return 1;
}
//============================================================
// main
//============================================================
int main(int argc, char *argv[])
{
version_info v;
char legal_copyright[512];
char *buffer;
size_t size;
int opt;
FILE *f;
memset(&v, 0, sizeof(v));
build = BUILD_MAME;
// validate parameters
opt = 1;
while (opt < argc && *argv[opt] == '-')
{
if (!strcmp(argv[opt], "-b"))
{
char *p = argv[++opt];
if (!strcmp(p,"mame"))
build = BUILD_MAME;
else if (!strcmp(p,"mess"))
build = BUILD_MESS;
else if (!strcmp(p,"ume"))
build = BUILD_UME;
else
return usage(argv[0]);
}
else
return usage(argv[0]);
opt++;
}
if (opt != argc-1 )
{
return usage(argv[0]);
}
// open the file
f = fopen(argv[argc-1], "rb");
if (f == NULL)
{
fprintf(stderr, "Error opening file %s\n", argv[argc-1]);
return 1;
}
// get the file size
fseek(f, 0, SEEK_END);
size = ftell(f);
fseek(f, 0, SEEK_SET);
// allocate a buffer
buffer = (char *)malloc(size + 1);
if (buffer == NULL)
{
fclose(f);
fprintf(stderr, "Error allocating %ld bytes\n", (long) size + 1);
return 1;
}
// read the file contents and NULL-terminate
fread(buffer, 1, size, f);
fclose(f);
buffer[size] = 0;
// parse out version string
if (parse_version(buffer, &v.version_major, &v.version_minor, &v.version_string))
{
fprintf(stderr, "Error parsing version\n");
free(buffer);
return 1;
}
if (build == BUILD_MESS)
{
// MESS
v.author = "MESS Team";
v.comments = "Multi Emulation Super System";
v.company_name = "MESS Team";
v.file_description = "Multi Emulation Super System";
v.internal_name = "MESS";
v.original_filename = "MESS";
v.product_name = "MESS";
}
else if (build == BUILD_UME)
{
// UME
v.author = "MAME and MESS Team";
v.comments = "Universal Machine Emulator";
v.company_name = "MAME and MESS Team";
v.file_description = "Universal Machine Emulator";
v.internal_name = "UME";
v.original_filename = "UME";
v.product_name = "UME";
}
else
{
// MAME
v.author = "Nicola Salmoria and the MAME Team";
v.comments = "Multiple Arcade Machine Emulator";
v.company_name = "MAME Team";
v.file_description = "Multiple Arcade Machine Emulator";
v.internal_name = "MAME";
v.original_filename = "MAME";
v.product_name = "MAME";
}
// build legal_copyright string
v.legal_copyright = legal_copyright;
snprintf(legal_copyright, ARRAY_LENGTH(legal_copyright), "Copyright Nicola Salmoria and the MAME team");
// emit the info
emit_version_info(&v);
free(buffer);
return 0;
}

116
src/build/verinfo.py Normal file
View File

@ -0,0 +1,116 @@
#!/usr/bin/python
from __future__ import with_statement
import sys
import os
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)
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)
srcfile = sys.argv[len(sys.argv)-1]
try:
fp = open(srcfile, 'rb')
except IOError:
sys.stderr.write("Unable to open source file '%s'" % 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_build = "0"
version_subbuild = "0"
if (build == "mame") :
# MESS
author = "MESS Team";
comments = "Multi Emulation Super System";
company_name = "MESS Team";
file_description = "Multi Emulation Super System";
internal_name = "MESS";
original_filename = "MESS";
product_name = "MESS";
elif (build == "mess") :
# UME
author = "MAME and MESS Team"
comments = "Universal Machine Emulator"
company_name = "MAME and MESS Team"
file_description = "Universal Machine Emulator"
internal_name = "UME"
original_filename = "UME"
product_name = "UME"
else :
# MAME
author = "Nicola Salmoria and the MAME Team"
comments = "Multiple Arcade Machine Emulator"
company_name = "MAME Team"
file_description = "Multiple Arcade Machine Emulator"
internal_name = "MAME"
original_filename = "MAME"
product_name = "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")

View File

@ -36,6 +36,6 @@ $(MESS_WINOBJ)/%.res: $(MESS_WINSRC)/%.rc
$(RESFILE): $(MESS_WINSRC)/mess.rc $(MESS_WINOBJ)/messvers.rc $(RESFILE): $(MESS_WINSRC)/mess.rc $(MESS_WINOBJ)/messvers.rc
$(MESS_WINOBJ)/messvers.rc: $(BUILDOUT)/verinfo$(BUILD_EXE) $(SRC)/version.c $(MESS_WINOBJ)/messvers.rc: $(SRC)/build/verinfo.py $(SRC)/version.c
@echo Emitting $@... @echo Emitting $@...
@"$(BUILDOUT)/verinfo$(BUILD_EXE)" -b mess $(SRC)/version.c > $@ $(PYTHON) $(SRC)/build/verinfo.py -b mess $(SRC)/version.c > $@

View File

@ -502,6 +502,6 @@ $(WINOBJ)/%.res: $(WINSRC)/%.rc | $(OSPREBUILD)
$(RESFILE): $(WINSRC)/mame.rc $(WINOBJ)/mamevers.rc $(RESFILE): $(WINSRC)/mame.rc $(WINOBJ)/mamevers.rc
$(WINOBJ)/mamevers.rc: $(BUILDOUT)/verinfo$(BUILD_EXE) $(SRC)/version.c $(WINOBJ)/mamevers.rc: $(SRC)/build/verinfo.py $(SRC)/version.c
@echo Emitting $@... @echo Emitting $@...
@"$(BUILDOUT)/verinfo$(BUILD_EXE)" -b mame $(SRC)/version.c > $@ $(PYTHON) $(SRC)/build/verinfo.py -b mame $(SRC)/version.c > $@

View File

@ -36,6 +36,6 @@ $(UME_WINOBJ)/%.res: $(UME_WINSRC)/%.rc
$(RESFILE): $(UME_WINSRC)/ume.rc $(UME_WINOBJ)/umevers.rc $(RESFILE): $(UME_WINSRC)/ume.rc $(UME_WINOBJ)/umevers.rc
$(UME_WINOBJ)/umevers.rc: $(BUILDOUT)/verinfo$(BUILD_EXE) $(SRC)/version.c $(UME_WINOBJ)/umevers.rc: $(SRC)/build/verinfo.py $(SRC)/version.c
@echo Emitting $@... @echo Emitting $@...
@"$(BUILDOUT)/verinfo$(BUILD_EXE)" -b ume $(SRC)/version.c > $@ $(PYTHON) $(SRC)/build/verinfo.py -b ume $(SRC)/version.c > $@