ref: e8ee98e669c25d0b8e67cdaace9a6b7e49c7a0c0
parent: 4f13a43ab32ba77793d8528d4b4c057c6f76b835
author: Werner Lemberg <[email protected]>
date: Fri Sep 25 03:22:08 EDT 2020
Move `scripts/make_distribution_archives.py` to `src/tools`. * scr/tools/scripts/make_distribution_archives.py: (_TOP_DIR, _SCRIPT_DIR): Updated to new location. (main): s/shutils.copyfile/shutils.copy/ to preserve file permissions. (main): Prefix source file paths with `git_dir` while copying files to allow calls of the script from other places than the top-level directory.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2020-09-25 Werner Lemberg <[email protected]>
+
+ Move `scripts/make_distribution_archives.py` to `src/tools`.
+
+ * scr/tools/scripts/make_distribution_archives.py: (_TOP_DIR,
+ _SCRIPT_DIR): Updated to new location.
+ (main): s/shutils.copyfile/shutils.copy/ to preserve file
+ permissions.
+ (main): Prefix source file paths with `git_dir` while copying files
+ to allow calls of the script from other places than the top-level
+ directory.
+
2020-09-24 Werner Lemberg <[email protected]>
* src/cff/cffgload.c (cff_slot_load): Scale `vertBearingY`.
--- a/scripts/make_distribution_archives.py
+++ /dev/null
@@ -1,208 +1,0 @@
-#!/usr/bin/env python3
-"""Generate distribution archives for a given FreeType 2 release."""
-
-from __future__ import print_function
-
-import argparse
-import atexit
-import os
-import shutil
-import subprocess
-import sys
-import tempfile
-
-_SCRIPT_DIR = os.path.dirname(__file__)
-_TOP_DIR = os.path.abspath(os.path.join(_SCRIPT_DIR, ".."))
-
-
-def get_cmd_output(cmd, cwd=None):
- """Run a command and return its output as a string."""
- if cwd is not None:
- out = subprocess.check_output(cmd, cwd=cwd)
- else:
- out = subprocess.check_output(cmd)
- return out.decode("utf-8").rstrip()
-
-
-def is_git_dir_clean(git_dir):
- """Return True iff |git_dir| is a git directory in clean state."""
- out = get_cmd_output(["git", "status", "--porcelain"], cwd=git_dir)
- return len(out) == 0
-
-
-def main():
- parser = argparse.ArgumentParser(description=__doc__)
-
- parser.add_argument(
- "--source_dir", default=_TOP_DIR, help="Source directory path."
- )
-
- parser.add_argument(
- "--version",
- help=(
- "Specify alternate FreeType version (it is otherwise extracted"
- " from current sources by default)."
- ),
- )
-
- parser.add_argument(
- "--gnu-config-dir",
- help=(
- "Path of input directory containing recent `config.guess` and"
- " `config.sub` files from GNU config."
- ),
- )
-
- parser.add_argument(
- "--build-dir",
- help="Specify build directory. Only used for debugging this script.",
- )
-
- parser.add_argument(
- "--ignore-clean-check",
- action="store_true",
- help=(
- "Do not check for a clean source git repository. Only used for"
- " debugging this script."
- ),
- )
-
- parser.add_argument(
- "output_dir", help="Output directory for generated archives."
- )
-
- args = parser.parse_args()
-
- git_dir = args.source_dir if args.source_dir else _TOP_DIR
- if not args.ignore_clean_check and not is_git_dir_clean(git_dir):
- sys.stderr.write(
- "ERROR: Your git repository is not in a clean state: %s\n"
- % git_dir
- )
- return 1
-
- if args.version:
- version = args.version
- else:
- # Extract FreeType version from sources.
- version = get_cmd_output(
- [
- sys.executable,
- os.path.join(_SCRIPT_DIR, "extract_freetype_version.py"),
- os.path.join(_TOP_DIR, "include", "freetype", "freetype.h"),
- ]
- )
-
- # Determine the build directory. This will be a temporary file that is
- # cleaned up on script exit by default, unless --build-dir=DIR is used,
- # in which case we only create and empty the directory, but never remove
- # its content on exit.
- if args.build_dir:
- build_dir = args.build_dir
- if not os.path.exists(build_dir):
- os.makedirs(build_dir)
- else:
- # Remove anything from the build directory, if any.
- for item in os.listdir(build_dir):
- file_path = os.path.join(build_dir, item)
- if os.path.isdir(file_path):
- shutil.rmtree(file_path)
- else:
- os.unlink(file_path)
- else:
- # Create a temporary directory, and ensure it is removed on exit.
- build_dir = tempfile.mkdtemp(prefix="freetype-dist-")
-
- def clean_build_dir():
- shutil.rmtree(build_dir)
-
- atexit.register(clean_build_dir)
-
- # Copy all source files known to git into $BUILD_DIR/freetype-$VERSION
- # with the exception of .gitignore and .mailmap files.
- source_files = [
- f
- for f in get_cmd_output(["git", "ls-files"], cwd=git_dir).split("\n")
- if os.path.basename(f) not in (".gitignore", ".mailmap")
- ]
-
- freetype_dir = "freetype-" + version
- tmp_src_dir = os.path.join(build_dir, freetype_dir)
- os.makedirs(tmp_src_dir)
-
- for src in source_files:
- dst = os.path.join(tmp_src_dir, src)
- dst_dir = os.path.dirname(dst)
- if not os.path.exists(dst_dir):
- os.makedirs(dst_dir)
- shutil.copyfile(src, dst)
-
- # Run autogen.sh in directory.
- subprocess.check_call(["/bin/sh", "autogen.sh"], cwd=tmp_src_dir)
- shutil.rmtree(
- os.path.join(tmp_src_dir, "builds", "unix", "autom4te.cache")
- )
-
- # Copy config.guess and config.sub if possible!
- if args.gnu_config_dir:
- for f in ("config.guess", "config.sub"):
- shutil.copyfile(
- os.path.join(args.gnu_config_dir, f),
- os.path.join(tmp_src_dir, "builds", "unix", f),
- )
-
- # Generate reference documentation under docs/
- subprocess.check_call(
- [
- sys.executable,
- os.path.join(_SCRIPT_DIR, "generate_reference_docs.py"),
- "--input-dir",
- tmp_src_dir,
- "--version",
- version,
- "--output-dir",
- os.path.join(tmp_src_dir, "docs"),
- ]
- )
-
- shutil.rmtree(os.path.join(tmp_src_dir, "docs", "markdown"))
- os.unlink(os.path.join(tmp_src_dir, "docs", "mkdocs.yml"))
-
- # Generate our archives
- freetype_tar = freetype_dir + ".tar"
-
- subprocess.check_call(
- ["tar", "-H", "ustar", "-chf", freetype_tar, freetype_dir],
- cwd=build_dir,
- )
-
- subprocess.check_call(
- ["gzip", "-9", "--keep", freetype_tar], cwd=build_dir
- )
-
- subprocess.check_call(["xz", "--keep", freetype_tar], cwd=build_dir)
-
- ftwinversion = "ft" + "".join(version.split("."))
- subprocess.check_call(
- ["zip", "-qlr9", ftwinversion + ".zip", freetype_dir], cwd=build_dir
- )
-
- # Copy file to output directory now.
- if not os.path.exists(args.output_dir):
- os.makedirs(args.output_dir)
-
- for f in (
- freetype_tar + ".gz",
- freetype_tar + ".xz",
- ftwinversion + ".zip",
- ):
- shutil.copyfile(
- os.path.join(build_dir, f), os.path.join(args.output_dir, f)
- )
-
- # Done!
- return 0
-
-
-if __name__ == "__main__":
- sys.exit(main())
--- /dev/null
+++ b/src/tools/make_distribution_archives.py
@@ -1,0 +1,208 @@
+#!/usr/bin/env python3
+"""Generate distribution archives for a given FreeType 2 release."""
+
+from __future__ import print_function
+
+import argparse
+import atexit
+import os
+import shutil
+import subprocess
+import sys
+import tempfile
+
+_TOP_DIR = os.path.abspath(os.path.join(__file__, "..", "..", ".."))
+_SCRIPT_DIR = os.path.dirname(os.path.join(_TOP_DIR, "builds", "meson", ""))
+
+
+def get_cmd_output(cmd, cwd=None):
+ """Run a command and return its output as a string."""
+ if cwd is not None:
+ out = subprocess.check_output(cmd, cwd=cwd)
+ else:
+ out = subprocess.check_output(cmd)
+ return out.decode("utf-8").rstrip()
+
+
+def is_git_dir_clean(git_dir):
+ """Return True iff |git_dir| is a git directory in clean state."""
+ out = get_cmd_output(["git", "status", "--porcelain"], cwd=git_dir)
+ return len(out) == 0
+
+
+def main():
+ parser = argparse.ArgumentParser(description=__doc__)
+
+ parser.add_argument(
+ "--source_dir", default=_TOP_DIR, help="Source directory path."
+ )
+
+ parser.add_argument(
+ "--version",
+ help=(
+ "Specify alternate FreeType version (it is otherwise extracted"
+ " from current sources by default)."
+ ),
+ )
+
+ parser.add_argument(
+ "--gnu-config-dir",
+ help=(
+ "Path of input directory containing recent `config.guess` and"
+ " `config.sub` files from GNU config."
+ ),
+ )
+
+ parser.add_argument(
+ "--build-dir",
+ help="Specify build directory. Only used for debugging this script.",
+ )
+
+ parser.add_argument(
+ "--ignore-clean-check",
+ action="store_true",
+ help=(
+ "Do not check for a clean source git repository. Only used for"
+ " debugging this script."
+ ),
+ )
+
+ parser.add_argument(
+ "output_dir", help="Output directory for generated archives."
+ )
+
+ args = parser.parse_args()
+
+ git_dir = args.source_dir if args.source_dir else _TOP_DIR
+ if not args.ignore_clean_check and not is_git_dir_clean(git_dir):
+ sys.stderr.write(
+ "ERROR: Your git repository is not in a clean state: %s\n"
+ % git_dir
+ )
+ return 1
+
+ if args.version:
+ version = args.version
+ else:
+ # Extract FreeType version from sources.
+ version = get_cmd_output(
+ [
+ sys.executable,
+ os.path.join(_SCRIPT_DIR, "extract_freetype_version.py"),
+ os.path.join(_TOP_DIR, "include", "freetype", "freetype.h"),
+ ]
+ )
+
+ # Determine the build directory. This will be a temporary file that is
+ # cleaned up on script exit by default, unless --build-dir=DIR is used,
+ # in which case we only create and empty the directory, but never remove
+ # its content on exit.
+ if args.build_dir:
+ build_dir = args.build_dir
+ if not os.path.exists(build_dir):
+ os.makedirs(build_dir)
+ else:
+ # Remove anything from the build directory, if any.
+ for item in os.listdir(build_dir):
+ file_path = os.path.join(build_dir, item)
+ if os.path.isdir(file_path):
+ shutil.rmtree(file_path)
+ else:
+ os.unlink(file_path)
+ else:
+ # Create a temporary directory, and ensure it is removed on exit.
+ build_dir = tempfile.mkdtemp(prefix="freetype-dist-")
+
+ def clean_build_dir():
+ shutil.rmtree(build_dir)
+
+ atexit.register(clean_build_dir)
+
+ # Copy all source files known to git into $BUILD_DIR/freetype-$VERSION
+ # with the exception of .gitignore and .mailmap files.
+ source_files = [
+ f
+ for f in get_cmd_output(["git", "ls-files"], cwd=git_dir).split("\n")
+ if os.path.basename(f) not in (".gitignore", ".mailmap")
+ ]
+
+ freetype_dir = "freetype-" + version
+ tmp_src_dir = os.path.join(build_dir, freetype_dir)
+ os.makedirs(tmp_src_dir)
+
+ for src in source_files:
+ dst = os.path.join(tmp_src_dir, src)
+ dst_dir = os.path.dirname(dst)
+ if not os.path.exists(dst_dir):
+ os.makedirs(dst_dir)
+ shutil.copy(os.path.join(git_dir, src), dst)
+
+ # Run autogen.sh in directory.
+ subprocess.check_call(["/bin/sh", "autogen.sh"], cwd=tmp_src_dir)
+ shutil.rmtree(
+ os.path.join(tmp_src_dir, "builds", "unix", "autom4te.cache")
+ )
+
+ # Copy config.guess and config.sub if possible!
+ if args.gnu_config_dir:
+ for f in ("config.guess", "config.sub"):
+ shutil.copy(
+ os.path.join(args.gnu_config_dir, f),
+ os.path.join(tmp_src_dir, "builds", "unix", f),
+ )
+
+ # Generate reference documentation under docs/
+ subprocess.check_call(
+ [
+ sys.executable,
+ os.path.join(_SCRIPT_DIR, "generate_reference_docs.py"),
+ "--input-dir",
+ tmp_src_dir,
+ "--version",
+ version,
+ "--output-dir",
+ os.path.join(tmp_src_dir, "docs"),
+ ]
+ )
+
+ shutil.rmtree(os.path.join(tmp_src_dir, "docs", "markdown"))
+ os.unlink(os.path.join(tmp_src_dir, "docs", "mkdocs.yml"))
+
+ # Generate our archives
+ freetype_tar = freetype_dir + ".tar"
+
+ subprocess.check_call(
+ ["tar", "-H", "ustar", "-chf", freetype_tar, freetype_dir],
+ cwd=build_dir,
+ )
+
+ subprocess.check_call(
+ ["gzip", "-9", "--keep", freetype_tar], cwd=build_dir
+ )
+
+ subprocess.check_call(["xz", "--keep", freetype_tar], cwd=build_dir)
+
+ ftwinversion = "ft" + "".join(version.split("."))
+ subprocess.check_call(
+ ["zip", "-qlr9", ftwinversion + ".zip", freetype_dir], cwd=build_dir
+ )
+
+ # Copy file to output directory now.
+ if not os.path.exists(args.output_dir):
+ os.makedirs(args.output_dir)
+
+ for f in (
+ freetype_tar + ".gz",
+ freetype_tar + ".xz",
+ ftwinversion + ".zip",
+ ):
+ shutil.copy(
+ os.path.join(build_dir, f), os.path.join(args.output_dir, f)
+ )
+
+ # Done!
+ return 0
+
+
+if __name__ == "__main__":
+ sys.exit(main())