shithub: freetype+ttf2subf

Download patch

ref: 3ce0df52e2bba8a8f788a05c705b90fd10275665
parent: d686f2ff9c40235085558fed91a57d05c7656335
author: Werner Lemberg <wl@gnu.org>
date: Tue Sep 22 16:05:37 EDT 2020

[meson] Move auxiliary scripts to `builds/meson`.

Suggested by Alexei.

* scripts/*.py: Move meson scripts to...
* builds/meson/*.py: ... this new location.

* meson.build: Updated.

git/fs: mount .git/fs: mount/attach disallowed
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2020-09-22  Werner Lemberg  <wl@gnu.org>
+
+	[meson] Move auxiliary scripts to `builds/meson`.
+
+	Suggested by Alexei.
+
+	* scripts/*.py: Move meson scripts to...
+	* builds/meson/*.py: ... this new location.
+
+	* meson.build: Updated.
+
 2020-09-21  David Turner  <david@freetype.org>
 
 	Add python script for building tarballs.
--- /dev/null
+++ b/builds/meson/extract_freetype_version.py
@@ -1,0 +1,107 @@
+#!/usr/bin/env python
+"""Extract the FreeType version numbers from `<freetype/freetype.h>`.
+
+This script parses the header to extract the version number defined there. 
+By default, the full dotted version number is printed, but `--major`,
+`--minor` or `--patch` can be used to only print one of these values
+instead.
+"""
+
+from __future__ import print_function
+
+import argparse
+import os
+import re
+import sys
+
+# Expected input:
+#
+#  ...
+#  #define FREETYPE_MAJOR  2
+#  #define FREETYPE_MINOR  10
+#  #define FREETYPE_PATCH  2
+#  ...
+
+RE_MAJOR = re.compile(r"^ \#define \s+ FREETYPE_MAJOR \s+ (.*) $", re.X)
+RE_MINOR = re.compile(r"^ \#define \s+ FREETYPE_MINOR \s+ (.*) $", re.X)
+RE_PATCH = re.compile(r"^ \#define \s+ FREETYPE_PATCH \s+ (.*) $", re.X)
+
+
+def parse_freetype_header(header):
+    major = None
+    minor = None
+    patch = None
+
+    for line in header.splitlines():
+        line = line.rstrip()
+        m = RE_MAJOR.match(line)
+        if m:
+            assert major == None, "FREETYPE_MAJOR appears more than once!"
+            major = m.group(1)
+            continue
+
+        m = RE_MINOR.match(line)
+        if m:
+            assert minor == None, "FREETYPE_MINOR appears more than once!"
+            minor = m.group(1)
+            continue
+
+        m = RE_PATCH.match(line)
+        if m:
+            assert patch == None, "FREETYPE_PATCH appears more than once!"
+            patch = m.group(1)
+            continue
+
+    assert (
+        major and minor and patch
+    ), "This header is missing one of FREETYPE_MAJOR, FREETYPE_MINOR or FREETYPE_PATCH!"
+
+    return (major, minor, patch)
+
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__)
+
+    group = parser.add_mutually_exclusive_group()
+    group.add_argument(
+        "--major",
+        action="store_true",
+        help="Only print the major version number.",
+    )
+    group.add_argument(
+        "--minor",
+        action="store_true",
+        help="Only print the minor version number.",
+    )
+    group.add_argument(
+        "--patch",
+        action="store_true",
+        help="Only print the patch version number.",
+    )
+
+    parser.add_argument(
+        "input",
+        metavar="FREETYPE_H",
+        help="The input freetype.h header to parse.",
+    )
+
+    args = parser.parse_args()
+    with open(args.input) as f:
+        header = f.read()
+
+    version = parse_freetype_header(header)
+
+    if args.major:
+        print(version[0])
+    elif args.minor:
+        print(version[1])
+    elif args.patch:
+        print(version[2])
+    else:
+        print("%s.%s.%s" % version)
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
--- /dev/null
+++ b/builds/meson/extract_libtool_version.py
@@ -1,0 +1,105 @@
+#!/usr/bin/env python
+"""Extract the libtool version from `configure.raw`.
+
+This script parses the `configure.raw` file to extract the libtool version
+number.  By default, the full dotted version number is printed, but
+`--major`, `--minor` or `--patch` can be used to only print one of these
+values instead.
+"""
+
+from __future__ import print_function
+
+import argparse
+import os
+import re
+import sys
+
+# Expected input:
+#
+#  ...
+#  version_info='23:2:17'
+#  ...
+
+RE_VERSION_INFO = re.compile(r"^version_info='(\d+):(\d+):(\d+)'")
+
+
+def parse_configure_raw(header):
+    major = None
+    minor = None
+    patch = None
+
+    for line in header.splitlines():
+        line = line.rstrip()
+        m = RE_VERSION_INFO.match(line)
+        if m:
+            assert major == None, "version_info appears more than once!"
+            major = m.group(1)
+            minor = m.group(2)
+            patch = m.group(3)
+            continue
+
+    assert (
+        major and minor and patch
+    ), "This input file is missing a version_info definition!"
+
+    return (major, minor, patch)
+
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__)
+
+    group = parser.add_mutually_exclusive_group()
+    group.add_argument(
+        "--major",
+        action="store_true",
+        help="Only print the major version number.",
+    )
+    group.add_argument(
+        "--minor",
+        action="store_true",
+        help="Only print the minor version number.",
+    )
+    group.add_argument(
+        "--patch",
+        action="store_true",
+        help="Only print the patch version number.",
+    )
+    group.add_argument(
+        "--soversion",
+        action="store_true",
+        help="Only print the libtool library suffix.",
+    )
+
+    parser.add_argument(
+        "input",
+        metavar="CONFIGURE_RAW",
+        help="The input configure.raw file to parse.",
+    )
+
+    args = parser.parse_args()
+    with open(args.input) as f:
+        raw_file = f.read()
+
+    version = parse_configure_raw(raw_file)
+
+    if args.major:
+        print(version[0])
+    elif args.minor:
+        print(version[1])
+    elif args.patch:
+        print(version[2])
+    elif args.soversion:
+        # Convert libtool version_info to the library suffix.
+        # (current,revision, age) -> (current - age, age, revision)
+        print(
+            "%d.%s.%s"
+            % (int(version[0]) - int(version[2]), version[2], version[1])
+        )
+    else:
+        print("%s.%s.%s" % version)
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
--- /dev/null
+++ b/builds/meson/generate_reference_docs.py
@@ -1,0 +1,79 @@
+#!/usr/bin/env python
+"""Generate FreeType reference documentation."""
+
+from __future__ import print_function
+
+import argparse
+import glob
+import os
+import subprocess
+import sys
+
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__)
+
+    parser.add_argument(
+        "--input-dir",
+        required=True,
+        help="Top-level FreeType source directory.",
+    )
+
+    parser.add_argument(
+        "--version", required=True, help='FreeType version (e.g. "2.x.y").'
+    )
+
+    parser.add_argument(
+        "--output-dir", required=True, help="Output directory."
+    )
+
+    args = parser.parse_args()
+
+    # Get the list of input files of interest.
+    include_dir = os.path.join(args.input_dir, "include")
+    include_config_dir = os.path.join(include_dir, "config")
+    include_cache_dir = os.path.join(include_dir, "cache")
+
+    all_headers = (
+        glob.glob(os.path.join(args.input_dir, "include", "freetype", "*.h"))
+        + glob.glob(
+            os.path.join(
+                args.input_dir, "include", "freetype", "config", "*.h"
+            )
+        )
+        + glob.glob(
+            os.path.join(
+                args.input_dir, "include", "freetype", "cache", "*.h"
+            )
+        )
+    )
+
+    if not os.path.exists(args.output_dir):
+        os.makedirs(args.output_dir)
+    else:
+        assert os.path.isdir(args.output_dir), (
+            "Not a directory: " + args.output_dir
+        )
+
+    cmds = [
+        sys.executable,
+        "-m",
+        "docwriter",
+        "--prefix=ft2",
+        "--title=FreeType-" + args.version,
+        "--site=reference",
+        "--output=" + args.output_dir,
+    ] + all_headers
+
+    print("Running docwriter...")
+    subprocess.check_call(cmds)
+
+    print("Building static site...")
+    subprocess.check_call(
+        [sys.executable, "-m", "mkdocs", "build"], cwd=args.output_dir
+    )
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
--- /dev/null
+++ b/builds/meson/parse_modules_cfg.py
@@ -1,0 +1,160 @@
+#!/usr/bin/env python
+"""Parse modules.cfg and dump its output either as ftmodule.h or a list of
+base extensions.
+"""
+
+from __future__ import print_function
+
+import argparse
+import os
+import re
+import sys
+
+# Expected input:
+#
+#  ...
+#  FONT_MODULES += <name>
+#  HINTING_MODULES += <name>
+#  RASTER_MODULES += <name>
+#  AUX_MODULES += <name>
+#  BASE_EXTENSIONS += <name>
+#  ...
+
+
+def parse_modules_cfg(input_file):
+
+    lists = {
+        "FONT_MODULES": [],
+        "HINTING_MODULES": [],
+        "RASTER_MODULES": [],
+        "AUX_MODULES": [],
+        "BASE_EXTENSIONS": [],
+    }
+
+    for line in input_file.splitlines():
+        line = line.rstrip()
+        # Ignore empty lines and those that start with a comment.
+        if not line or line[0] == "#":
+            continue
+
+        items = line.split()
+        assert len(items) == 3 and items[1] == "+=", (
+            "Unexpected input line [%s]" % line
+        )
+        assert items[0] in lists, (
+            "Unexpected configuration variable name " + items[0]
+        )
+
+        lists[items[0]].append(items[2])
+
+    return lists
+
+
+def generate_ftmodule(lists):
+    result = "/* This is a generated file. */\n"
+    for driver in lists["FONT_MODULES"]:
+        if driver == "sfnt":  # Special case for the sfnt 'driver'.
+            result += "FT_USE_MODULE( FT_Module_Class, sfnt_module_class )\n"
+            continue
+
+        name = {
+            "truetype": "tt",
+            "type1": "t1",
+            "cid": "t1cid",
+            "type42": "t42",
+            "winfonts": "winfnt",
+        }.get(driver, driver)
+        result += (
+            "FT_USE_MODULE( FT_Driver_ClassRec, %s_driver_class )\n" % name
+        )
+
+    for module in lists["HINTING_MODULES"]:
+        result += (
+            "FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % module
+        )
+
+    for module in lists["RASTER_MODULES"]:
+        name = {
+            "raster": "ft_raster1",
+            "smooth": "ft_smooth",
+        }.get(module)
+        result += (
+            "FT_USE_MODULE( FT_Renderer_Class, %s_renderer_class )\n" % name
+        )
+
+    for module in lists["AUX_MODULES"]:
+        if module in ("psaux", "psnames", "otvalid", "gxvalid"):
+            result += (
+                "FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % module
+            )
+
+    result += "/* EOF */\n"
+    return result
+
+
+def generate_main_modules(lists):
+    return "\n".join(
+        lists["FONT_MODULES"]
+        + lists["HINTING_MODULES"]
+        + lists["RASTER_MODULES"]
+    )
+
+
+def generate_aux_modules(lists):
+    return "\n".join(lists["AUX_MODULES"])
+
+
+def generate_base_extensions(lists):
+    return "\n".join(lists["BASE_EXTENSIONS"])
+
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__)
+
+    parser.add_argument(
+        "--format",
+        required=True,
+        choices=(
+            "ftmodule.h",
+            "main-modules",
+            "aux-modules",
+            "base-extensions-list",
+        ),
+        help="Select output format.",
+    )
+
+    parser.add_argument(
+        "input",
+        metavar="CONFIGURE_RAW",
+        help="The input configure.raw file to parse.",
+    )
+
+    parser.add_argument("--output", help="Output file (default is stdout).")
+
+    args = parser.parse_args()
+    with open(args.input) as f:
+        input_data = f.read()
+
+    lists = parse_modules_cfg(input_data)
+
+    if args.format == "ftmodule.h":
+        result = generate_ftmodule(lists)
+    elif args.format == "main-modules":
+        result = generate_main_modules(lists)
+    elif args.format == "aux-modules":
+        result = generate_aux_modules(lists)
+    elif args.format == "base-extensions-list":
+        result = generate_base_extensions(lists)
+    else:
+        assert False, "Invalid output format!"
+
+    if args.output:
+        with open(args.output, "w") as f:
+            f.write(result)
+    else:
+        print(result)
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
--- /dev/null
+++ b/builds/meson/process_ftoption_h.py
@@ -1,0 +1,105 @@
+#!/usr/bin/python
+"""Toggle settings in `ftoption.h` file based on command-line arguments.
+
+This script takes an `ftoption.h` file as input and rewrites
+`#define`/`#undef` lines in it based on `--enable=CONFIG_VARNAME` or
+`--disable=CONFIG_VARNAME` arguments passed to it, where `CONFIG_VARNAME` is
+configuration variable name, such as `FT_CONFIG_OPTION_USE_LZW`, that may
+appear in the file.
+
+Note that if one of `CONFIG_VARNAME` is not found in the input file, this
+script exits with an error message listing the missing variable names.
+"""
+
+import argparse
+import os
+import re
+import sys
+
+
+def main():
+    parser = argparse.ArgumentParser(description=__doc__)
+
+    parser.add_argument(
+        "input", metavar="FTOPTION_H", help="Path to input ftoption.h file."
+    )
+
+    parser.add_argument("--output", help="Output to file instead of stdout.")
+
+    parser.add_argument(
+        "--enable",
+        action="append",
+        default=[],
+        help="Enable a given build option (e.g. FT_CONFIG_OPTION_USE_LZW).",
+    )
+
+    parser.add_argument(
+        "--disable",
+        action="append",
+        default=[],
+        help="Disable a given build option.",
+    )
+
+    args = parser.parse_args()
+
+    common_options = set(args.enable) & set(args.disable)
+    if common_options:
+        parser.error(
+            "Options cannot be both enabled and disabled: %s"
+            % sorted(common_options)
+        )
+        return 1
+
+    with open(args.input) as f:
+        input_file = f.read()
+
+    options_seen = set()
+
+    new_lines = []
+    for line in input_file.splitlines():
+        # Expected formats:
+        #   #define <CONFIG_VAR>
+        #   /* #define <CONFIG_VAR> */
+        #   #undef <CONFIG_VAR>
+        line = line.rstrip()
+        if line.startswith("/* #define ") and line.endswith(" */"):
+            option_name = line[11:-3].strip()
+            option_enabled = False
+        elif line.startswith("#define "):
+            option_name = line[8:].strip()
+            option_enabled = True
+        elif line.startswith("#undef "):
+            option_name = line[7:].strip()
+            option_enabled = False
+        else:
+            new_lines.append(line)
+            continue
+
+        options_seen.add(option_name)
+        if option_enabled and option_name in args.disable:
+            line = "#undef " + option_name
+        elif not option_enabled and option_name in args.enable:
+            line = "#define " + option_name
+        new_lines.append(line)
+
+    result = "\n".join(new_lines)
+
+    # Sanity check that all command-line options were actually processed.
+    cmdline_options = set(args.enable) | set(args.disable)
+    assert cmdline_options.issubset(
+        options_seen
+    ), "Could not find options in input file: " + ", ".join(
+        sorted(cmdline_options - options_seen)
+    )
+
+    if args.output:
+        with open(args.output, "w") as f:
+            f.write(result)
+    else:
+        print(result)
+
+    return 0
+
+
+if __name__ == "__main__":
+    sys.exit(main())
--- a/meson.build
+++ b/meson.build
@@ -29,11 +29,11 @@
 python_exe = python.find_installation(required: true)
 
 ft2_version = run_command(python_exe,
-  files('scripts/extract_freetype_version.py'),
+  files('builds/meson/extract_freetype_version.py'),
   files('include/freetype/freetype.h')).stdout().strip()
 
 ft2_libtool_version = run_command(python_exe,
-  files('scripts/extract_libtool_version.py'),
+  files('builds/meson/extract_libtool_version.py'),
   '--soversion',
   files('builds/unix/configure.raw')).stdout().strip()
 
