import os from subprocess import Popen, PIPE Import('env') def parsemajorminor(hcode): 'Extract major and minor version from a C++ header file.' import re mx = re.search(r'(?m)^#define *DIFFPY_VERSION_MAJOR *(\d+)', hcode) major = int(mx.group(1)) mx = re.search(r'(?m)^#define *DIFFPY_VERSION_MINOR *(\d+)', hcode) minor = int(mx.group(1)) return (major, minor) def build_VersionCode(target, source, env): import string tplcode = source[0].get_contents() major, minor = parsemajorminor(tplcode) gsha, gepoch, gisodate = gitlog.split(None, 2) daydate = int(gepoch) // 86400 flds = { 'DIFFPY_VERSION' : 10000000 * major + 100000 * minor + daydate, 'DIFFPY_VERSION_STR' : "%i.%i-t%i" % (major, minor, daydate), 'DIFFPY_VERSION_DATE' : gisodate, 'DIFFPY_GIT_SHA' : gsha, } versiontemplate = string.Template(tplcode) versioncode = versiontemplate.safe_substitute(flds) open(target[0].path, 'w').write(versioncode) return None env.Append(BUILDERS={'BuildVersionCode' : Builder(action=build_VersionCode, suffix='.hpp', src_suffix='.tpl')}) # Targets -------------------------------------------------------------------- vhpp = File('version.hpp') # If version.hpp exists do not use git if os.path.isfile(str(vhpp.srcnode())): majorminor = parsemajorminor(vhpp.srcnode().get_contents()) else: vtpl = File('version.tpl') proc = Popen(['git', 'log', '-1', '--format=%h %at %ai'], stdout=PIPE) gitlog = proc.stdout.read().strip() vhpp, = env.BuildVersionCode(['version.hpp'], vtpl) env.Depends(vhpp, env.Value(gitlog)) majorminor = parsemajorminor(vtpl.get_contents()) env['majorminor'] = majorminor # vim: ft=python