mirror of
https://github.com/mpv-player/mpv
synced 2024-12-11 09:25:56 +00:00
6bb73040dd
Trigraphs such as "??=" (which are enabled by default with -std=c11) can mess up strings, so avoid them entirely by escaping question marks. This also drops Python 2 compatibility from file2string, making the change to the waf rule necessary. The input file is now opened in binary mode which is also more correct versus the old text mode which just happened to work even on binary files.
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__
|