diff options
Diffstat (limited to 'util/build_scripts/check-dllexport-usage.py')
-rw-r--r-- | util/build_scripts/check-dllexport-usage.py | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/util/build_scripts/check-dllexport-usage.py b/util/build_scripts/check-dllexport-usage.py new file mode 100644 index 0000000..09875ad --- /dev/null +++ b/util/build_scripts/check-dllexport-usage.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python3 +# +# Check for the first line in a file generated with gmmproc, +# to see which gmmproc version was used, to see whether +# to enable __declspec(dllexport to export symbols). This +# is *not* intended for source files that are not generated +# with gmmproc. +# +# Author: Chun-wei Fan April 2, 2020 + +import argparse +import os +import sys + +min_required_gmmproc_ver = '2.64.3' + +parser = argparse.ArgumentParser(description='Check gmmproc version used.') +parser.add_argument('--file', + dest='file', + help='Generated .cc/.h file to check gmmproc version') +parser.add_argument('--gmmprocdir', + dest='gmmprocdir', + help='Directory where gmmproc is located') +args = parser.parse_args() + +if args.file is None and args.gmmprocdir is None: + raise ValueError('Either --file or --gmmprocdir must be specified') + +if args.gmmprocdir is not None: + # gmmprocdir is specified: Check version string in gmmproc + gmmproc_path = os.path.join(args.gmmprocdir, 'gmmproc') + if not os.path.exists(gmmproc_path): + raise ValueError('A valid directory to locate gmmproc must be ' \ + 'specified with --gmmprocdir=<directory>') + + gmmproc_ver_str = None + with open(gmmproc_path, 'r') as f: + for line in f: + if line.startswith(' $main::glibmm_version = '): + gmmproc_ver_str = line[line.find('\"') + 1:line.rfind('\"')] + + if gmmproc_ver_str is None: + raise ValueError('The gmmproc at %s is invalid' % gmmproc_path) + + gmmproc_ver = gmmproc_ver_str.split('.') +else: + # A pre-generated file is specified via --file + if not os.path.exists(args.file): + raise FileNotFoundError('File specified with --file does not exist') + + # We only allow .h/.cc files to run this check + if not args.file.endswith('.cc') and \ + not args.file.endswith('.h'): + raise ValueError('Only .cc/.h files are accepted here') + + # Now grab the first line of the file we are checking for + f = open(args.file) + firstline = f.readline() + f.close() + + # Check for gmmproc signature... + if not firstline.startswith('// Generated by gmmproc '): + raise ValueError('Specified file is not generated by gmmproc') + + tokens = firstline.split() + gmmproc_ver = tokens[tokens.index('gmmproc') + 1].split('.') + +# Now compare the gmmproc version against the one we want +# (2.64.3 or later) +gmmproc_major = int(gmmproc_ver[0]) +gmmproc_minor = int(gmmproc_ver[1]) +gmmproc_micro = int(gmmproc_ver[2]) + +min_required_ver = min_required_gmmproc_ver.split('.') +min_major_ver = int(min_required_ver[0]) +min_minor_ver = int(min_required_ver[1]) +min_micro_ver = int(min_required_ver[2]) + +if gmmproc_major > min_major_ver or \ + (gmmproc_major == min_major_ver and \ + gmmproc_minor > min_minor_ver) or \ + (gmmproc_major == min_major_ver and \ + gmmproc_minor == min_minor_ver and \ + gmmproc_micro >= min_micro_ver): + sys.exit(0) +else: + sys.exit(1) |