diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/build_scripts/check-dllexport-usage.py | 87 | ||||
-rwxr-xr-x | util/build_scripts/dist-build-scripts.py | 1 | ||||
-rw-r--r-- | util/mm-common-get.1.in | 2 | ||||
-rw-r--r-- | util/mm-common-get.in | 2 |
4 files changed, 91 insertions, 1 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) diff --git a/util/build_scripts/dist-build-scripts.py b/util/build_scripts/dist-build-scripts.py index 7318bc7..bdcda10 100755 --- a/util/build_scripts/dist-build-scripts.py +++ b/util/build_scripts/dist-build-scripts.py @@ -19,6 +19,7 @@ os.makedirs(dist_script_dir, exist_ok=True) # Distribute files that mm-common-get has copied to src_script_dir. files = [ + 'check-dllexport-usage.py', 'dist-build-scripts.py', 'dist-changelog.py', 'doc-reference.py', diff --git a/util/mm-common-get.1.in b/util/mm-common-get.1.in index ff8996c..951f7ea 100644 --- a/util/mm-common-get.1.in +++ b/util/mm-common-get.1.in @@ -30,6 +30,8 @@ are listed below. .BI "Meson build scripts copied to " BUILDSCRIPT-DIR : .PD 0 .IP +.I check-dllexport-usage.py +.IP .I dist-build-scripts.py .IP .I dist-changelog.py diff --git a/util/mm-common-get.in b/util/mm-common-get.in index e0b28f0..8a21f02 100644 --- a/util/mm-common-get.in +++ b/util/mm-common-get.in @@ -41,7 +41,7 @@ doctooldir = args.doctool_dir print(progname + ': putting Meson build scripts in ' + buildscriptdir) # Create the destination directory, if it does not exist. os.makedirs(buildscriptdir, exist_ok=True) -for file in ['dist-build-scripts.py', 'dist-changelog.py', 'doc-reference.py', 'generate-binding.py']: +for file in ['check-dllexport-usage.py', 'dist-build-scripts.py', 'dist-changelog.py', 'doc-reference.py', 'generate-binding.py']: src_file = os.path.join(pkgdatadir, 'build', file) dest_file = os.path.join(buildscriptdir, file) # Don't update the timestamp of dest_file, if it's equal to src_file. |