@@ -46,7 +46,7 @@
 ftmodule_h = custom_target('ftmodule.h',
   output: 'ftmodule.h',
   input: 'modules.cfg',
-  command: [python_exe, files('scripts/parse_modules_cfg.py'),
+  command: [python_exe, files('builds/meson/parse_modules_cfg.py'),
             '--format=ftmodule.h', '@INPUT@', '--output', '@OUTPUT@'],
   install: true,
   install_dir: 'include/freetype2/freetype/config',
@@ -57,7 +57,7 @@
 # FreeType 2 modules.
 
 ft_main_modules = run_command(python_exe,
-  files('scripts/parse_modules_cfg.py'),
+  files('builds/meson/parse_modules_cfg.py'),
   '--format=main-modules',
   files('modules.cfg')).stdout().strip().split()
 
@@ -78,7 +78,7 @@
 
 # NOTE: The `gzip` and `bzip2` aux modules are handled through options.
 ft_aux_modules = run_command(python_exe,
-  files('scripts/parse_modules_cfg.py'),
+  files('builds/meson/parse_modules_cfg.py'),
   '--format=aux-modules',
   files('modules.cfg')).stdout().strip().split()
 
@@ -102,7 +102,7 @@
 # Normally configured through `modules.cfg`.
 
 base_extensions = run_command(python_exe,
-  files('scripts/parse_modules_cfg.py'),
+  files('builds/meson/parse_modules_cfg.py'),
   '--format=base-extensions-list',
   files('modules.cfg')).stdout().split()
 
@@ -223,7 +223,7 @@
 # Generate `ftoption.h` based on available dependencies.
 
 ftoption_command = [python_exe,
-  files('scripts/process_ftoption_h.py'),
+  files('builds/meson/process_ftoption_h.py'),
   '@INPUT@', '--output=@OUTPUT@']
 
 # GZip support
@@ -358,7 +358,7 @@
   output: 'docs',
   input: ft2_public_headers + ft2_config_headers,
   command: [python_exe,
-    files('scripts/generate_reference_docs.py'),
+    files('builds/meson/generate_reference_docs.py'),
     '--version=' + ft2_version,
     '--input-dir=' + meson.source_root(),
     '--output-dir=@OUTPUT@'
--- a/scripts/extract_freetype_version.py
+++ /dev/null
@@ -1,107 +1,0 @@
-#!/usr/bin/env python
-"""Extract the FreeType version numbers from `<freetype/freetype.h>`.
-
-This script parses the header to extract the version number defined there. 
-By default, the full dotted version number is printed, but `--major`,
-`--minor` or `--patch` can be used to only print one of these values
-instead.
-"""
-
-from __future__ import print_function
-
-import argparse
-import os
-import re
-import sys
-
-# Expected input:
-#
-#  ...
-#  #define FREETYPE_MAJOR  2
-#  #define FREETYPE_MINOR  10
-#  #define FREETYPE_PATCH  2
-#  ...
-
-RE_MAJOR = re.compile(r"^ \#define \s+ FREETYPE_MAJOR \s+ (.*) $", re.X)
-RE_MINOR = re.compile(r"^ \#define \s+ FREETYPE_MINOR \s+ (.*) $", re.X)
-RE_PATCH = re.compile(r"^ \#define \s+ FREETYPE_PATCH \s+ (.*) $", re.X)
-
-
-def parse_freetype_header(header):
-    major = None
-    minor = None
-    patch = None
-
-    for line in header.splitlines():
-        line = line.rstrip()
-        m = RE_MAJOR.match(line)
-        if m:
-            assert major == None, "FREETYPE_MAJOR appears more than once!"
-            major = m.group(1)
-            continue
-
-        m = RE_MINOR.match(line)
-        if m:
-            assert minor == None, "FREETYPE_MINOR appears more than once!"
-            minor = m.group(1)
-            continue
-
-        m = RE_PATCH.match(line)
-        if m:
-            assert patch == None, "FREETYPE_PATCH appears more than once!"
-            patch = m.group(1)
-            continue
-
-    assert (
-        major and minor and patch
-    ), "This header is missing one of FREETYPE_MAJOR, FREETYPE_MINOR or FREETYPE_PATCH!"
-
-    return (major, minor, patch)
-
-
-def main():
-    parser = argparse.ArgumentParser(description=__doc__)
-
-    group = parser.add_mutually_exclusive_group()
-    group.add_argument(
-        "--major",
-        action="store_true",
-        help="Only print the major version number.",
-    )
-    group.add_argument(
-        "--minor",
-        action="store_true",
-        help="Only print the minor version number.",
-    )
-    group.add_argument(
-        "--patch",
-        action="store_true",
-        help="Only print the patch version number.",
-    )
-
-    parser.add_argument(
-        "input",
-        metavar="FREETYPE_H",
-        help="The input freetype.h header to parse.",
-    )
-
-    args = parser.parse_args()
-    with open(args.input) as f:
-        header = f.read()
-
-    version = parse_freetype_header(header)
-
-    if args.major:
-        print(version[0])
-    elif args.minor:
-        print(version[1])
-    elif args.patch:
-        print(version[2])
-    else:
-        print("%s.%s.%s" % version)
-
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
--- a/scripts/extract_libtool_version.py
+++ /dev/null
@@ -1,105 +1,0 @@
-#!/usr/bin/env python
-"""Extract the libtool version from `configure.raw`.
-
-This script parses the `configure.raw` file to extract the libtool version
-number.  By default, the full dotted version number is printed, but
-`--major`, `--minor` or `--patch` can be used to only print one of these
-values instead.
-"""
-
-from __future__ import print_function
-
-import argparse
-import os
-import re
-import sys
-
-# Expected input:
-#
-#  ...
-#  version_info='23:2:17'
-#  ...
-
-RE_VERSION_INFO = re.compile(r"^version_info='(\d+):(\d+):(\d+)'")
-
-
-def parse_configure_raw(header):
-    major = None
-    minor = None
-    patch = None
-
-    for line in header.splitlines():
-        line = line.rstrip()
-        m = RE_VERSION_INFO.match(line)
-        if m:
-            assert major == None, "version_info appears more than once!"
-            major = m.group(1)
-            minor = m.group(2)
-            patch = m.group(3)
-            continue
-
-    assert (
-        major and minor and patch
-    ), "This input file is missing a version_info definition!"
-
-    return (major, minor, patch)
-
-
-def main():
-    parser = argparse.ArgumentParser(description=__doc__)
-
-    group = parser.add_mutually_exclusive_group()
-    group.add_argument(
-        "--major",
-        action="store_true",
-        help="Only print the major version number.",
-    )
-    group.add_argument(
-        "--minor",
-        action="store_true",
-        help="Only print the minor version number.",
-    )
-    group.add_argument(
-        "--patch",
-        action="store_true",
-        help="Only print the patch version number.",
-    )
-    group.add_argument(
-        "--soversion",
-        action="store_true",
-        help="Only print the libtool library suffix.",
-    )
-
-    parser.add_argument(
-        "input",
-        metavar="CONFIGURE_RAW",
-        help="The input configure.raw file to parse.",
-    )
-
-    args = parser.parse_args()
-    with open(args.input) as f:
-        raw_file = f.read()
-
-    version = parse_configure_raw(raw_file)
-
-    if args.major:
-        print(version[0])
-    elif args.minor:
-        print(version[1])
-    elif args.patch:
-        print(version[2])
-    elif args.soversion:
-        # Convert libtool version_info to the library suffix.
-        # (current,revision, age) -> (current - age, age, revision)
-        print(
-            "%d.%s.%s"
-            % (int(version[0]) - int(version[2]), version[2], version[1])
-        )
-    else:
-        print("%s.%s.%s" % version)
-
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
--- a/scripts/generate_reference_docs.py
+++ /dev/null
@@ -1,79 +1,0 @@
-#!/usr/bin/env python
-"""Generate FreeType reference documentation."""
-
-from __future__ import print_function
-
-import argparse
-import glob
-import os
-import subprocess
-import sys
-
-
-def main():
-    parser = argparse.ArgumentParser(description=__doc__)
-
-    parser.add_argument(
-        "--input-dir",
-        required=True,
-        help="Top-level FreeType source directory.",
-    )
-
-    parser.add_argument(
-        "--version", required=True, help='FreeType version (e.g. "2.x.y").'
-    )
-
-    parser.add_argument(
-        "--output-dir", required=True, help="Output directory."
-    )
-
-    args = parser.parse_args()
-
-    # Get the list of input files of interest.
-    include_dir = os.path.join(args.input_dir, "include")
-    include_config_dir = os.path.join(include_dir, "config")
-    include_cache_dir = os.path.join(include_dir, "cache")
-
-    all_headers = (
-        glob.glob(os.path.join(args.input_dir, "include", "freetype", "*.h"))
-        + glob.glob(
-            os.path.join(
-                args.input_dir, "include", "freetype", "config", "*.h"
-            )
-        )
-        + glob.glob(
-            os.path.join(
-                args.input_dir, "include", "freetype", "cache", "*.h"
-            )
-        )
-    )
-
-    if not os.path.exists(args.output_dir):
-        os.makedirs(args.output_dir)
-    else:
-        assert os.path.isdir(args.output_dir), (
-            "Not a directory: " + args.output_dir
-        )
-
-    cmds = [
-        sys.executable,
-        "-m",
-        "docwriter",
-        "--prefix=ft2",
-        "--title=FreeType-" + args.version,
-        "--site=reference",
-        "--output=" + args.output_dir,
-    ] + all_headers
-
-    print("Running docwriter...")
-    subprocess.check_call(cmds)
-
-    print("Building static site...")
-    subprocess.check_call(
-        [sys.executable, "-m", "mkdocs", "build"], cwd=args.output_dir
-    )
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
--- a/scripts/parse_modules_cfg.py
+++ /dev/null
@@ -1,160 +1,0 @@
-#!/usr/bin/env python
-"""Parse modules.cfg and dump its output either as ftmodule.h or a list of
-base extensions.
-"""
-
-from __future__ import print_function
-
-import argparse
-import os
-import re
-import sys
-
-# Expected input:
-#
-#  ...
-#  FONT_MODULES += <name>
-#  HINTING_MODULES += <name>
-#  RASTER_MODULES += <name>
-#  AUX_MODULES += <name>
-#  BASE_EXTENSIONS += <name>
-#  ...
-
-
-def parse_modules_cfg(input_file):
-
-    lists = {
-        "FONT_MODULES": [],
-        "HINTING_MODULES": [],
-        "RASTER_MODULES": [],
-        "AUX_MODULES": [],
-        "BASE_EXTENSIONS": [],
-    }
-
-    for line in input_file.splitlines():
-        line = line.rstrip()
-        # Ignore empty lines and those that start with a comment.
-        if not line or line[0] == "#":
-            continue
-
-        items = line.split()
-        assert len(items) == 3 and items[1] == "+=", (
-            "Unexpected input line [%s]" % line
-        )
-        assert items[0] in lists, (
-            "Unexpected configuration variable name " + items[0]
-        )
-
-        lists[items[0]].append(items[2])
-
-    return lists
-
-
-def generate_ftmodule(lists):
-    result = "/* This is a generated file. */\n"
-    for driver in lists["FONT_MODULES"]:
-        if driver == "sfnt":  # Special case for the sfnt 'driver'.
-            result += "FT_USE_MODULE( FT_Module_Class, sfnt_module_class )\n"
-            continue
-
-        name = {
-            "truetype": "tt",
-            "type1": "t1",
-            "cid": "t1cid",
-            "type42": "t42",
-            "winfonts": "winfnt",
-        }.get(driver, driver)
-        result += (
-            "FT_USE_MODULE( FT_Driver_ClassRec, %s_driver_class )\n" % name
-        )
-
-    for module in lists["HINTING_MODULES"]:
-        result += (
-            "FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % module
-        )
-
-    for module in lists["RASTER_MODULES"]:
-        name = {
-            "raster": "ft_raster1",
-            "smooth": "ft_smooth",
-        }.get(module)
-        result += (
-            "FT_USE_MODULE( FT_Renderer_Class, %s_renderer_class )\n" % name
-        )
-
-    for module in lists["AUX_MODULES"]:
-        if module in ("psaux", "psnames", "otvalid", "gxvalid"):
-            result += (
-                "FT_USE_MODULE( FT_Module_Class, %s_module_class )\n" % module
-            )
-
-    result += "/* EOF */\n"
-    return result
-
-
-def generate_main_modules(lists):
-    return "\n".join(
-        lists["FONT_MODULES"]
-        + lists["HINTING_MODULES"]
-        + lists["RASTER_MODULES"]
-    )
-
-
-def generate_aux_modules(lists):
-    return "\n".join(lists["AUX_MODULES"])
-
-
-def generate_base_extensions(lists):
-    return "\n".join(lists["BASE_EXTENSIONS"])
-
-
-def main():
-    parser = argparse.ArgumentParser(description=__doc__)
-
-    parser.add_argument(
-        "--format",
-        required=True,
-        choices=(
-            "ftmodule.h",
-            "main-modules",
-            "aux-modules",
-            "base-extensions-list",
-        ),
-        help="Select output format.",
-    )
-
-    parser.add_argument(
-        "input",
-        metavar="CONFIGURE_RAW",
-        help="The input configure.raw file to parse.",
-    )
-
-    parser.add_argument("--output", help="Output file (default is stdout).")
-
-    args = parser.parse_args()
-    with open(args.input) as f:
-        input_data = f.read()
-
-    lists = parse_modules_cfg(input_data)
-
-    if args.format == "ftmodule.h":
-        result = generate_ftmodule(lists)
-    elif args.format == "main-modules":
-        result = generate_main_modules(lists)
-    elif args.format == "aux-modules":
-        result = generate_aux_modules(lists)
-    elif args.format == "base-extensions-list":
-        result = generate_base_extensions(lists)
-    else:
-        assert False, "Invalid output format!"
-
-    if args.output:
-        with open(args.output, "w") as f:
-            f.write(result)
-    else:
-        print(result)
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())
--- a/scripts/process_ftoption_h.py
+++ /dev/null
@@ -1,105 +1,0 @@
-#!/usr/bin/python
-"""Toggle settings in `ftoption.h` file based on command-line arguments.
-
-This script takes an `ftoption.h` file as input and rewrites
-`#define`/`#undef` lines in it based on `--enable=CONFIG_VARNAME` or
-`--disable=CONFIG_VARNAME` arguments passed to it, where `CONFIG_VARNAME` is
-configuration variable name, such as `FT_CONFIG_OPTION_USE_LZW`, that may
-appear in the file.
-
-Note that if one of `CONFIG_VARNAME` is not found in the input file, this
-script exits with an error message listing the missing variable names.
-"""
-
-import argparse
-import os
-import re
-import sys
-
-
-def main():
-    parser = argparse.ArgumentParser(description=__doc__)
-
-    parser.add_argument(
-        "input", metavar="FTOPTION_H", help="Path to input ftoption.h file."
-    )
-
-    parser.add_argument("--output", help="Output to file instead of stdout.")
-
-    parser.add_argument(
-        "--enable",
-        action="append",
-        default=[],
-        help="Enable a given build option (e.g. FT_CONFIG_OPTION_USE_LZW).",
-    )
-
-    parser.add_argument(
-        "--disable",
-        action="append",
-        default=[],
-        help="Disable a given build option.",
-    )
-
-    args = parser.parse_args()
-
-    common_options = set(args.enable) & set(args.disable)
-    if common_options:
-        parser.error(
-            "Options cannot be both enabled and disabled: %s"
-            % sorted(common_options)
-        )
-        return 1
-
-    with open(args.input) as f:
-        input_file = f.read()
-
-    options_seen = set()
-
-    new_lines = []
-    for line in input_file.splitlines():
-        # Expected formats:
-        #   #define <CONFIG_VAR>
-        #   /* #define <CONFIG_VAR> */
-        #   #undef <CONFIG_VAR>
-        line = line.rstrip()
-        if line.startswith("/* #define ") and line.endswith(" */"):
-            option_name = line[11:-3].strip()
-            option_enabled = False
-        elif line.startswith("#define "):
-            option_name = line[8:].strip()
-            option_enabled = True
-        elif line.startswith("#undef "):
-            option_name = line[7:].strip()
-            option_enabled = False
-        else:
-            new_lines.append(line)
-            continue
-
-        options_seen.add(option_name)
-        if option_enabled and option_name in args.disable:
-            line = "#undef " + option_name
-        elif not option_enabled and option_name in args.enable:
-            line = "#define " + option_name
-        new_lines.append(line)
-
-    result = "\n".join(new_lines)
-
-    # Sanity check that all command-line options were actually processed.
-    cmdline_options = set(args.enable) | set(args.disable)
-    assert cmdline_options.issubset(
-        options_seen
-    ), "Could not find options in input file: " + ", ".join(
-        sorted(cmdline_options - options_seen)
-    )
-
-    if args.output:
-        with open(args.output, "w") as f:
-            f.write(result)
-    else:
-        print(result)
-
-    return 0
-
-
-if __name__ == "__main__":
-    sys.exit(main())