summaryrefslogtreecommitdiffstats
path: root/waftools/checks/custom.py
blob: 6d6268ead7c30615c1c6614785ce7ed2d005ae63 (plain)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
from waftools.checks.generic import *

__all__ = ["check_pthreads", "check_iconv", "check_lua", "check_oss"]

pthreads_program = load_fragment('pthreads.c')

def check_pthreads(ctx, dependency_identifier):
    platform_cflags = {
        'linux':   '-D_REENTRANT',
        'freebsd': '-D_THREAD_SAFE',
        'netbsd':  '-D_THREAD_SAFE',
        'openbsd': '-D_THREAD_SAFE',
        'win32':   '-DPTW32_STATIC_LIB',
    }.get(ctx.env.DEST_OS, '')
    libs    = ['pthreadGC2', 'pthread']
    checkfn = check_cc(fragment=pthreads_program, cflags=platform_cflags)
    return check_libs(libs, checkfn)(ctx, dependency_identifier)

def check_iconv(ctx, dependency_identifier):
    iconv_program = load_fragment('iconv.c')
    libdliconv = " ".join(ctx.env.LIB_LIBDL + ['iconv'])
    libs       = ['iconv', libdliconv]
    checkfn = check_cc(fragment=iconv_program)
    return check_libs(libs, checkfn)(ctx, dependency_identifier)

def check_lua(ctx, dependency_identifier):
    if ctx.dependency_satisfied('libquvi4'):
        quvi_lib_storage = [ 'libquvi4' ]
        additional_lua_test_header = '#include <quvi/quvi.h>'
        additional_lua_test_code   = load_fragment('lua_libquvi4.c')
    elif ctx.dependency_satisfied('libquvi9'):
        quvi_lib_storage = [ 'libquvi9' ]
        additional_lua_test_header = '#include <quvi.h>'
        additional_lua_test_code   = load_fragment('lua_libquvi9.c')
    else:
        quvi_lib_storage = []
        additional_lua_test_header = ''
        additional_lua_test_code   = ''

    fragment = load_fragment('lua.c').format(
        additional_lua_test_header=additional_lua_test_header,
        additional_lua_test_code=additional_lua_test_code)

    lua_versions = [
        ( '51',     'lua >= 5.1.0 lua < 5.2.0'),
        ( '51deb',  'lua5.1 >= 5.1.0'), # debian
        ( 'luajit', 'luajit >= 2.0.0' ),
        # assume all our dependencies (libquvi in particular) link with 5.1
        ( '52',     'lua >= 5.2.0' ),
        ( '52deb',  'lua5.2 >= 5.2.0'), # debian
    ]

    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 compose_checks(
            check_pkg_config(pkgconfig_query, uselib_store=lua_version),
            check_cc(fragment=fragment, use=[lua_version] + quvi_lib_storage))\
                (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

# from here on there is the OSS check.. just stop reading here unless you want
# to die inside a little
def __fail_oss_check__(ctx):
    ctx.define('PATH_DEV_DSP', '')
    ctx.define('PATH_DEV_MIXER', '')
    return False

def __get_osslibdir__():
    try:
        cmd = ['sh', '-c', "'source /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]
    except Exception:
        return ""

def __check_oss_headers__(ctx, dependency_identifier):
    import os

    real_oss = ctx.check_cc(fragment=load_fragment('oss_audio_header.c'),
                            use='soundcard')

    if real_oss:
        if os.path.exists('/etc/oss.conf'):
            osslibdir   = __get_osslibdir__()
            ossincdir   = os.path.join(osslibdir, 'include')
            soundcard_h = os.path.join(ossincdir, 'sys', 'soundcard.h')
            if os.path.exists(soundcard_h):
                ctx.env.CFLAGS.append('-I{0}'.format(ossincdir))

    return True

def __check_oss_bsd__(ctxdependency_identifier):
    # add the oss audio library through a check
    ctx.define('PATH_DEV_DSP', '/dev/sound')
    if check_cc(lib='ossaudio')(ctx, dependency_identifier):
        return True
    else:
        return __fail_oss_check__(ctx)

def check_oss(ctx, dependency_identifier):
    func = check_cc(fragment=load_fragment('oss_audio.c'), use='soundcard')
    if func(ctx, dependency_identifier):
        ctx.define('PATH_DEV_DSP',   '/dev/dsp')
        ctx.define('PATH_DEV_MIXER', '/dev/mixer')

        if ctx.env.DEST_OS in ['openbsd', 'netbsd']:
            return __check_oss_bsd_library__(ctx, dependency_identifier)
        else:
            return __check_oss_headers__(ctx, dependency_identifier)

    return __fail_oss_check__(ctx)