Add automatic version numbering to the build system.

Closes avsitter/avsitter.github.io#46
This commit is contained in:
Sei Lisa 2020-09-07 20:57:02 +02:00
parent 63c1c6b27b
commit 04c008db42
20 changed files with 121 additions and 24 deletions

View file

@ -13,6 +13,9 @@ python build-aux.py <command> [<args>]
Where command can be:
setvars <file> <var>=<value> ...:
Preprocesses the given file in place, to replace values like
version and others.
oss-process <file>:
Processes the given file for OpenSim and outputs the result to
standard output. If <file> is not given, read from standard input.
@ -44,8 +47,12 @@ def oss_process(filename):
# Regex that removes /*OSS:: and its matching */ (can't begin on first line)
os_block_re = re.compile(r'\n\s*/\* ?OSS::[^\n]*(\n(?:[^\n]|\n(?![ \t]*\*/))*)\n[ \t]*\*/[^\n]*(?=\n)')
# Regex that reads a token, can be a string or comment or #IDENT or anything else,
# capturing a group for IDENT when #IDENT is found.
token_re = re.compile(r'"(?:\\.|[^"\\]+)*"|/\*[\S\s]*?\*/|//[^\n]*|/|[^#/"]+|#([a-zA-Z_][a-zA-Z0-9_]*)|#')
if filename is not None:
f = open(filename, "r");
f = open(filename, "r")
else:
f = sys.stdin
try:
@ -59,7 +66,6 @@ def oss_process(filename):
'206fcbe2-47b3-41e8-98e6-8909595b8605')
s = s.replace('b30c9262-9abf-4cd1-9476-adcf5723c029',
'b88526b7-3966-43fd-ae76-1e39881c86aa')
# TODO: Replace LockGuard texture UUIDs
# OpenSim 0.8.0 does not support this constant.
#s = s.replace('OBJECT_BODY_SHAPE_TYPE', '26 /*OBJECT_BODY_SHAPE_TYPE*/')
@ -70,9 +76,87 @@ def oss_process(filename):
s = os_line_re.sub(r'\1\2', s)
s = sl_block_re.sub('', s)
s = os_block_re.sub(r'\1', s)
new = ''
for match in token_re.finditer(s):
if match.group(1):
new += match.group(1) # remove '#'
else:
new += match.group(0)
s = new
sys.stdout.write(s)
return 0
def setvars(filename, *settings):
"""Preprocess a file in place, to replace values"""
import re
values = {}
var_value_re = re.compile(r'^([^=]*)=(.*)$')
for v in settings:
match = var_value_re.search(v)
if not match:
sys.stderr.write('Incorrect setting format, it should be key=value\n')
return 1
values[match.group(1)] = match.group(2)
#sys.stderr.write(filename + '\n')
if filename is not None:
f = open(filename, "r")
else:
f = sys.stdin
try:
s = f.read()
finally:
if filename is not None:
f.close()
orig = s
# Regex to read a token in the set of expected tokens.
# NOTE: This regex deliberately ignores // so that //#variable = value; is still valid.
token_re = re.compile(r'"(?:\\.|[^"\\]+)*"|/\*[\S\s]*?\*/|/|;|[^#;/"]+|#([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*|#')
p = 0
while True:
match = token_re.search(s, p)
if not match:
break
if match.group(1) in values:
# found '#variable = ' in the code, and variable matches
value = values[match.group(1)]
# mark the start of the value as the end of the match
vbegin = match.end(0)
while True:
# keep skipping tokens until we hit a ';'
p = match.end(0)
match = token_re.search(s, p)
if not match:
# end of script? this is wrong but better don't crash
vend = vbegin
break
if match.group(0) == ';':
# mark end of value before the matching ';'
vend = match.start(0)
break
# Replace the value between vbegin and vend
s = s[:vbegin] + value + s[vend:]
# Advance past the value to keep searching
p = vbegin + len(value)
continue
# not a token we're interested in - keep searching after it
p = match.end(0)
if s != orig:
if filename is not None:
f = open(filename, "w")
else:
f = sys.stdout
try:
f.write(s)
finally:
if filename is not None:
f.close()
def main(argc, argv):
if argc < 2:
usage()
@ -82,6 +166,9 @@ def main(argc, argv):
if cmd == 'rm':
return rm(argv[2:])
if cmd == 'setvars':
return setvars(argv[2], *argv[3:])
if cmd == 'oss-process':
if argc > 3:
usage()