summaryrefslogtreecommitdiff
path: root/util/build_scripts/check-dllexport-usage.py
blob: 09875ad6eafde2e18bf1b5692a6820488ee6b591 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
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)