summaryrefslogtreecommitdiff
path: root/configure
blob: a039e8c3b619d57e53a371f0f24b802ab418ffa6 (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
#!/usr/bin/env python3

import os
import re
import shlex
import shutil
import subprocess

cmds = {}
warnings = []

class CheckError(Exception):
    pass

def checking(thing):
    stderr.write("checking %s... " % thing)
    stderr.flush()

def warn(string):
    warnings.append(string)
    stderr.write("WARNING: %s\n" % string)

def check(name, why, flags=[], optional=False, var=None, run=True):
    global warn
    checking("for %s" % name)
    var = var or name.upper()
    varvalue = os.getenv(var)
    if varvalue == '':
        stderr.write("skipping\n")
        if not optional:
            warn("%s is required to %s, the code will not fall back gracefully without it!" % (name, why))
        return
    elif varvalue is None:
        varvalue = name
    split = shlex.split(varvalue)
    exe = shutil.which(split[0])
    if not exe:
        stderr.write("not found\n")
        if not optional:
            raise CheckError()
        else:
            warn("%s is recommended to %s." % (name, why))
            return
    stderr.write("%s\n" % exe)
    cmd = [exe] + split[1:] + flags + shlex.split(os.getenv(var + "FLAGS") or "")
    if run:
        checking("%s usability" % exe)
        try:
            subprocess.check_call(cmd + ["-h"], stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT)
            stderr.write("yes\n")
        except subprocess.CalledProcessError as e:
            raise CheckError() from e

    cmds[var] = cmd
    return cmd

def run_ffmpeg(arg):
    return subprocess.check_output(ffmpeg + [arg], stderr=subprocess.STDOUT).decode('utf-8')

def ffmpeg_check(name, regex, checks, output):
    for check in checks:
        checking("if %s supports %s %s" % (ffmpeg[0], name, check))

        if re.search("\n %s %s " % (regex, check), output):
            stderr.write("yes\n")
        else:
            stderr.write("no\n")
            raise CheckError()

if __name__ == "__main__":
    # no, this line isn't bugged. really. examine check() and Makefile
    if not check("zopfli", "compress gzip files better than gzip -9", optional=True, var="GZIP"):
        check("gzip", "pre-compress the JSON files", ["-9"])

    check("apngasm", "assemble the click-to-continue image", run=False)
    check("convert", "perform miscellaneous actions on the images")
    check("cwebp", "convert all images to WebP for webkit browsers", ["-quiet", "-alpha_cleanup", "-m", "6"])
    ffmpeg = check("ffmpeg", "convert audio and video to HTML5 formats", ["-v", "warning", "-y"], run=False)
    if ffmpeg:
        ffmpeg_formats = run_ffmpeg("-formats")
        ffmpeg_check("demuxing", "D.", ["matroska,webm", "ogg", "wav", "yuv4mpegpipe"], ffmpeg_formats)
        ffmpeg_check("muxing", ".E", ["ipod", "mp4", "ogg", "wav", "webm", "yuv4mpegpipe"], ffmpeg_formats)
        ffmpeg_check("decoding", ".{6}", ["mpeg4", "rawvideo", "pcm_s16le", "vorbis"], run_ffmpeg("-decoders"))
        ffmpeg_check("encoding", ".{6}", ["libx264", "rawvideo", "libtheora", "libvpx", "libvpx-vp9", "libfdk_aac", "libopus", "pcm_s16le"], run_ffmpeg("-encoders"))
    check("npm", "install uglifyjs", ["--quiet"])
    check("webpmux", "assemble the WebP click-to-continue image")
    check("defluff", "decrease the size of DEFLATE files including gzip and PNG files", optional=True, run=False)
    check("pngquant", "quantize PNG images, improving compatibility and dramatically decreasing size", optional=True)
    check("zopflipng", "recompress DEFLATE files including gzip and PNG files", optional=True)

    stderr.write("creating Makefile.inc\n")

    with open("Makefile.inc", "w") as f:
        f.write(''.join('%s := %s\n' % (k, subprocess.list2cmdline(cmds[k])) for k in cmds))

    if len(warnings):
        stderr.write("Warnings during configuration:\n")
        stderr.write('\n'.join(warnings) + '\n')

    stderr.write("Run `make' now to build HTML5KS.\n")