Mock Version: 1.4.19 ENTER ['do_with_status'](['bash', '--login', '-c', '/usr/bin/rpmbuild -bs --target x86_64 --nodeps /builddir/build/SPECS/mftrace.spec'], chrootPath='/var/lib/mock/1042070-epel-8-x86_64-1569738786.159295/root'env={'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'en_US.UTF-8'}shell=Falselogger=timeout=0uid=1001gid=135user='mockbuild'nspawn_args=['--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ia9vx876:/etc/resolv.conf']unshare_net=FalseprintOutput=True) Using nspawn with args ['--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ia9vx876:/etc/resolv.conf'] Executing command: ['/usr/bin/systemd-nspawn', '-q', '-M', '6dae695ca6fe4923bfc277f7bc3a8699', '-D', '/var/lib/mock/1042070-epel-8-x86_64-1569738786.159295/root', '-a', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ia9vx876:/etc/resolv.conf', '--setenv=TERM=vt100', '--setenv=SHELL=/bin/bash', '--setenv=HOME=/builddir', '--setenv=HOSTNAME=mock', '--setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin', '--setenv=PROMPT_COMMAND=printf "\\033]0;\\007"', '--setenv=PS1= \\s-\\v\\$ ', '--setenv=LANG=en_US.UTF-8', '-u', 'mockbuild', 'bash', '--login', '-c', '/usr/bin/rpmbuild -bs --target x86_64 --nodeps /builddir/build/SPECS/mftrace.spec'] with env {'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'en_US.UTF-8'} and shell False Building target platforms: x86_64 Building for target x86_64 Wrote: /builddir/build/SRPMS/mftrace-1.2.19-1.1.TMM.el8.src.rpm Child return code was: 0 ENTER ['do_with_status'](['bash', '--login', '-c', '/usr/bin/rpmbuild -bb --target x86_64 --nodeps /builddir/build/SPECS/mftrace.spec'], chrootPath='/var/lib/mock/1042070-epel-8-x86_64-1569738786.159295/root'env={'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'en_US.UTF-8'}shell=Falselogger=timeout=0uid=1001gid=135user='mockbuild'nspawn_args=['--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ia9vx876:/etc/resolv.conf']unshare_net=FalseprintOutput=True) Using nspawn with args ['--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ia9vx876:/etc/resolv.conf'] Executing command: ['/usr/bin/systemd-nspawn', '-q', '-M', '54a5008d034e403ca7732a2dd1a16d35', '-D', '/var/lib/mock/1042070-epel-8-x86_64-1569738786.159295/root', '-a', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ia9vx876:/etc/resolv.conf', '--setenv=TERM=vt100', '--setenv=SHELL=/bin/bash', '--setenv=HOME=/builddir', '--setenv=HOSTNAME=mock', '--setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin', '--setenv=PROMPT_COMMAND=printf "\\033]0;\\007"', '--setenv=PS1= \\s-\\v\\$ ', '--setenv=LANG=en_US.UTF-8', '-u', 'mockbuild', 'bash', '--login', '-c', '/usr/bin/rpmbuild -bb --target x86_64 --nodeps /builddir/build/SPECS/mftrace.spec'] with env {'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'en_US.UTF-8'} and shell False Building target platforms: x86_64 Building for target x86_64 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.8DDD6G + umask 022 + cd /builddir/build/BUILD + cd /builddir/build/BUILD + rm -rf mftrace-1.2.19 + /usr/bin/gzip -dc /builddir/build/SOURCES/mftrace-1.2.19.tar.gz + /usr/bin/tar -xof - + STATUS=0 + '[' 0 -ne 0 ']' + cd mftrace-1.2.19 + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + sed -i -e 's|-Wall -O2|-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection|' GNUmakefile.in + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.Ghg9Ym + umask 022 + cd /builddir/build/BUILD + cd mftrace-1.2.19 + CFLAGS='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' + export CFLAGS + CXXFLAGS='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' + export CXXFLAGS + FFLAGS='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -I/usr/lib64/gfortran/modules' + export FFLAGS + FCFLAGS='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -I/usr/lib64/gfortran/modules' + export FCFLAGS + LDFLAGS='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld' + export LDFLAGS + '[' 1 = 1 ']' +++ dirname ./configure ++ find . -name config.guess -o -name config.sub + '[' 1 = 1 ']' + '[' x '!=' 'x-Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld' ']' ++ find . -name ltmain.sh + ./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info PYTHON=/usr/bin/python2 configure: WARNING: unrecognized options: --disable-dependency-tracking checking for /usr/bin/python2... /usr/bin/python2 checking for autotrace... /usr/bin/autotrace checking for potrace... none checking for x86_64-redhat-linux-gnu-gcc... no checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking how to run the C preprocessor... gcc -E checking for grep that handles long lines and -e... /usr/bin/grep checking for egrep... /usr/bin/grep -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking whether byte ordering is bigendian... no configure: creating ./config.status config.status: creating GNUmakefile config.status: WARNING: 'GNUmakefile.in' seems to ignore the --datarootdir setting config.status: creating mftrace config.status: WARNING: 'mftrace.py' seems to ignore the --datarootdir setting config.status: creating mftrace.spec config.status: creating config.h configure: WARNING: unrecognized options: --disable-dependency-tracking + make -j2 cc -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -I. -Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld gf2pbm.c -o gf2pbm + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.a7JMh9 + umask 022 + cd /builddir/build/BUILD + '[' /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64 '!=' / ']' + rm -rf /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64 ++ dirname /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64 + mkdir -p /builddir/build/BUILDROOT + mkdir /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64 + cd mftrace-1.2.19 + make install DESTDIR=/builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64 install -d /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/man/man1 install -m644 mftrace.1 /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/man/man1/ install -d /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/mftrace/ install -m644 afm.py tfm.py /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/mftrace/ /usr/bin/python2 -m compileall /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/mftrace/ Listing /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/mftrace/ ... Compiling /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/mftrace/afm.py ... Compiling /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/mftrace/tfm.py ... install -d /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/bin install mftrace /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/bin install gf2pbm /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/bin/gf2pbm + cat /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/bin/mftrace #!/usr/bin/python2 # # this file is part of mftrace - a tool to generate scalable fonts from MF sources # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 # as published by the Free Software Foundation # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA # Copyright (c) 2001--2006 by # Han-Wen Nienhuys, Jan Nieuwenhuizen import string import os import optparse import sys import re import tempfile import shutil prefix = '/usr' bindir = '/usr/bin' datadir = '/usr/share' localedir = datadir + '/locale' libdir = '/usr/lib64' exec_prefix = '/usr' def interpolate (str): str = string.replace (str, '{', '(') str = string.replace (str, '}', ')s') str = string.replace (str, '$', '%') return str if prefix != '@' + 'prefix@': exec_prefix = interpolate (exec_prefix) % vars () bindir = interpolate (bindir) % vars () datadir = os.path.join (interpolate (datadir) % vars (), 'mftrace') libdir = interpolate (libdir) % vars () if datadir == '@' + "datadir" + "@": datadir = os.getcwd () bindir = os.getcwd () sys.path.append (datadir) import afm import tfm errorport = sys.stderr ################################################################ # lilylib.py -- options and stuff # # source file of the GNU LilyPond music typesetter try: import gettext gettext.bindtextdomain ('mftrace', localedir) gettext.textdomain ('mftrace') _ = gettext.gettext except: def _ (s): return s def shell_escape_filename (str): str = re.sub ('([\'" ])', r'\\\1', str) return str def identify (port): port.write ('%s %s\n' % (program_name, program_version)) def warranty (): identify (sys.stdout) sys.stdout.write ('\n') sys.stdout.write (_ ('Copyright (c) %s by' % ' 2001--2004')) sys.stdout.write ('\n') sys.stdout.write (' Han-Wen Nienhuys') sys.stdout.write (' Jan Nieuwenhuizen') sys.stdout.write ('\n') sys.stdout.write (_ (r''' Distributed under terms of the GNU General Public License. It comes with NO WARRANTY.''')) sys.stdout.write ('\n') def progress (s): errorport.write (s) def warning (s): errorport.write (_ ("warning: ") + s) def error (s): '''Report the error S and exit with an error status of 1. RETURN VALUE None ''' errorport.write (_ ("error: ") + s + '\n') errorport.write (_ ("Exiting ...") + '\n') sys.exit(1) temp_dir = None class TempDirectory: def __init__ (self, name=None): import tempfile if name: if not os.path.isdir (name): os.makedirs (name) self.dir = name else: self.dir = tempfile.mkdtemp () os.chdir (self.dir) def clean (self): import shutil shutil.rmtree (self.dir) def __del__ (self): self.clean () def __call__ (self): return self.dir def __repr__ (self): return self.dir def __str__ (self): return self.dir def setup_temp (name): global temp_dir if not temp_dir: temp_dir = TempDirectory (name) return temp_dir () def popen (cmd, mode = 'r', ignore_error = 0): if options.verbose: progress (_ ("Opening pipe `%s\'") % cmd) pipe = os.popen (cmd, mode) if options.verbose: progress ('\n') return pipe def system (cmd, ignore_error = 0): """Run CMD. If IGNORE_ERROR is set, don't complain when CMD returns non zero. RETURN VALUE Exit status of CMD """ if options.verbose: progress (_ ("Invoking `%s\'\n") % cmd) st = os.system (cmd) if st: name = re.match ('[ \t]*([^ \t]*)', cmd).group (1) msg = name + ': ' + _ ("command exited with value %d") % st if ignore_error: warning (msg + ' ' + _ ("(ignored)") + ' ') else: error (msg) if options.verbose: progress ('\n') return st def strip_extension (f, ext): (p, e) = os.path.splitext (f) if e == ext: e = '' return p + e ################################################################ # END Library options = None exit_value = 0 backend_options = '' program_name = 'mftrace' temp_dir = None program_version = '1.2.19' origdir = os.getcwd () coding_dict = { # from TeTeX 'TeX typewriter text': '09fbbfac.enc', # cmtt10 'TeX math symbols': '10037936.enc', # cmbsy 'ASCII caps and digits': '1b6d048e', # cminch 'TeX math italic': 'aae443f0.enc', # cmmi10 'TeX extended ASCII': 'd9b29452.enc', 'TeX text': 'f7b6d320.enc', 'TeX text without f-ligatures': '0ef0afca.enc', 'Extended TeX Font Encoding - Latin': 'tex256.enc', # LilyPond. 'fetaBraces': 'feta-braces-a.enc', 'fetaNumber': 'feta-nummer10.enc', 'fetaMusic': 'feta20.enc', 'parmesanMusic': 'parmesan20.enc', } def find_file (nm): for d in include_dirs: p = os.path.join (d, nm) try: open (p) return os.path.abspath (p) except IOError: pass p = popen ('kpsewhich %s' % shell_escape_filename (nm)).read () p = p.strip () if options.dos_kpath: orig = p p = string.lower (p) p = re.sub ('^([a-z]):', '/cygdrive/\\1', p) p = re.sub ('\\\\', '/', p) sys.stderr.write ("Got `%s' from kpsewhich, using `%s'\n" % (orig, p)) return p def flag_error (): global exit_value exit_value = 1 ################################################################ # TRACING. ################################################################ def autotrace_command (fn, opts): opts = " " + opts + " --background-color=FFFFFF --output-format=eps --input-format=pbm " return options.trace_binary + opts + backend_options \ + " --output-file=char.eps %s " % fn def potrace_command (fn, opts): return options.trace_binary + opts \ + ' -u %d ' % options.grid_scale \ + backend_options \ + " -q -c --eps --output=char.eps %s " % (fn) trace_command = None path_to_type1_ops = None def trace_one (pbmfile, id): """ Run tracer, do error handling """ status = system (trace_command (pbmfile, ''), 1) if status == 2: sys.stderr.write ("\nUser interrupt. Exiting\n") sys.exit (2) if status == 0 and options.keep_temp_dir: shutil.copy2 (pbmfile, '%s.pbm' % id) shutil.copy2 ('char.eps', '%s.eps' % id) if status != 0: error_file = os.path.join (origdir, 'trace-bug-%s.pbm' % id) shutil.copy2 (pbmfile, error_file) msg = """Trace failed on bitmap. Bitmap left in `%s\' Failed command was: %s Please submit a bugreport to %s development.""" \ % (error_file, trace_command (error_file, ''), options.trace_binary) if options.keep_trying: warning (msg) sys.stderr.write ("\nContinuing trace...\n") flag_error () else: msg = msg + '\nRun mftrace with --keep-trying to produce a font anyway\n' error (msg) else: return 1 if status != 0: warning ("Failed, skipping character.\n") return 0 else: return 1 def make_pbm (filename, outname, char_number): """ Extract bitmap from the PK file FILENAME (absolute) using `gf2pbm'. Return FALSE if the glyph is not valid. """ command = "%s/gf2pbm -n %d -o %s %s" % (bindir, char_number, outname, filename) status = system (command, ignore_error = 1) return (status == 0) def read_encoding (file): sys.stderr.write (_ ("Using encoding file: `%s'\n") % file) str = open (file).read () str = re.sub ("%.*", '', str) str = re.sub ("[\n\t \f]+", ' ', str) m = re.search ('/([^ ]+) \[([^\]]+)\] def', str) if not m: error ("Encoding file is invalid") name = m.group (1) cod = m.group (2) cod = re.sub ('[ /]+', ' ', cod) cods = string.split (cod) return (name, cods) def zip_to_pairs (xs): r = [] while xs: r.append ((xs[0], xs[1])) xs = xs[2:] return r def unzip_pairs (tups): lst = [] while tups: lst = lst + list (tups[0]) tups = tups[1:] return lst def autotrace_path_to_type1_ops (at_file, bitmap_metrics, tfm_wid, magnification): inv_scale = 1000.0 / magnification (size_y, size_x, off_x, off_y) = map (lambda m, s = inv_scale: m * s, bitmap_metrics) ls = open (at_file).readlines () bbox = (10000, 10000, -10000, -10000) while ls and ls[0] != '*u\n': ls = ls[1:] if ls == []: return (bbox, '') ls = ls[1:] commands = [] while ls[0] != '*U\n': ell = ls[0] ls = ls[1:] toks = string.split (ell) if len (toks) < 1: continue cmd = toks[-1] args = map (lambda m, s = inv_scale: s * float (m), toks[:-1]) if options.round_to_int: args = zip_to_pairs (map (round, args)) else: args = zip_to_pairs (args) commands.append ((cmd, args)) expand = { 'l': 'rlineto', 'm': 'rmoveto', 'c': 'rrcurveto', 'f': 'closepath', } cx = 0 cy = size_y - off_y - inv_scale # t1asm seems to fuck up when using sbw. Oh well. t1_outline = ' %d %d hsbw\n' % (- off_x, tfm_wid) bbox = (10000, 10000, -10000, -10000) for (c, args) in commands: na = [] for a in args: (nx, ny) = a if c == 'l' or c == 'c': bbox = update_bbox_with_point (bbox, a) na.append ((nx - cx, ny - cy)) (cx, cy) = (nx, ny) a = na c = expand[c] if options.round_to_int: a = map (lambda x: '%d' % int (round (x)), unzip_pairs (a)) else: a = map (lambda x: '%d %d div' \ % (int (round (x * options.grid_scale/inv_scale)), int (round (options.grid_scale/inv_scale))), unzip_pairs (a)) t1_outline = t1_outline + ' %s %s\n' % (string.join (a), c) t1_outline = t1_outline + ' endchar ' t1_outline = '{\n %s } |- \n' % t1_outline return (bbox, t1_outline) # FIXME: Cut and paste programming def potrace_path_to_type1_ops (at_file, bitmap_metrics, tfm_wid, magnification): inv_scale = 1000.0 / magnification (size_y, size_x, off_x, off_y) = map (lambda m, s = inv_scale: m * s, bitmap_metrics) ls = open (at_file).readlines () bbox = (10000, 10000, -10000, -10000) while ls and ls[0] != '0 setgray\n': ls = ls[1:] if ls == []: return (bbox, '') ls = ls[1:] commands = [] while ls and ls[0] != 'grestore\n': ell = ls[0] ls = ls[1:] if ell == 'fill\n': continue toks = string.split (ell) if len (toks) < 1: continue cmd = toks[-1] args = map (lambda m, s = inv_scale: s * float (m), toks[:-1]) args = zip_to_pairs (args) commands.append ((cmd, args)) # t1asm seems to fuck up when using sbw. Oh well. t1_outline = ' %d %d hsbw\n' % (- off_x, tfm_wid) bbox = (10000, 10000, -10000, -10000) # Type1 fonts have relative coordinates (doubly relative for # rrcurveto), so must convert moveto and rcurveto. z = (0.0, size_y - off_y - 1.0) for (c, args) in commands: args = map (lambda x: (x[0] * (1.0 / options.grid_scale), x[1] * (1.0 / options.grid_scale)), args) if c == 'moveto': args = [(args[0][0] - z[0], args[0][1] - z[1])] zs = [] for a in args: lz = (z[0] + a[0], z[1] + a[1]) bbox = update_bbox_with_point (bbox, lz) zs.append (lz) if options.round_to_int: last_discr_z = (int (round (z[0])), int (round (z[1]))) else: last_discr_z = (z[0], z[1]) args = [] for a in zs: if options.round_to_int: a = (int (round (a[0])), int (round (a[1]))) else: a = (a[0], a[1]) args.append ((a[0] - last_discr_z[0], a[1] - last_discr_z[1])) last_discr_z = a if zs: z = zs[-1] c = { 'closepath': 'closepath', 'moveto': 'rmoveto', 'rcurveto': 'rrcurveto', # Potrace 1.9 'restore': '', 'rlineto': 'rlineto', '%%EOF': '', }[c] if c == 'rmoveto': t1_outline += ' closepath ' if options.round_to_int: args = map (lambda x: '%d' % int (round (x)), unzip_pairs (args)) else: args = map (lambda x: '%d %d div' \ % (int (round (x*options.grid_scale/inv_scale)), int (round (options.grid_scale/inv_scale))), unzip_pairs (args)) t1_outline = t1_outline + ' %s %s\n' % (string.join (args), c) t1_outline = t1_outline + ' endchar ' t1_outline = '{\n %s } |- \n' % t1_outline return (bbox, t1_outline) def read_gf_dims (name, c): str = popen ('%s/gf2pbm -n %d -s %s' % (bindir, c, name)).read () m = re.search ('size: ([0-9]+)+x([0-9]+), offset: \(([0-9-]+),([0-9-]+)\)', str) return tuple (map (int, m.groups ())) def trace_font (fontname, gf_file, metric, glyphs, encoding, magnification, fontinfo): t1os = [] font_bbox = (10000, 10000, -10000, -10000) progress (_ ("Tracing bitmaps...")) if options.verbose: progress ('\n') else: progress (' ') # for single glyph testing. # glyphs = [] for a in glyphs: if encoding[a] == ".notavail": continue valid = metric.has_char (a) if not valid: encoding[a] = ".notavail" continue valid = make_pbm (gf_file, 'char.pbm', a) if not valid: encoding[a] = ".notavail" continue (w, h, xo, yo) = read_gf_dims (gf_file, a) if not options.verbose: sys.stderr.write ('[%d' % a) sys.stderr.flush () # this wants the id, not the filename. success = trace_one ("char.pbm", '%s-%d' % (options.gffile, a)) if not success: sys.stderr.write ("(skipping character)]") sys.stderr.flush () encoding[a] = ".notavail" continue if not options.verbose: sys.stderr.write (']') sys.stderr.flush () metric_width = metric.get_char (a).width tw = int (round (metric_width / metric.design_size * 1000)) (bbox, t1o) = path_to_type1_ops ("char.eps", (h, w, xo, yo), tw, magnification) if t1o == '': encoding[a] = ".notavail" continue font_bbox = update_bbox_with_bbox (font_bbox, bbox) t1os.append ('\n/%s %s ' % (encoding[a], t1o)) if not options.verbose: progress ('\n') to_type1 (t1os, font_bbox, fontname, encoding, magnification, fontinfo) def ps_encode_encoding (encoding): str = ' %d array\n0 1 %d {1 index exch /.notdef put} for\n' \ % (len (encoding), len (encoding)-1) for i in range (0, len (encoding)): if encoding[i] != ".notavail": str = str + 'dup %d /%s put\n' % (i, encoding[i]) return str def gen_unique_id (dict): nm = 'FullName' return 4000000 + (hash (nm) % 1000000) def to_type1 (outlines, bbox, fontname, encoding, magnification, fontinfo): """ Fill in the header template for the font, append charstrings, and shove result through t1asm """ template = r"""%%!PS-AdobeFont-1.0: %(FontName)s %(VVV)s.%(WWW)s 13 dict begin /FontInfo 16 dict dup begin /version (%(VVV)s.%(WWW)s) readonly def /Notice (%(Notice)s) readonly def /FullName (%(FullName)s) readonly def /FamilyName (%(FamilyName)s) readonly def /Weight (%(Weight)s) readonly def /ItalicAngle %(ItalicAngle)s def /isFixedPitch %(isFixedPitch)s def /UnderlinePosition %(UnderlinePosition)s def /UnderlineThickness %(UnderlineThickness)s def end readonly def /FontName /%(FontName)s def /FontType 1 def /PaintType 0 def /FontMatrix [%(xrevscale)f 0 0 %(yrevscale)f 0 0] readonly def /FontBBox {%(llx)d %(lly)d %(urx)d %(ury)d} readonly def /Encoding %(Encoding)s readonly def currentdict end currentfile eexec dup /Private 20 dict dup begin /-|{string currentfile exch readstring pop}executeonly def /|-{noaccess def}executeonly def /|{noaccess put}executeonly def /lenIV 4 def /password 5839 def /MinFeature {16 16} |- /BlueValues [] |- /OtherSubrs [ {} {} {} {} ] |- /ForceBold false def /Subrs 1 array dup 0 { return } | |- 2 index /CharStrings %(CharStringsLen)d dict dup begin %(CharStrings)s /.notdef { 0 0 hsbw endchar } |- end end readonly put noaccess put dup/FontName get exch definefont pop mark currentfile closefile cleartomark """ ## apparently, some fonts end the file with cleartomark. Don't know why. copied_fields = ['FontName', 'FamilyName', 'FullName', 'DesignSize', 'ItalicAngle', 'isFixedPitch', 'Weight'] vars = { 'VVV': '001', 'WWW': '001', 'Notice': 'Generated from MetaFont bitmap by mftrace %s, http://www.xs4all.nl/~hanwen/mftrace/ ' % program_version, 'UnderlinePosition': '-100', 'UnderlineThickness': '50', 'xrevscale': 1.0/1000.0, 'yrevscale': 1.0/1000.0, 'llx': bbox[0], 'lly': bbox[1], 'urx': bbox[2], 'ury': bbox[3], 'Encoding': ps_encode_encoding (encoding), # need one extra entry for .notdef 'CharStringsLen': len (outlines) + 1, 'CharStrings': string.join (outlines), 'CharBBox': '0 0 0 0', } for k in copied_fields: vars[k] = fontinfo[k] open ('mftrace.t1asm', 'w').write (template % vars) def update_bbox_with_point (bbox, pt): (llx, lly, urx, ury) = bbox llx = min (pt[0], llx) lly = min (pt[1], lly) urx = max (pt[0], urx) ury = max (pt[1], ury) return (llx, lly, urx, ury) def update_bbox_with_bbox (bb, dims): (llx, lly, urx, ury) = bb llx = min (llx, dims[0]) lly = min (lly, dims[1]) urx = max (urx, dims[2]) ury = max (ury, dims[3]) return (llx, lly, urx, ury) def get_binary (name): search_path = string.split (os.environ['PATH'], ':') for p in search_path: nm = os.path.join (p, name) if os.path.exists (nm): return nm return '' def get_fontforge_command (): fontforge_cmd = '' for ff in ['fontforge', 'pfaedit']: if get_binary(ff): fontforge_cmd = ff stat = 1 if fontforge_cmd: stat = system ("%s --help > pfv 2>&1 " % fontforge_cmd, ignore_error = 1) if stat != 0: warning ("Command `%s --help' failed. Cannot simplify or convert to TTF.\n" % fontforge_cmd) return '' if fontforge_cmd == 'pfaedit' \ and re.search ("-script", open ('pfv').read ()) == None: warning ("pfaedit does not support -script. Install 020215 or later.\nCannot simplify or convert to TTF.\n") return '' return fontforge_cmd def tfm2kpx (tfmname, encoding): kpx_lines = [] pl = popen ("tftopl %s" % (tfmname)) label_pattern = re.compile ( "\A \(LABEL ([DOHC]{1}) ([A-Za-z0-9]*)\)") krn_pattern = re.compile ( "\A \(KRN ([DOHC]{1}) ([A-Za-z0-9]*) R (-?[\d\.]+)\)") first = 0 second = 0 for line in pl.readlines (): label_match = label_pattern.search (line) if not (label_match is None): if label_match.group (1) == "D": first = int (label_match.group (2)) elif label_match.group (1) == "O": first = int (label_match.group (2), 8) elif label_match.group (1) == "C": first = ord (label_match.group (2)) krn_match = krn_pattern.search (line) if not (krn_match is None): if krn_match.group (1) == "D": second = int (krn_match.group (2)) elif krn_match.group (1) == "O": second = int (krn_match.group (2), 8) elif krn_match.group (1) == "C": second = ord (krn_match.group (2)) krn = round (float (krn_match.group (3)) * 1000) if (encoding[first] != '.notavail' and encoding[first] != '.notdef' and encoding[second] != '.notavail' and encoding[second] != '.notdef'): kpx_lines.append ("KPX %s %s %d\n" % ( encoding[first], encoding[second], krn)) return kpx_lines def get_afm (t1_path, tfmname, encoding, out_path): afm_stream = popen ("printafm %s" % (t1_path)) afm_lines = [] kpx_lines = tfm2kpx (tfmname, encoding) for line in afm_stream.readlines (): afm_lines.append (line) if re.match (r"^EndCharMetrics", line, re.I): afm_lines.append ("StartKernData\n") afm_lines.append ("StartKernPairs %d\n" % len (kpx_lines)) for kpx_line in kpx_lines: afm_lines.append (kpx_line) afm_lines.append ("EndKernPairs\n") afm_lines.append ("EndKernData\n") progress (_ ("Writing metrics to `%s'... ") % out_path) afm_file = open (out_path, 'w') afm_file.writelines (afm_lines) afm_file.flush () afm_file.close () progress ('\n') def assemble_font (fontname, format, is_raw): ext = '.' + format asm_opt = '--pfa' if format == 'pfb': asm_opt = '--pfb' if is_raw: ext = ext + '.raw' outname = fontname + ext progress (_ ("Assembling raw font to `%s'... ") % outname) if options.verbose: progress ('\n') system ('t1asm %s mftrace.t1asm %s' % (asm_opt, shell_escape_filename (outname))) progress ('\n') return outname def make_outputs (fontname, formats, encoding): """ run pfaedit to convert to other formats """ ff_needed = 0 ff_command = "" if (options.simplify or options.round_to_int or 'ttf' in formats or 'svg' in formats or 'afm' in formats): ff_needed = 1 if ff_needed: ff_command = get_fontforge_command () if ff_needed and ff_command: raw_name = assemble_font (fontname, 'pfa', 1) simplify_cmd = '' if options.round_to_int: simplify_cmd = 'RoundToInt ();' generate_cmds = '' for f in formats: generate_cmds += 'Generate("%s");' % (fontname + '.' + f) if options.simplify: simplify_cmd ='''SelectAll (); AddExtrema(); Simplify (); %(simplify_cmd)s AutoHint ();''' % vars() pe_script = ('''#!/usr/bin/env %(ff_command)s Open ($1); MergeKern($2); %(simplify_cmd)s %(generate_cmds)s Quit (0); ''' % vars()) open ('to-ttf.pe', 'w').write (pe_script) if options.verbose: print 'Fontforge script', pe_script system ("%s -script to-ttf.pe %s %s" % (ff_command, shell_escape_filename (raw_name), shell_escape_filename (options.tfm_file))) elif ff_needed and (options.simplify or options.round_to_int or 'ttf' in formats or 'svg' in formats): error(_ ("fontforge is not installed; could not perform requested command")) else: t1_path = '' if ('pfa' in formats): t1_path = assemble_font (fontname, 'pfa', 0) if ('pfb' in formats): t1_path = assemble_font (fontname, 'pfb', 0) if (t1_path != '' and 'afm' in formats): if get_binary("printafm"): get_afm (t1_path, options.tfm_file, encoding, fontname + '.afm') else: error(_ ("Neither fontforge nor ghostscript is not installed; could not perform requested command")) def getenv (var, default): if os.environ.has_key (var): return os.environ[var] else: return default def gen_pixel_font (filename, metric, magnification): """ Generate a GF file for FILENAME, such that `magnification'*mfscale (default 1000 * 1.0) pixels fit on the designsize. """ base_dpi = 1200 size = metric.design_size size_points = size * 1/72.27 * base_dpi mag = magnification / size_points prod = mag * base_dpi try: open ('%s.%dgf' % (filename, prod)) except IOError: ## MFINPUTS/TFMFONTS take kpathsea specific values; ## we should analyse them any further. os.environ['MFINPUTS'] = '%s:%s' % (origdir, getenv ('MFINPUTS', '')) os.environ['TFMFONTS'] = '%s:%s' % (origdir, getenv ('TFMINPUTS', '')) progress (_ ("Running Metafont...")) cmdstr = r"mf '\mode:=lexmarks; mag:=%f; nonstopmode; input %s'" % (mag, filename) if not options.verbose: cmdstr = cmdstr + ' 1>/dev/null 2>/dev/null' st = system (cmdstr, ignore_error = 1) progress ('\n') logfile = '%s.log' % filename log = '' prod = 0 if os.path.exists (logfile): log = open (logfile).read () m = re.search ('Output written on %s.([0-9]+)gf' % re.escape (filename), log) prod = int (m.group (1)) if st: sys.stderr.write ('\n\nMetafont failed. Excerpt from the log file: \n\n*****') m = re.search ("\n!", log) start = m.start (0) short_log = log[start:start+200] sys.stderr.write (short_log) sys.stderr.write ('\n*****\n') if re.search ('Arithmetic overflow', log): sys.stderr.write (""" Apparently, some numbers overflowed. Try using --magnification with a lower number. (Current magnification: %d) """ % magnification) if not options.keep_trying or prod == 0: sys.exit (1) else: sys.stderr.write ('\n\nTrying to proceed despite of the Metafont errors...\n') return "%s.%d" % (filename, prod) def parse_command_line (): p = optparse.OptionParser (version="""mftrace 1.2.19 This program is free software. It is covered by the GNU General Public License and you are welcome to change it and/or distribute copies of it under certain conditions. Invoke as `mftrace --warranty' for more information. Copyright (c) 2005--2006 by Han-Wen Nienhuys """) p.usage = "mftrace [OPTION]... FILE..." p.description = _ ("Generate Type1 or TrueType font from Metafont source.") p.add_option ('-k', '--keep', action="store_true", dest="keep_temp_dir", help=_ ("Keep all output in directory %s.dir") % program_name) p.add_option ('--magnification', dest="magnification", metavar="MAG", default=1000.0, type="float", help=_("Set magnification for MF to MAG (default: 1000)")) p.add_option ('-V', '--verbose', action='store_true', default=False, help=_ ("Be verbose")) p.add_option ('-f', '--formats', action="append", dest="formats", default=[], help=_("Which formats to generate (choices: AFM, PFA, PFB, TTF, SVG)")) p.add_option ('--simplify', action="store_true", dest="simplify", default=False, help=_ ("Simplify using fontforge")) p.add_option ('--gffile', dest="gffile", help= _("Use gf FILE instead of running Metafont")) p.add_option ('-I', '--include', dest="include_dirs", action="append", default=[], help=_("Add to path for searching files")) p.add_option ('--glyphs', default=[], action="append", dest="glyphs", metavar="LIST", help= _('Process only these glyphs. LIST is comma separated')) p.add_option ('--tfmfile', metavar='FILE', action='store', dest='tfm_file') p.add_option ('-e', '--encoding', metavar="FILE", action='store', dest="encoding_file", default="", help= _ ("Use encoding file FILE")) p.add_option ('--keep-trying', dest='keep_trying', default=False, action="store_true", help= _ ("Don't stop if tracing fails")) p.add_option ('-w', '--warranty', action="store_true", help=_ ("show warranty and copyright")) p.add_option ('--dos-kpath', action='store_true', dest="dos_kpath", help=_("try to use Miktex kpsewhich")) p.add_option ('--potrace', action='store_true', dest='potrace', help=_ ("Use potrace")) p.add_option ('--autotrace', action='store_true', dest='autotrace', help=_ ("Use autotrace")) p.add_option ('--no-afm', action='store_false', dest="read_afm", default=True, help=_("Don't read AFM file")) p.add_option ('--noround', action='store_false', dest='round_to_int', default=True, help=_("Do not round coordinates of control points to integer values (use with --grid)")) p.add_option ('--grid', metavar='SCALE', dest='grid_scale', type='float', default = 1.0, help=_ ("Set reciprocal grid size in em units")) p.add_option ('-D','--define', metavar="SYMBOL=VALUE", dest="defs", default=[], action='append',help=_("Set the font info SYMBOL to VALUE")) global options (options, files) = p.parse_args () if not files: sys.stderr.write ('Need argument on command line \n') p.print_help () sys.exit (2) if options.warranty : warranty () sys.exit (0) options.font_info = {} for d in options.defs: kv = d.split('=') if len (kv) == 1: options.font_info[kv] = 'true' elif len (kv) > 1: options.font_info[kv[0]] = '='.join (kv[1:]) def comma_sepped_to_list (x): fs = [] for f in x: fs += f.lower ().split (',') return fs options.formats = comma_sepped_to_list (options.formats) new_glyphs = [] for r in options.glyphs: new_glyphs += r.split (',') options.glyphs = new_glyphs glyph_range = [] for r in options.glyphs: glyph_subrange = map (int, string.split (r, '-')) if len (glyph_subrange) == 2 and glyph_subrange[0] < glyph_subrange[1] + 1: glyph_range += range (glyph_subrange[0], glyph_subrange[1] + 1) else: glyph_range.append (glyph_subrange[0]) options.glyphs = glyph_range options.trace_binary = '' if options.potrace: options.trace_binary = 'potrace' elif options.autotrace: options.trace_binary = 'autotrace' if options.formats == []: options.formats = ['pfa'] global trace_command global path_to_type1_ops stat = os.system ('potrace --version > /dev/null 2>&1 ') if options.trace_binary != 'autotrace' and stat == 0: options.trace_binary = 'potrace' trace_command = potrace_command path_to_type1_ops = potrace_path_to_type1_ops elif options.trace_binary == 'potrace' and stat != 0: error (_ ("Could not run potrace; have you installed it?")) stat = os.system ('autotrace --version > /dev/null 2>&1 ') if options.trace_binary != 'potrace' and stat == 0: options.trace_binary = 'autotrace' trace_command = autotrace_command path_to_type1_ops = autotrace_path_to_type1_ops elif options.trace_binary == 'autotrace' and stat != 0: error (_ ("Could not run autotrace; have you installed it?")) if not options.trace_binary: error (_ ("No tracing program found.\nInstall potrace or autotrace.")) return files def derive_font_name (family, fullname): fullname = re.sub (family, '', fullname) family = re.sub (' ', '', family) fullname = re.sub ('Oldstyle Figures', 'OsF', fullname) fullname = re.sub ('Small Caps', 'SC', fullname) fullname = re.sub ('[Mm]edium', '', fullname) fullname = re.sub ('[^A-Za-z0-9]', '', fullname) return '%s-%s' % (family, fullname) def cm_guess_font_info (filename, fontinfo): # urg. filename = re.sub ("cm(.*)tt", r"cmtt\1", filename) m = re.search ("([0-9]+)$", filename) design_size = '' if m: design_size = int (m.group (1)) fontinfo['DesignSize'] = design_size prefixes = [("cmtt", "Computer Modern Typewriter"), ("cmvtt", "Computer Modern Variable Width Typewriter"), ("cmss", "Computer Modern Sans"), ("cm", "Computer Modern")] family = '' for (k, v) in prefixes: if re.search (k, filename): family = v if k == 'cmtt': fontinfo['isFixedPitch'] = 'true' filename = re.sub (k, '', filename) break # shapes prefixes = [("r", "Roman"), ("mi", "Math italic"), ("u", "Unslanted italic"), ("sl", "Oblique"), ("csc", "Small Caps"), ("ex", "Math extension"), ("ti", "Text italic"), ("i", "Italic")] shape = '' for (k, v) in prefixes: if re.search (k, filename): shape = v filename = re.sub (k, '', filename) prefixes = [("b", "Bold"), ("d", "Demi bold")] weight = 'Regular' for (k, v) in prefixes: if re.search (k, filename): weight = v filename = re.sub (k, '', filename) prefixes = [("c", "Condensed"), ("x", "Extended")] stretch = '' for (k, v) in prefixes: if re.search (k, filename): stretch = v filename = re.sub (k, '', filename) fontinfo['ItalicAngle'] = 0 if re.search ('[Ii]talic', shape) or re.search ('[Oo]blique', shape): a = -14 if re.search ("Sans", family): a = -12 fontinfo ["ItalicAngle"] = a fontinfo['Weight'] = weight fontinfo['FamilyName'] = family full = '%s %s %s %s %dpt' \ % (family, shape, weight, stretch, design_size) full = re.sub (" +", ' ', full) fontinfo['FullName'] = full fontinfo['FontName'] = derive_font_name (family, full) return fontinfo def ec_guess_font_info (filename, fontinfo): design_size = 12 m = re.search ("([0-9]+)$", filename) if m: design_size = int (m.group (1)) fontinfo['DesignSize'] = design_size prefixes = [("ecss", "European Computer Modern Sans"), ("ectt", "European Computer Modern Typewriter"), ("ec", "European Computer Modern")] family = '' for (k, v) in prefixes: if re.search (k, filename): if k == 'ectt': fontinfo['isFixedPitch'] = 'true' family = v filename = re.sub (k, '', filename) break # shapes prefixes = [("r", "Roman"), ("mi", "Math italic"), ("u", "Unslanted italic"), ("sl", "Oblique"), ("cc", "Small caps"), ("ex", "Math extension"), ("ti", "Italic"), ("i", "Italic")] shape = '' for (k, v) in prefixes: if re.search (k, filename): shape = v filename = re.sub (k, '', filename) prefixes = [("b", "Bold"), ("d", "Demi bold")] weight = 'Regular' for (k, v) in prefixes: if re.search (k, filename): weight = v filename = re.sub (k, '', filename) prefixes = [("c", "Condensed"), ("x", "Extended")] stretch = '' for (k, v) in prefixes: if re.search (k, filename): stretch = v filename = re.sub (k, '', filename) fontinfo['ItalicAngle'] = 0 if re.search ('[Ii]talic', shape) or re.search ('[Oo]blique', shape): a = -14 if re.search ("Sans", family): a = -12 fontinfo ["ItalicAngle"] = a fontinfo['Weight'] = weight fontinfo['FamilyName'] = family full = '%s %s %s %s %dpt' \ % (family, shape, weight, stretch, design_size) full = re.sub (" +", ' ', full) fontinfo['FontName'] = derive_font_name (family, full) fontinfo['FullName'] = full return fontinfo def guess_fontinfo (filename): fi = { 'FontName': filename, 'FamilyName': filename, 'Weight': 'Regular', 'ItalicAngle': 0, 'DesignSize' : 12, 'isFixedPitch' : 'false', 'FullName': filename, } if re.search ('^cm', filename): fi.update (cm_guess_font_info (filename, fi)) elif re.search ("^ec", filename): fi.update (ec_guess_font_info (filename, fi)) elif options.read_afm: global afmfile if not afmfile: afmfile = find_file (filename + '.afm') if afmfile: afmfile = os.path.abspath (afmfile) afm_struct = afm.read_afm_file (afmfile) fi.update (afm_struct.__dict__) return fi else: sys.stderr.write ("Warning: no extra font information for this font.\n" + "Consider writing a XX_guess_font_info() routine.\n") return fi def do_file (filename): encoding_file = options.encoding_file global include_dirs include_dirs = options.include_dirs include_dirs.append (origdir) basename = strip_extension (filename, '.mf') progress (_ ("Font `%s'..." % basename)) progress ('\n') ## setup encoding if encoding_file and not os.path.exists (encoding_file): encoding_file = find_file (encoding_file) elif encoding_file: encoding_file = os.path.abspath (encoding_file) ## setup TFM if options.tfm_file: options.tfm_file = os.path.abspath (options.tfm_file) else: tfm_try = find_file (basename + '.tfm') if tfm_try: options.tfm_file = tfm_try if not os.environ.has_key ("MFINPUTS"): os.environ["MFINPUTS"] = os.getcwd () + ":" ## must change dir before calling mktextfm. if options.keep_temp_dir: def nop(): pass setup_temp (os.path.join (os.getcwd (), program_name + '.dir')) temp_dir.clean = nop else: setup_temp (None) if options.verbose: progress ('Temporary directory is `%s\'\n' % temp_dir) if not options.tfm_file: options.tfm_file = popen ("mktextfm %s 2>/dev/null" % shell_escape_filename (basename)).read () if options.tfm_file: options.tfm_file = options.tfm_file.strip () options.tfm_file = os.path.abspath (options.tfm_file) if not options.tfm_file: error (_ ("Can not find a TFM file to match `%s'") % basename) metric = tfm.read_tfm_file (options.tfm_file) fontinfo = guess_fontinfo (basename) fontinfo.update (options.font_info) if not encoding_file: codingfile = 'tex256.enc' if not coding_dict.has_key (metric.coding): sys.stderr.write ("Unknown encoding `%s'; assuming tex256.\n" % metric.coding) else: codingfile = coding_dict[metric.coding] encoding_file = find_file (codingfile) if not encoding_file: error (_ ("can't find file `%s'" % codingfile)) (enc_name, encoding) = read_encoding (encoding_file) if not len (options.glyphs): options.glyphs = range (0, len (encoding)) if not options.gffile: # run mf base = gen_pixel_font (basename, metric, options.magnification) options.gffile = base + 'gf' else: options.gffile = find_file (options.gffile) # the heart of the program: trace_font (basename, options.gffile, metric, options.glyphs, encoding, options.magnification, fontinfo) make_outputs (basename, options.formats, encoding) for format in options.formats: shutil.copy2 (basename + '.' + format, origdir) os.chdir (origdir) afmfile = '' backend_options = getenv ('MFTRACE_BACKEND_OPTIONS', '') def main (): files = parse_command_line () identify (sys.stderr) for filename in files: do_file (filename) sys.exit (exit_value) if __name__ =='__main__': main() extracting debug info from /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/bin/gf2pbm + /usr/lib/rpm/find-debuginfo.sh -j2 --strict-build-id -m -i --build-id-seed 1.2.19-1.1.TMM.el8 --unique-debug-suffix -1.2.19-1.1.TMM.el8.x86_64 --unique-debug-src-base mftrace-1.2.19-1.1.TMM.el8.x86_64 --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 -S debugsourcefiles.list /builddir/build/BUILD/mftrace-1.2.19 /usr/lib/rpm/sepdebugcrcfix: Updated 1 CRC32s, 0 CRC32s did match. 33 blocks + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig /sbin/ldconfig: Warning: ignoring configuration file that cannot be opened: /etc/ld.so.conf: No such file or directory + /usr/lib/rpm/brp-compress + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip + /usr/lib/rpm/brp-python-bytecompile 1 + /usr/lib/rpm/brp-python-hardlink + PYTHON3=/usr/libexec/platform-python + /usr/lib/rpm/redhat/brp-mangle-shebangs Processing files: mftrace-1.2.19-1.1.TMM.el8.x86_64 Executing(%doc): /bin/sh -e /var/tmp/rpm-tmp.0UbeBX + umask 022 + cd /builddir/build/BUILD + cd mftrace-1.2.19 + DOCDIR=/builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/doc/mftrace + export LC_ALL=C + LC_ALL=C + export DOCDIR + /usr/bin/mkdir -p /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/doc/mftrace + cp -pr README.txt /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/doc/mftrace + cp -pr ChangeLog /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/doc/mftrace + exit 0 Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.uruzWL + umask 022 + cd /builddir/build/BUILD + cd mftrace-1.2.19 + LICENSEDIR=/builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/licenses/mftrace + export LC_ALL=C + LC_ALL=C + export LICENSEDIR + /usr/bin/mkdir -p /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/licenses/mftrace + cp -pr COPYING /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64/usr/share/licenses/mftrace + exit 0 Provides: mftrace = 1.2.19-1.1.TMM.el8 mftrace(x86-64) = 1.2.19-1.1.TMM.el8 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Requires: /usr/bin/python2 libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.7)(64bit) rtld(GNU_HASH) Processing files: mftrace-debugsource-1.2.19-1.1.TMM.el8.x86_64 Provides: mftrace-debugsource = 1.2.19-1.1.TMM.el8 mftrace-debugsource(x86-64) = 1.2.19-1.1.TMM.el8 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Processing files: mftrace-debuginfo-1.2.19-1.1.TMM.el8.x86_64 Provides: debuginfo(build-id) = f645f938ce54f883dfd3a2b56a7e9f3c73a92d85 mftrace-debuginfo = 1.2.19-1.1.TMM.el8 mftrace-debuginfo(x86-64) = 1.2.19-1.1.TMM.el8 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Recommends: mftrace-debugsource(x86-64) = 1.2.19-1.1.TMM.el8 Checking for unpackaged file(s): /usr/lib/rpm/check-files /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64 Wrote: /builddir/build/RPMS/mftrace-1.2.19-1.1.TMM.el8.x86_64.rpm Wrote: /builddir/build/RPMS/mftrace-debugsource-1.2.19-1.1.TMM.el8.x86_64.rpm Wrote: /builddir/build/RPMS/mftrace-debuginfo-1.2.19-1.1.TMM.el8.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.izSqOA + umask 022 + cd /builddir/build/BUILD + cd mftrace-1.2.19 + /usr/bin/rm -rf /builddir/build/BUILDROOT/mftrace-1.2.19-1.1.TMM.el8.x86_64 + exit 0 Child return code was: 0