summaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
Diffstat (limited to 'util')
-rw-r--r--util/build_scripts/check-dllexport-usage.py87
-rwxr-xr-xutil/build_scripts/dist-build-scripts.py1
-rw-r--r--util/mm-common-get.1.in2
-rw-r--r--util/mm-common-get.in2
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.