#!/usr/bin/env python # # Copyright (C) 2020-2021 by # David Turner, Robert Wilhelm, and Werner Lemberg. # # This file is part of the FreeType project, and may only be used, modified, # and distributed under the terms of the FreeType project license, # LICENSE.TXT. By continuing to use, modify, or distribute this file you # indicate that you have read the license and understand and accept it # fully. """Extract the libtool version from `configure.raw`. This script parses the `configure.raw` file to extract the libtool version number. By default, the full dotted version number is printed, but `--major`, `--minor` or `--patch` can be used to only print one of these values instead. """ from __future__ import print_function import argparse import os import re import sys # Expected input: # # ... # version_info='23:2:17' # ... RE_VERSION_INFO = re.compile(r"^version_info='(\d+):(\d+):(\d+)'") def parse_configure_raw(header): major = None minor = None patch = None for line in header.splitlines(): line = line.rstrip() m = RE_VERSION_INFO.match(line) if m: assert major == None, "version_info appears more than once!" major = m.group(1) minor = m.group(2) patch = m.group(3) continue assert ( major and minor and patch ), "This input file is missing a version_info definition!" return (major, minor, patch) def main(): parser = argparse.ArgumentParser(description=__doc__) group = parser.add_mutually_exclusive_group() group.add_argument( "--major", action="store_true", help="Only print the major version number.", ) group.add_argument( "--minor", action="store_true", help="Only print the minor version number.", ) group.add_argument( "--patch", action="store_true", help="Only print the patch version number.", ) group.add_argument( "--soversion", action="store_true", help="Only print the libtool library suffix.", ) parser.add_argument( "input", metavar="CONFIGURE_RAW", help="The input configure.raw file to parse.", ) args = parser.parse_args() with open(args.input) as f: raw_file = f.read() version = parse_configure_raw(raw_file) if args.major: print(version[0]) elif args.minor: print(version[1]) elif args.patch: print(version[2]) elif args.soversion: # Convert libtool version_info to the library suffix. # (current,revision, age) -> (current - age, age, revision) print( "%d.%s.%s" % (int(version[0]) - int(version[2]), version[2], version[1]) ) else: print("%s.%s.%s" % version) return 0 if __name__ == "__main__": sys.exit(main())