mpv/waftools/checks/custom.py

153 lines
5.8 KiB
Python

from waftools import inflector
from waftools.checks.generic import *
from waflib import Utils
import os
__all__ = ["check_pthreads", "check_iconv", "check_lua", "check_oss_4front",
"check_cocoa", "check_openal", "check_rpi"]
pthreads_program = load_fragment('pthreads.c')
def check_pthread_flag(ctx, dependency_identifier):
checks = [
check_cc(fragment = pthreads_program, cflags = '-pthread'),
check_cc(fragment = pthreads_program, cflags = '-pthread',
linkflags = '-pthread') ]
for fn in checks:
if fn(ctx, dependency_identifier):
return True
return False
def check_pthreads(ctx, dependency_identifier):
if ctx.dependency_satisfied('win32-internal-pthreads'):
h = ctx.path.find_node('osdep/win32/include').abspath()
# define IN_WINPTHREAD to workaround mingw stupidity (we never want it
# to define features specific to its own pthread stuff)
ctx.env.CFLAGS += ['-isystem', h, '-I', h, '-DIN_WINPTHREAD']
return True
if check_pthread_flag(ctx, dependency_identifier):
return True
platform_cflags = {
'linux': '-D_REENTRANT',
'freebsd': '-D_THREAD_SAFE',
'netbsd': '-D_THREAD_SAFE',
'openbsd': '-D_THREAD_SAFE',
}.get(ctx.env.DEST_OS, '')
libs = ['pthreadGC2', 'pthread']
checkfn = check_cc(fragment=pthreads_program, cflags=platform_cflags)
checkfn_nocflags = check_cc(fragment=pthreads_program)
for fn in [checkfn, checkfn_nocflags]:
if check_libs(libs, fn)(ctx, dependency_identifier):
return True
return False
def check_iconv(ctx, dependency_identifier):
iconv_program = load_fragment('iconv.c')
libdliconv = " ".join(ctx.env.LIB_LIBDL + ['iconv'])
libs = ['iconv', libdliconv]
args = {'fragment': iconv_program}
if ctx.env.DEST_OS == 'openbsd' or ctx.env.DEST_OS == 'freebsd':
args['cflags'] = '-I/usr/local/include'
args['linkflags'] = '-L/usr/local/lib'
elif ctx.env.DEST_OS == 'win32':
args['linkflags'] = " ".join(['-L' + x for x in ctx.env.LIBRARY_PATH])
checkfn = check_cc(**args)
return check_libs(libs, checkfn)(ctx, dependency_identifier)
def check_lua(ctx, dependency_identifier):
lua_versions = [
( '51', 'lua >= 5.1.0 lua < 5.2.0'),
( '51obsd', 'lua51 >= 5.1.0'), # OpenBSD
( '51deb', 'lua5.1 >= 5.1.0'), # debian
( '51fbsd', 'lua-5.1 >= 5.1.0'), # FreeBSD
( '52', 'lua >= 5.2.0 lua < 5.3.0' ),
( '52arch', 'lua52 >= 5.2.0'), # Arch
( '52deb', 'lua5.2 >= 5.2.0'), # debian
( '52fbsd', 'lua-5.2 >= 5.2.0'), # FreeBSD
( 'luajit', 'luajit >= 2.0.0' ),
]
if ctx.options.LUA_VER:
lua_versions = \
[lv for lv in lua_versions if lv[0] == ctx.options.LUA_VER]
for lua_version, pkgconfig_query in lua_versions:
if check_pkg_config(pkgconfig_query, uselib_store=lua_version) \
(ctx, dependency_identifier):
# XXX: this is a bit of a hack, ask waf developers if I can copy
# the uselib_store to 'lua'
ctx.mark_satisfied(lua_version)
ctx.add_optional_message(dependency_identifier,
'version found: ' + lua_version)
return True
return False
def __get_osslibdir():
cmd = ['sh', '-c', '. /etc/oss.conf && echo $OSSLIBDIR']
p = Utils.subprocess.Popen(cmd, stdin=Utils.subprocess.PIPE,
stdout=Utils.subprocess.PIPE,
stderr=Utils.subprocess.PIPE)
return p.communicate()[0].decode().rstrip()
def check_oss_4front(ctx, dependency_identifier):
oss_libdir = __get_osslibdir()
# avoid false positive from native sys/soundcard.h
if not oss_libdir:
ctx.undefine(inflector.define_key(dependency_identifier))
return False
soundcard_h = os.path.join(oss_libdir, "include/sys/soundcard.h")
include_dir = os.path.join(oss_libdir, "include")
fn = check_cc(header_name=soundcard_h,
defines=['PATH_DEV_DSP="/dev/dsp"',
'PATH_DEV_MIXER="/dev/mixer"'],
cflags='-I{0}'.format(include_dir),
fragment=load_fragment('oss_audio.c'))
return fn(ctx, dependency_identifier)
def check_cocoa(ctx, dependency_identifier):
fn = check_cc(
fragment = load_fragment('cocoa.m'),
compile_filename = 'test.m',
framework_name = ['Cocoa', 'IOKit', 'OpenGL', 'QuartzCore'],
includes = ctx.srcnode.abspath(),
linkflags = '-fobjc-arc')
return fn(ctx, dependency_identifier)
def check_openal(ctx, dependency_identifier):
checks = [
check_pkg_config('openal', '>= 1.13'),
check_statement(['OpenAL/AL.h'], 'int i = AL_VERSION', framework='OpenAL')
]
for fn in checks:
if fn(ctx, dependency_identifier):
return True
return False
def check_rpi(ctx, dependency_identifier):
# We need MMAL/bcm_host/dispmanx APIs.
# Upstream keeps pkgconfig files in '/opt/vc/lib/pkgconfig'.
# See https://github.com/raspberrypi/userland/issues/245
# PKG_CONFIG_SYSROOT_DIR helps with cross compilation.
prev_pkg_path = os.getenv('PKG_CONFIG_PATH', '')
os.environ['PKG_CONFIG_PATH'] = os.pathsep.join(
filter(None, [os.path.join(os.getenv('PKG_CONFIG_SYSROOT_DIR', '/'),
'opt/vc/lib/pkgconfig'),
prev_pkg_path]))
checks = [
check_pkg_config('bcm_host', uselib_store='bcm_host'),
check_pkg_config('egl'),
check_cc(lib=['mmal_core', 'mmal_util', 'mmal_vc_client'], use=['bcm_host']),
]
ret = all((fn(ctx, dependency_identifier) for fn in checks))
os.environ['PKG_CONFIG_PATH'] = prev_pkg_path
return ret