mirror of https://github.com/mpv-player/mpv
96 lines
3.2 KiB
Python
96 lines
3.2 KiB
Python
from waflib.Build import BuildContext
|
|
from waflib import TaskGen, Utils
|
|
from io import StringIO
|
|
from TOOLS.matroska import generate_C_header, generate_C_definitions
|
|
from TOOLS.file2string import file2string
|
|
import os
|
|
|
|
def __wayland_scanner_cmd__(ctx, mode, dir, src, vendored_file):
|
|
return "${{WAYSCAN}} {0} < {1} > ${{TGT}}".format(
|
|
mode,
|
|
"${SRC}" if vendored_file else "{}/{}".format(dir, src)
|
|
)
|
|
|
|
def __file2string__(ctx, **kwargs):
|
|
ctx(
|
|
rule = __file2string_cmd__(ctx),
|
|
before = ("c",),
|
|
name = os.path.basename(kwargs['target']),
|
|
**kwargs
|
|
)
|
|
|
|
def execf(self, fn):
|
|
setattr(self, 'before', ['c'])
|
|
setattr(self, 'rule', ' ') # waf doesn't print the task with no rule
|
|
target = getattr(self, 'target', None)
|
|
out = self.path.find_or_declare(target)
|
|
tmp = StringIO()
|
|
fn(tmp)
|
|
out.write(tmp.getvalue())
|
|
tmp.close()
|
|
|
|
@TaskGen.feature('file2string')
|
|
def f2s(self):
|
|
def fn(out):
|
|
source = getattr(self, 'source', None)
|
|
src = self.path.find_resource(source)
|
|
file2string(source, iter(src.read('rb').splitlines(True)), out)
|
|
execf(self, fn)
|
|
|
|
@TaskGen.feature('ebml_header')
|
|
def ebml_header(self):
|
|
execf(self, generate_C_header)
|
|
|
|
@TaskGen.feature('ebml_definitions')
|
|
def ebml_definitions(self):
|
|
execf(self, generate_C_definitions)
|
|
|
|
def __wayland_protocol_code__(ctx, **kwargs):
|
|
protocol_is_vendored = kwargs.get("vendored_protocol", False)
|
|
file_name = kwargs['protocol'] + '.xml'
|
|
|
|
if protocol_is_vendored:
|
|
del kwargs['vendored_protocol']
|
|
kwargs['source'] = '{}/{}'.format(kwargs['proto_dir'], file_name)
|
|
|
|
ctx(
|
|
rule = __wayland_scanner_cmd__(ctx, 'private-code', kwargs['proto_dir'],
|
|
file_name,
|
|
protocol_is_vendored),
|
|
name = os.path.basename(kwargs['target']),
|
|
**kwargs
|
|
)
|
|
|
|
def __wayland_protocol_header__(ctx, **kwargs):
|
|
protocol_is_vendored = kwargs.get("vendored_protocol", False)
|
|
file_name = kwargs['protocol'] + '.xml'
|
|
|
|
if protocol_is_vendored:
|
|
del kwargs['vendored_protocol']
|
|
kwargs['source'] = '{}/{}'.format(kwargs['proto_dir'], file_name)
|
|
|
|
ctx(
|
|
rule = __wayland_scanner_cmd__(ctx, 'client-header', kwargs['proto_dir'],
|
|
file_name,
|
|
protocol_is_vendored),
|
|
before = ('c',),
|
|
name = os.path.basename(kwargs['target']),
|
|
**kwargs
|
|
)
|
|
|
|
@TaskGen.feature('cprogram')
|
|
@TaskGen.feature('cshlib')
|
|
@TaskGen.feature('cstlib')
|
|
@TaskGen.feature('apply_link')
|
|
@TaskGen.after_method('process_source', 'process_use', 'apply_link', 'process_uselib_local', 'propagate_uselib_vars', 'do_the_symbol_stuff')
|
|
def handle_add_object(tgen):
|
|
if getattr(tgen, 'add_objects', None):
|
|
for input in tgen.add_objects:
|
|
input_node = tgen.path.find_resource(input)
|
|
if input_node is not None:
|
|
tgen.link_task.inputs.append(input_node)
|
|
|
|
BuildContext.file2string = __file2string__
|
|
BuildContext.wayland_protocol_code = __wayland_protocol_code__
|
|
BuildContext.wayland_protocol_header = __wayland_protocol_header__
|