File: meson.py

package info (click to toggle)
radare2-cutter 1.12.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 6,768 kB
  • sloc: cpp: 38,432; python: 507; sh: 505; xml: 115; makefile: 89; ansic: 10; javascript: 3
file content (102 lines) | stat: -rw-r--r-- 3,845 bytes parent folder | download
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
import argparse
import importlib.util
import logging
import os
import subprocess
import sys

ROOT = None
log = None
r2_meson_mod = None

def import_r2_meson_mod():
    """Import radare2/sys/meson.py"""
    global r2_meson_mod
    folder = os.path.dirname(__file__)
    r2_meson_path = os.path.join(folder, 'radare2', 'sys', 'meson.py')
    r2_meson_spec = importlib.util.spec_from_file_location('meson', r2_meson_path)
    r2_meson_mod = importlib.util.module_from_spec(r2_meson_spec)
    r2_meson_spec.loader.exec_module(r2_meson_mod)

def set_global_vars():
    global log
    global ROOT

    ROOT = os.path.abspath(os.path.dirname(__file__))

    logging.basicConfig(format='[%(name)s][%(levelname)s]: %(message)s',
                        level=logging.DEBUG)
    log = logging.getLogger('cutter-meson')
    log.debug('ROOT: %s', ROOT)

    r2_meson_mod.set_global_variables()

def win_dist(args):
    os.makedirs(args.dist)
    r2_meson_mod.copy(os.path.join(args.dir, 'Cutter.exe'), args.dist)
    log.debug('Deploying Qt5')
    subprocess.call(['windeployqt', '--release', os.path.join(args.dist, 'Cutter.exe')])
    log.debug('Deploying libr2')
    r2_meson_mod.PATH_FMT.update(r2_meson_mod.R2_PATH)
    r2_meson_mod.meson('install', options=[['-C', '{}'.format(args.dir)], '--no-rebuild'])

def build(args):
    cutter_builddir = os.path.join(ROOT, args.dir)
    if not os.path.exists(cutter_builddir):
        defines = ['-Denable_python=%s' % str(args.python).lower(),
                   '-Denable_python_bindings=%s' % str(args.python_bindings).lower()]
        if os.name == 'nt':
            defines.append('-Dradare2:r2_incdir=radare2/include')
            defines.append('-Dradare2:r2_libdir=radare2/lib')
            defines.append('-Dradare2:r2_datdir=radare2/share')
            defines.append('-Dc_args=-D_UNICODE -DUNICODE')
        r2_meson_mod.meson('setup', rootdir=os.path.join(ROOT, 'src'), builddir=args.dir,
                           prefix=os.path.abspath(args.dist), backend=args.backend,
                           release=args.release, shared=False, options=defines)
    if not args.nobuild:
        log.info('Building cutter')
        if args.backend == 'ninja':
            r2_meson_mod.ninja(cutter_builddir)
        else:
            project = os.path.join(cutter_builddir, 'Cutter.sln')
            r2_meson_mod.msbuild(project, '/m')

def main():
    set_global_vars()

    parser = argparse.ArgumentParser(description='Meson script for Cutter')
    parser.add_argument('--backend', choices=r2_meson_mod.BACKENDS,
                        default='ninja', help='Choose build backend')
    parser.add_argument('--dir', default='build',
                        help='Destination build directory')
    parser.add_argument('--python', action='store_true',
                        help='Enable Python support')
    parser.add_argument('--python-bindings', action='store_true',
                        help='Enable Python Bindings')
    parser.add_argument('--release', action='store_true',
                        help='Set the build as Release (remove debug info)')
    parser.add_argument('--nobuild', action='store_true',
                        help='Only run meson and do not build.')
    if os.name == 'nt':
        parser.add_argument('--dist', help='dist directory')
    args = parser.parse_args()

    if os.name == 'nt' and not args.dist:
        args.dist = args.dir
    args.dist = os.path.abspath(args.dist)
    args.dir = os.path.abspath(args.dir)

    if hasattr(args, 'dist') and args.dist and os.path.exists(args.dist):
        log.error('%s already exists', args.dist)
        sys.exit(1)

    log.debug('Arguments: %s', args)

    build(args)

    if os.name == 'nt' and hasattr(args, 'dist') and args.dist:
        win_dist(args)

import_r2_meson_mod()
if __name__ == '__main__':
    main()