Add ABI tests and fix related issues
[platform/upstream/gstreamer.git] / generate_code.py
1 #!/usr/bin/env python3
2
3 import argparse
4 import glob
5 import os
6 import re
7 import shutil
8 import subprocess
9
10
11 if __name__ == "__main__":
12     parser = argparse.ArgumentParser()
13     parser.add_argument("--api-raw")
14     parser.add_argument("--gapi-fixup")
15     parser.add_argument("--metadata")
16     parser.add_argument("--gapi-codegen")
17     parser.add_argument("--glue-file", default="")
18     parser.add_argument("--glue-includes", default="")
19     parser.add_argument("--abi-cs-usings", default="")
20     parser.add_argument("--glue-libname", default="")
21     parser.add_argument("--assembly-name")
22     parser.add_argument("--extra-includes", action='append', default=[])
23     parser.add_argument("--out")
24     parser.add_argument("--files")
25     parser.add_argument("--symbols")
26     parser.add_argument("--schema")
27     parser.add_argument("--fakeglue", action='store_true')
28
29     opts = parser.parse_args()
30     if opts.fakeglue:
31         exit(0)
32
33     if not opts.glue_libname:
34         opts.glue_libname = opts.assembly_name + 'sharpglue-3'
35
36     api_xml = os.path.join(opts.out, os.path.basename(
37         opts.api_raw).replace('.raw', '.xml'))
38
39     shutil.copyfile(opts.api_raw, api_xml)
40
41     if shutil.which('mono'):
42         launcher = ['mono', '--debug']
43     else:
44         launcher = []
45
46     cmd = [opts.gapi_fixup, "--api=" + api_xml]
47     if opts.metadata:
48         cmd += ["--metadata=" + opts.metadata]
49     if opts.symbols:
50         cmd.extend(['--symbols=' + opts.symbols])
51     subprocess.check_call(launcher + cmd)
52
53     cmd = [
54         opts.gapi_codegen, '--generate', api_xml,
55         '--outdir=' + opts.out,
56         '--glue-filename=' + opts.glue_file,
57         '--gluelib-name=' + opts.glue_libname,
58         '--glue-includes=' + opts.glue_includes,
59         '--assembly-name=' + opts.assembly_name,
60         '--abi-c-filename=' + os.path.join(opts.out, opts.assembly_name + "-abi.c"),
61         '--abi-cs-filename=' + os.path.join(opts.out, opts.assembly_name + "-abi.cs"),
62     ]
63
64     if opts.schema:
65         cmd += ['--schema=' + opts.schema]
66
67     if opts.abi_cs_usings:
68         cmd += ['--abi-cs-usings=' + opts.abi_cs_usings]
69
70     cmd += ['-I' + i for i in opts.extra_includes]
71
72     subprocess.check_call(launcher + cmd)
73
74     # WORKAROUND: Moving files into the out directory with special names
75     # as meson doesn't like path separator in output names.
76     regex = re.compile('_')
77     dirs = set()
78     for _f in opts.files.split(';'):
79         fpath = os.path.join(opts.out, regex.sub("/", _f, 1))
80         dirs.add(os.path.dirname(fpath))
81         _f = os.path.join(opts.out, _f)
82         shutil.move(fpath, _f)
83
84     missing_files = []
85     for _dir in dirs:
86         missing_files.extend(glob.glob(os.path.join(_dir, '*.cs')))
87
88     if missing_files:
89         print("Following files were generated but not listed:\n    %s" %
90               '\n    '.join(["'%s_%s'," % (m.split(os.path.sep)[-2], m.split(os.path.sep)[-1])
91              for m in missing_files]))
92         exit(1)
93
94     for _dir in dirs:
95         shutil.rmtree(_dir)