Workaround bindinate mistake in gst_element_factory_get_static_pad_templates return...
[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")
18     parser.add_argument("--glue-includes")
19     parser.add_argument("--glue-libname")
20     parser.add_argument("--assembly-name")
21     parser.add_argument("--extra-includes", action='append', default=[])
22     parser.add_argument("--out")
23     parser.add_argument("--files")
24     parser.add_argument("--symbols")
25     parser.add_argument("--schema")
26     parser.add_argument("--fakeglue", action='store_true')
27
28     opts = parser.parse_args()
29     if opts.fakeglue:
30         exit(0)
31
32     if not opts.glue_libname:
33         opts.glue_libname = opts.assembly_name + 'sharpglue-3'
34
35     api_xml = os.path.join(opts.out, os.path.basename(
36         opts.api_raw).replace('.raw', '.xml'))
37
38     shutil.copyfile(opts.api_raw, api_xml)
39
40     cmd = [opts.gapi_fixup, "--api=" + api_xml,
41                            "--metadata=" + opts.metadata]
42     if opts.symbols:
43         cmd.extend(['--symbols=' + opts.symbols])
44     subprocess.check_call(cmd)
45
46     cmd = [
47         opts.gapi_codegen, '--generate', api_xml,
48         '--outdir=' + opts.out,
49         '--glue-filename=' + opts.glue_file,
50         '--gluelib-name=' + opts.glue_libname,
51         '--glue-includes=' + opts.glue_includes,
52         '--assembly-name=' + opts.assembly_name,]
53
54     if opts.schema:
55         cmd += ['--schema=' + opts.schema]
56
57     for flag in opts.extra_includes:
58         flags = flag.split()
59         for flag in flags:
60             if not flag.startswith('-I'):
61                 flag = '-I' + flag
62             cmd.append(flag)
63
64     print(' '.join(cmd))
65     subprocess.check_call(cmd)
66
67     # WORKAROUND: Moving files into the out directory with special names
68     # as meson doesn't like path separator in output names.
69     regex = re.compile('_')
70     dirs = set()
71     for _f in opts.files.split(';'):
72         fpath = os.path.join(opts.out, regex.sub("/", _f, 1))
73         dirs.add(os.path.dirname(fpath))
74         _f = os.path.join(opts.out, _f)
75         shutil.move(fpath, _f)
76
77     missing_files = []
78     for _dir in dirs:
79         missing_files.extend(glob.glob(os.path.join(_dir, '*.cs')))
80
81     if missing_files:
82         print("Following files were generated but not listed:\n    %s" %
83               '\n    '.join(["'%s_%s'," % (m.split(os.path.sep)[-2], m.split(os.path.sep)[-1])
84              for m in missing_files]))
85         exit(1)
86
87     for _dir in dirs:
88         shutil.rmtree(_dir)