#!/usr/bin/env perl # $Id$ # Public domain. # Originally written by Sebastian Rahtz. Comments to tex-live@tug.org. # # A script to TL-install a package from CTAN. # For a higher-level invocation, see ctan2tl. # # Its default actions, given a "raw" directory copied from CTAN (the # current directory on invocation), are # 1. copy everything to texmf-dist/doc// # 2. run any .ins files # 3. run any .mf files through mktextfm # 4. move .sty/.cls etc files to texmf-dist/tex// # 5. move other files to appropriate places in the hierarchy. # # All the patterns for what to move or run can be overridden per-package. BEGIN { ($mydir = $0) =~ s,/[^/]*$,,; unshift (@INC, "$mydir/../libexec"); } use Getopt::Long; use File::Basename; use Cwd; use vars qw($opt_ctan_dir); # programs used; must all be on the path $MV = "mv"; $CP = "cp -p"; $RM = "rm -vf"; # just to get feedback from GNU rm on removals $INSTALL = "install -D -m 664"; $| = 1; select ((select (STDERR), $| = 1)[0]); $RAW_DIR = getcwd(); # where we start from (raw dir) chdir "../tmp.cooked" || die "chdir(../tmp.cooked) failed: $!"; $COOKED_TOP = getcwd(); # output (cooked) directory paren chdir $RAW_DIR || die "chdir($RAW_DIR) failed: $!"; # back to raw # the real Master and Build tree. chomp ($Master = `cd $mydir/../.. && pwd`); chomp ($Build = `cd $Master/../Build/source && pwd`); # # packages to treat entirely on their own, or not at all. # the code here is evaluated by Perl, so special packages # can have their own subroutine. # %special = ( 'AkkTeX', "&MAKEflatten", 'Catalogue', "die 'skipping, goes stale too soon'", 'CJK', "die 'skipping, use cjk'", 'FiXme', "die 'skipping, use fixme'", 'GuIT', "die 'skipping, use guitlogo'", 'HA-prosper', '&MAKEhaprosper', 'IEEEtran', "&MAKEIEEEtran", 'LingTrees', "die 'skipping, requires python'", 'SIstyle', '&MAKEflatten', 'TOPtesi', "die 'skipping, use toptesi'", 'a4', "die 'skipping, just a pointer to ntgclass'", 'aastex', "&MAKEflatten", 'accenti', "die 'skipping, use bosisio instead'", 'acmtrans', "die 'skipping, nonfree (nosell) license'", 'acromake', "die 'skipping, nonfree (nomodify) license'", 'acrotex', "die 'skipping, per author (dps) request'", 'adforn', "&MAKEcopy", 'adfsymbols', "&MAKEcopy", 'adobe-euro', "die, skipping, support for nonfree fonts", 'adrlist', "die 'skipping, noinfo license'", 'ae', "&MAKEae", 'aeb_mlink', "die 'skipping, per author (dps) request'", 'aeb_pro', "die 'skipping, per author (dps) request'", 'alatex', "die 'skipping, 1995 LaTeX generalization'", 'algorithmicx',"&MAKEnosymlinks", 'allrunes', "&MAKEflatten", 'alterqcm', "&MAKEaqcm", 'alphabib', "die 'skipping, shell script, and no doc source?'", 'ams', "die 'skipping, use amscls for ams*.bst'", 'ams-cd', "die 'skipping, latex 2.09 and never in tl'", # 'amscls', "die 'skipping, use amsrefs'", 'amslatex', "die 'skipping, use ams subpackages (see tlpkginfo)'", 'amsldoc-vn', "&MAKEflatten", 'amstex', "&MAKEflatten", 'analogclock', "die 'skipping, requires system font installation", 'annot_pro', "die 'skipping, per author (dps) request'", 'ans', "die 'skipping, LaTeX 2.09'", 'ant-worker-tasks', "die 'skipping, Java'", 'antiqua', "&MAKEflatten", 'antomega', "die 'skipping, not ready'", #"&MAKEflatten", 'antp', "die 'skipping, use poltawski'", 'antt', "&MAKEcopy", 'apacite', "&MAKEflatten", 'apalike', "die 'skipping, merged into bibtex'", 'apl', "die 'skipping, noinfo license'", 'arabi', "&MAKEarabi", 'arabtex', "&MAKEarabtex", 'arbeit', "die 'skipping, latex 2.09 and never in tl'", 'archaic', "&MAKEwilson", 'arev', "&MAKEcopy", 'armenian', "die 'skipping, nomodify license (=armtex)'", 'armtex', "die 'skipping, nomodify license (=armenian)'", 'arphic', "&MAKEarphic", 'arrayjob', "die 'skipping, use arrayjobx'", 'asana-math', "die 'skipping, use Asana-Math'", 'ascii', "&MAKEflatten", 'astron', "die 'skipping, nonfree license'", 'atqolive', "die 'skipping, nonfree font'", 'augie', "&MAKEaugie", 'aurical', "&MAKEaurical", 'aurora', "die 'skipping, nocommercial license'", 'auto1', "die 'skipping, nonfree font support'", 'autolatex', "die 'skipping, too complicated, sorry'", 'autotab', "die 'skipping, noinfo license, latex 2.09'", 'babelbib', "&MAKEcopy", 'babyloniannum', "die 'skipping, requires nonfree fonts'", 'backgammon', "die 'skipping, nonfree license'", 'bangtex', "&MAKEflatten", 'bardi', "die 'skipping, nonfree license'", 'bardiag', "&MAKEbardiag", 'base', "die 'skipping, what package did you really mean?'", 'baskervald', "&MAKEcopy", 'bbm-macros', "&MAKEnosymlinks", 'bclogo', "&MAKEflatten", 'beamer', "&MAKEbeamer", 'beamer2thesis', "&MAKEflatten", 'beamer-contrib', "die 'skipping, use subdirs'", 'beebe', "die 'skipping, MAKEbeebe needs work, sorry'", 'bengali', "&MAKEflatten", 'bengali-omega', "die 'skipping, duplicates odev.sty et al.'", 'bera', "&MAKEunzipandflatten", 'berenisadf', "&MAKEcopy", 'babeltools', "die 'skipping, use bezos'", 'bgreek', "&MAKEcopy", 'bib2ml', "die 'skipping, no self-locate?, etc.'", 'bib2xhtml', "die 'skipping, requires PDF::API2'", 'bibextract', "die 'skipping, hardwires nawk cmd name'", 'biblatex-chicago', "&MAKEflatten", 'biblatex-contrib', "die 'skipping, use subdir'", 'biblatex-philosophy', "&MAKEflatten", 'bibtool', "die 'skipping, requires compilation'", 'bibtools', "die 'skipping, ten year old scripts, will await users'", 'bibtopicprefix', "&MAKEflatten", 'bickham', "die 'skipping, support for nonfree font'", 'bigints', "&MAKEflatten", 'bin-cjkutils',"&MAKEbin_cjkutils", 'bitfield', "die 'skipping, obsolete on CTAN'", 'blanks', "die 'skipping, unknown license (and c.1992)'", 'blockdraw_mp',"&MAKEflatten", 'blu', "die 'skipping, too old'", 'bnf-plain', "die 'skipping, unknown license (and c.1992)'", 'bookhands', "&MAKEwilson", 'booktabs-fr', "&MAKEnosymlinks", 'boondox', "&MAKEcopy", 'borceux', "&MAKEborceux", 'bridge', "die 'skipping, latex 2.09'", 'burmese', "&MAKEflatten", 'c90', "&MAKEc90", 'cachepic', "&MAKEcopy", 'calxxxx', "die 'skipping, nomodify license'", 'calendar', "die 'skipping, nosell license'", 'cantarell', "&MAKEcopy", 'cascover', "die 'skipping, license unclear, ancient'", 'camel', "die 'skipping, nosell license'", 'cassette', "die 'skipping, nonfree license'", 'cassette-shipunov', "die 'skipping, use shipunov'", 'cassette209', "die 'skipping, latex 2.09'", 'casslbl', "die 'skipping, license unclear, ancient'", 'catalogue', "die 'skipping, goes stale too soon'", 'catdvi', "die 'skipping, compilation'", 'catchfile', "die 'skipping, part of oberdiek'", 'cbfonts', "&MAKEflatten", 'cc-pl', "&MAKEflatten", 'cchess', "die 'skipping, noinfo license, old'", 'cdcover', "die 'skipping, use cd-cover'", 'cellular', "die 'skipping, noinfo license, author deceased'", 'cfr-lm', "&MAKEcopy", 'changebar', "&MAKEchangebar", 'chapterbib', "die 'skipping, update cite instead'", 'chemarrow', "&MAKEflatten", # check about Arrow.vfb 'chemstruct', "die 'skipping, old latex 2.09, never in tl'", 'chemsym', "die 'skipping, nonfree'", 'cheq', "die 'skipping, nosell license'", 'chess', "&MAKEflatten", 'chet', "&MAKEflatten", 'china2e', "die 'skipping, nosell license'", 'china2e', "die 'skipping, too complicated, sorry'", 'chitex', "die 'skipping, nonfree'", 'chklref', "die 'skipping, needs configure, etc.'", 'chngpage', "die 'skipping, use changepage'", 'circle', "die 'skipping, noinfo license, author unfindable'", 'circuit_macros', "die 'skipping, needs m4'", 'circuit-macros', "die 'skipping, needs m4'", 'circuitikz', "&MAKEcopy", 'cirth', "die 'skipping, nosell license'", 'citeref', "die 'skipping, noinfo license, lots of authors'", 'cjhebrew', "&MAKEflatten", 'cjk', "&MAKEcjk", 'cjw', "die 'skipping, nosell license'", 'clarendo', "die 'skipping, nonfree font'", 'clock', "&MAKEflatten", 'cm-lgc', "&MAKEcmlgc", 'cm-super', "&MAKEflatten", 'cm-unicode', "&MAKEflatten", 'cmastro', "die 'skipping, noinfo license, author unknown'", 'cmbright', "&MAKEcopy", 'cmcyr', "&MAKEflatten", 'cmcyralt', "die 'skipping, license noinfo", 'cntdwn', "die 'skipping, author (dps) request", 'comicsans', "die 'skipping, Comic Sans is nonfree'", 'comfortaa', "&MAKEcopy", 'compact', "die 'skipping, nonfree license'", 'concmath-fonts', "&MAKEflatten", 'concmath', "&MAKEnosymlinks", 'context', "&MAKEcontext", 'context-algorithmic', "&MAKEcopy", 'context-account', "&MAKEcopy", 'context-bnf', "&MAKEcopy", 'context-chromato', "&MAKEcopy", 'context-construction-plan', "&MAKEcopy", 'context-degrade', "&MAKEcopy", 'context-filter', "&MAKEcopy", 'context-fixme', "&MAKEcopy", 'context-french', "&MAKEcopy", 'context-fullpage', "&MAKEcopy", 'context-games', "&MAKEcopy", 'context-gantt', "&MAKEcopy", 'context-gnuplot', "&MAKEcopy", 'context-letter', "&MAKEcopy", 'context-lettrine', "&MAKEcopy", 'context-lilypond', "&MAKEcopy", 'context-mathsets', "&MAKEcopy", 'context-rst', "&MAKEcopy", 'context-ruby', "&MAKEcopy", 'context-simplefonts', "&MAKEcopy", 'context-simpleslides',"&MAKEcopy", 'context-taspresent', "&MAKEcopy", 'context-top-ten', "die 'skipping, overhaul needed per author'", 'context-typearea', "&MAKEcopy", 'context-typescripts', "&MAKEcopy", 'context-vim', "&MAKEcopy", 'coptic', "die 'skipping, replaced by cbcoptic'", 'coronet', "die 'skipping, nonfree font'", 'corridx', "die 'skipping, Pascal source'", 'count1to', "die 'skipping, use ms'", 'cpssp', "die 'skipping, requires python'", 'croatian', "die 'skipping, nonfree (nomodify) license'", 'crosstex', "die 'sorry, investigate self-locating?'", 'csplain', "die 'skipping, too hard to automate'", 'csv2latex', "die 'skipping, mac only?, ruby + applescript'", 'csvtools', "&MAKEflatten", 'ctable', "&MAKEflatten", 'ctantools', "die 'skipping, not sure we should usurp the cmd name ctan'", 'ctib', "&MAKEflatten", 'cursor', "die 'skipping, no known license, very old and small'", 'cweb', "die 'skipping, programs'", 'cwpuzzle', "die 'skipping, in crossword package'", 'cyklop', "&MAKEcopy", 'dejavu', "&MAKEcopy", 'deleq', "die 'skipping, nosell license'", 'deproc', "die 'skipping, for latex 2.09'", 'devanagr', "&MAKEdevanagr", 'devanagari', "die 'skipping, use velthuis'", 'devanagari-omega', "die 'skipping, author unknown, license unknown'", 'diagmac', "die 'skipping, for latex 2.09 and we have diagmac2'", 'diagnose', "&MAKEflatten", 'diagxy', "die 'skipping, use barr'", 'dialogl', "die 'skipping, noinfo license, author deceased'", 'dictsym', "&MAKEunzipandflatten", 'disser', "&MAKEdisser", 'dktools', "die 'skipping, needs compilation, etc.'", 'dmfonts', "die 'skipping, needs work'", 'dnp', "&MAKEdnp", 'dogma', "die 'skipping, requires nonfree font'", 'dot2tex', "die 'skipping, only useful with supporting python setup'", 'dps', "die 'skipping, requires acrotex'", 'draftmark', "die 'skipping, nosell license'", 'droid', "&MAKEcopy", 'dropping', "die 'skipping, nosell license'", 'dtxtut', "&setup", # straight copy 'duplicat', "die 'skipping, use piff'", 'dutchcal', "&MAKEcopy", 'easy', "&MAKEeasy", 'easylatex', "die 'skipping, complicated perl modules, sorry'", 'ean13isbn', "&MAKEcopy", 'ebib', "die 'skipping, as it is Emacs'", 'ebong', "&MAKEflatten", 'ecards', "die 'skipping, per author request'", 'eCards', "die 'skipping, per author request'", 'ecc', "&MAKEflatten", 'eco', "&MAKEeco", 'edmac', "die 'skipping, needs work (unzip xx)'", 'ednotes', "&MAKEnosymlinks", 'efrench', "die 'skipping, new bases and more, sorry'", 'eiad', "&MAKEflatten", 'electrum', "&MAKEcopy", 'elhyphen', "die 'skipping, incorporated in hyph-utf8'", 'elsarticle', "&MAKEflatten", 'em', "die 'skipping, european modern fonts too old, not packaged'", 'enctex', "die 'skipping, engine requiring compilation'", 'encxvlna', "&MAKEcopy", 'enpassant', "die 'skipping, license unknown'", 'epic', "die 'skipping, license unknown and replaced by eepic'", 'epigrafica', "&MAKEflatten", 'epiolmec', "&MAKEflatten", 'epix', "die 'skipping, needs C++'", 'eplain', "&MAKEcopy", 'epspdf', "&MAKEflatten", 'eqexam', "die 'skipping, per author request'", 'eqmark', "die 'skipping, latex 2.09, was never in TL'", 'esindex', "die 'skipping, use bezos'", 'eskdx', "&MAKEeskdx", 'esstix', "&MAKEcopy", 'esvect', "&MAKEflatten", 'ethiop', "&MAKEflatten", 'euclide', "&MAKEpst", 'eukleides', "die 'skipping, requires compilation'", 'eulervm', "&MAKEcopy", 'eurofont', "die 'skipping, support for nonfree fonts or obsolete'", 'europs', "die, skipping, support for nonfree fonts", 'eurosans', "die, skipping, support for nonfree fonts", 'eurosym', "&MAKEflatten", #'euenc', "&MAKEflatten", 'excel2latex', "die 'skipping, only supports excel?'", 'exceltex', "die 'skipping, only supports excel (not ooo)'", 'expl3', "die 'skipping, now l3kernel, etc.'", 'expressgx', "&MAKEexpressg", 'fancyvrb', "&MAKEfancyvrb", 'faq', "die 'skipping, use FAQ-en'", 'faq-en', "die 'skipping, use FAQ-en'", 'faq-fr', "die 'skipping, nonfree'", 'fax', "die 'skipping, nosell license'", 'fc', "&MAKEflatten", 'fc_arith', "die 'skipping, per author request'", 'fc-arith', "die 'skipping, per author request'", # 'fdsymbol', "&MAKEflatten", 'featpost', "&MAKEfeatpost", 'feynmf', "&MAKEfeynmf", 'findhyph', "&MAKEflatten", 'firststeps', "die 'skipping, noinfo license, 1999 book examples'", 'fldigigal', "die 'skipping, per author request'", 'fnlineno', "die 'skipping, use lineno'", 'foiltex', "die 'skipping, nosell license'", # 'flowfram', "&MAKEflatten", 'font-change', "&MAKEflatten", 'fontinst', "&MAKEfontinst", 'fontinstallationguide', "die 'skipping, use Type1fonts'", 'fontname', "die 'skipping, done through tl-update-auto'", 'footnpag', "&MAKEfootnpag", 'formula', "die 'skipping, requires scripts, very old'", 'fourier', "&MAKEflatten", 'fouriernc', "&MAKEflatten", 'fp', "&MAKEfp", 'fpl', "&MAKEflatten", 'frcursive', "&MAKEflatten", 'fribrief', "die 'skipping, nonfree license'", 'fullpict', "die 'skipping, noinfo license'", 'futhark', "die 'skipping, nonfree license'", 'futurans', "die 'skipping, requires nonfree font'", 'galley', "die 'skipping, will be included in xpackages later'", 'gapfill', "die 'skipping, separate macosx scripts are too painful'", 'garamond', "die 'skipping, nonfree font'", 'garuda-c90', "&MAKEgaruda_c90", 'gene', "die 'skipping, complicated, some have sources, sorry'", 'genmisc', "die 'skipping, too complicated, sorry'", 'gentium', "&MAKEcopy", 'gentl-gr', "die 'skipping, nonfree license'", 'geomsty', "die 'skipping, nonfree license'", 'georgian', "die 'skipping, babel and other naming problems'", 'germbib', "&MAKEgermbib", 'getnonfreefonts', "die 'skipping, requires nonfree fonts'", 'gfsartemisia',"&MAKEflatten", 'gfsbaskerville',"&MAKEflatten", 'gfsbodoni', "&MAKEflatten", 'gfsdidot', "&MAKEflatten", 'gfscomplutum',"&MAKEflatten", 'gfsneohellenic', "&MAKEflatten", 'gfsporson', "&MAKEflatten", 'gfssolomos', "&MAKEflatten", 'glhyph', "die 'skipping, merged into hyph-utf8'", 'glosstex', "die 'skipping, requires compilation'", 'gnu-freefont',"&MAKEgnu_freefont", 'graphicp', "die 'skipping, experimental ca.2003'", 'graphicxsp', "die 'skipping, requires adobe distiller'", 'grnumalt', "die 'skipping, nonfree'", 'grtimes', "die 'skipping, requires nonfree monotype times'", 'guitbeamer', "die 'skipping, nonfree'", 'harvardkyoto',"die 'skipping, use xetex-devanagari'", 'he-le-na', "die 'skipping, nonfree (shareware) license'", 'hfbright', "&MAKEflatten", 'hfoldsty', "&MAKEflatten", 'hge', "die 'skipping, looks nonfree'", 'highlight', "die 'skipping, complicated compilation'", 'hilowres', "die 'skipping, nonfree'", 'html2latex', "die 'skipping, no self-locating of Perl modules'", 'hyph-utf8', "&MAKEcopy", 'hyphen-german',"die 'skipping, part of hyph-utf8'", 'ibycus-babel',"&MAKEibycusbabel", 'ibygrk', "&MAKEflatten", 'ieeeconf', "die 'skipping, use IEEEconf'", 'ieeetran', "die 'skipping, use IEEEtran'", 'ifacmtg', "die 'skipping, nonfree license'", 'ifmslide', "&MAKEflatten", 'indxcite', "die 'skipping, too old, license suboptimal'", 'induni-om', "die 'skipping, for omega, use of pua?'", 'invoice', "die 'skipping, requires nonfree realcalc'", 'ipa', "die 'skipping, part of wsuipa'", 'isodoc', "&MAKEflatten", 'itrans', "die 'skipping, no longer maintained, too complex'", 'itrans-processor', "die 'skipping, no longer maintained, too complex'", 'iwona', "&MAKEcopy", 'jadetex', "&MAKEjadetex", 'japanese', "die 'skipping, requires ptex'", 'jasthesis', "die 'skipping, license is unknown'", 'javadoc', "die 'skipping, requires java and no source'", 'jflap2tikz', "die 'skipping, requires java'", 'jhep', "die 'skipping, probably nonfree license'", 'jj_game', "die 'skipping, requires acrotex'", 'jpgfdraw', "die 'skipping, requires java'", 'jsclasses', "die 'skipping, not ready ptex/platex, sorry'", 'junicode', "&MAKEflatten", 'kd', "die 'skipping, too old, too complicated, sorry'", 'kdgreek', "die 'skipping, nonfree license'", 'kdgcoursetext', "die 'skipping, confused/nonfree license'", 'kelly', "die 'skipping, obsoleted by cbgreek?'", 'kerkis', "&MAKEflatten", 'keys3', "die 'skipping, merged into expl3'", 'knitting', "&MAKEflatten", 'kurier', "&MAKEcopy", 'kuvio', "die 'skipping, nonfree license'", 'l2a', "die 'skipping, another old detex, requires compilation'", 'lamstex', "die 'skipping, old'", 'lamstex-index', "die 'skipping, old'", 'labtable', "die 'skipping, nonfree w32 application'", 'latex-help-texinfo', "die 'skipping, use latex2e-help-texinfo'", 'latex-make', "die 'skipping, subprograms seem problematic'", 'latex-pro-pragmatiky', "die 'skipping, no source'", 'latex_maker', "die 'skipping, we must not usurp two-character cmd name'", 'latex2pdf', "die 'skipping, too bare-bones'", 'latex3', "die 'skipping, use xpackages'", 'latexdb', "die 'skipping, needs sql, etc.'", 'latexmp', "&MAKEflatten", 'layaureo', "&MAKEflatten", 'lato', "&MAKEcopy", 'lcircuit', "die 'skipping, license unknown, too old to investigate'", 'leawood', "&MAKEflatten", 'lecturer', "&MAKEflatten", 'ledmpar', "die 'skipping, use ledmac'", 'ledpar', "die 'skipping, use ledmac'", 'letter1', "die 'skipping, circa 1989, never in TL, await request'", 'lettre', "&MAKEflatten", 'lettrgth', "die 'skipping, nonfree font'", 'levy-font', "die 'skipping, use levy'", 'levy-latex', "die 'skipping, nosell per old latex'", 'lexitex', "die 'skipping, camel has replaced'", 'lfb', "&MAKElfb", 'lh', "&MAKElh", 'lhfonts', "die 'skipping, use lh'", 'libertine', "&MAKEcopy", 'librarian', "&MAKEflatten", 'libris', "&MAKEcopy", 'lifia-th', "die 'skipping, ?'", 'linearA', "&MAKEflatten", 'lintex', "die 'skipping, compiled program'", 'literat', "&MAKEliterat", 'lithuanian', "&MAKEflatten", 'lkort', "die 'skipping, obsolete'", 'lm', "&MAKEcopy", 'lms', "die 'skipping, nonfree license'", 'logfilter', "die 'skipping, nosource (and java)'", 'loggates', "die 'skipping, LaTeX 2.09 and never in TL'", 'logic', "die 'skipping, noinfo license, ancient'", 'lshort', "die 'skipping, use lshort-english (or whatever language)'", 'lshort-bulgarian', '&MAKElshort', 'lshort-chinese', '&MAKElshort', 'lshort-english', '&MAKElshort', 'lshort-finnish', '&MAKElshort', 'lshort-korean', '&MAKElshort', 'lshort-mongol', '&MAKElshort', 'lshort-mongolian', "die 'skipping, replaced by lshort-mongol'", 'lshort-persian', '&MAKElshort', 'lshort-portuguese', '&MAKElshort', 'lshort-slovenian', '&MAKElshort', 'lshort-turkish', '&MAKElshort', 'lshort-vietnamese', '&MAKElshort', 'lshort-zh-cn', "die 'skipping, use lshort-chinese'", 'ltablex', "die 'skipping, unknown license'", 'ltnews', "die 'skipping, nonfree doc'", 'ltt', "&MAKEltt", 'ltxbase', "&MAKEbase", 'ltxfileinfo', "die 'skipping, Ruby, not self-locating'", 'ltxmisc', "die 'skipping, too complicated, sorry'", 'ltxtable', "die 'skipping, use carlisle'", # 'luaindex', "die 'skipping, try again when 2011 luatex is in'", 'luapersian', "&MAKEflatten", 'lucida', "die 'skipping, nonfree font'", 'lucidabr', "die 'skipping, nonfree font'", 'lxfonts', "&MAKEcopy", 'ly1', "&MAKEcopy", 'mab2bib', "die 'skipping, python'", 'make-env', "die 'skipping, no license, too old to bother with'", 'makebarcode', "&MAKEcopy", 'makecell', "&MAKEnosymlinks", 'makedtx', "&MAKEflatten", 'makedlossariesgui', "skipping, impossible java'", 'maketexwork', "die 'skipping, too old'", 'makor', "&MAKEbase", 'malayalam', "die 'skipping, until asked for'",#language/malayalam 'malayalam-omega', "die 'skipping, until asked for'", 'manjutex', "die 'skipping, obsolete on CTAN'", #"&MAKEflatten", 'manpage', "die 'skipping, nonfree license'", 'mapcodes', "die 'skipping, nosell (old latex) license'", 'maple', "die 'skipping, noinfo license'", 'marigold', "die 'skipping, nonfree font'", 'marvosym', "&MAKEcopy", 'match_parens',"&MAKEflatten", 'math-into-latex', "die 'skipping, noinfo license, examples'", 'mathabx', "&MAKEflatten", 'mathabx-type1', "&MAKEflatten", 'mathgifg', "die 'skipping, nonfree font support'", 'mathdesign', "&MAKEmathdesign", 'mathexam', "&MAKEflatten", 'mathmode', "&setup", 'mathpazo', "&MAKEmathpazo", 'mathspic', "&MAKEflatten", 'mathstone', "die 'skipping, requires nonfree Stone fonts'", 'matlab', "die 'skipping, requires nonfree matlab'", 'mdwfonts', "die 'skipping, too many tfm duplicates'", 'mem', "die 'skipping, experimental ca.2006'", 'memo2', "die 'skipping, latex 2.09'", 'memoirchapterstyles', "die 'skipping, use MemoirChapStyles'", 'meper', "die 'skipping, requires Java, confused license'", 'metalogo', "&MAKEflatten", 'metaobj', "&MAKEflatten", 'metauml', "&MAKEmetauml", 'mflogo', "die 'skipping, TL conflates distinct mflogo pkgs on CTAN'", 'mff', "die 'skipping, noinfo license'", 'mfpic', "&MAKEcopy", 'mhs', "die 'skipping, nomodify license'", 'milstd', "die 'skipping, have milstd.sty from logic'", 'mimetex', "die 'skipping, CGI'", 'miniltx', "die 'skipping, use graphics-pln'", 'minionpro', "die 'skipping, requires nonfree minion'", 'misc', "&MAKEmisc", 'mk', "die 'skipping, not self-locating, must not usurp two-character cmd name'", 'mkbangtex', "die 'skipping, no copyright (and python)'", 'mlbib', "die 'skipping, bib file names are too generic'", 'mnhyphn', "&MAKEmnhyphn", 'mnsymbol', "&MAKEflatten", 'montex', "&MAKEflatten", 'morehelp', "die 'skipping, nonfree license'", 'morse', "die 'skipping, nosell license'", 'movie15', "&MAKEflatten", 'mp3d', "&MAKEflatten", 'mpattern', "&MAKEmpattern", 'mpcolornames',"&MAKEcopy", 'mpdinbrief', "die 'skipping, nosell license'", 'mptopdf', "die 'skipping, not ready, sorry'", #"&MAKEflatten", 'msuthesis', "die 'skipping, use msu-thesis'", 'mtp2lite', "die 'skipping, nonfree'", 'mtx', "die 'skipping, pascal musixtex binaries'", 'multibox', "die 'skipping, noinfo license, author deceased'", 'multido', "&MAKEpst", 'multirow', "&MAKEflatten", 'musictex', "die 'skipping, superseded by musixtex", 'mwrite', "die 'skipping, nonfree license", 'mx' , "die 'skipping, author does not recommend system install'", 'mxd', "die 'skipping, noinfo license, old mongolian'", 'mxedruli', "&MAKEflatten", 'nassflow', "die 'skipping, nosell license'", 'nbaskerv', "die 'skipping, requires nonfree font'", 'ncctools', "&MAKEflatten", 'newproof', "die 'skipping, use piff'", 'newsletr', "&MAKEnewsletr", 'newthm', "die 'skipping, obsolete, no longer on ctan'", 'nlatexdb', "die 'skipping, C#/.NET'", 'nohyph', "die 'skipping, nohyph must be done by hand'", 'norasi-c90', "&MAKEnorasi_c90", 'notes', "&MAKEnotes", 'ntabbing', "die 'skipping, noinfo license, author email bad'", 'ntg', "die 'skipping, ntg is stale user group information'", 'numericplots',"&MAKEflatten", 'numline', "die 'skipping, obsolete'", 'numparse', "die 'skipping, experimental, not recommended by author'", 'oca', "die 'skipping, nosell license'", 'occam', "die 'skipping, too old and strange'", 'ocherokee', "&MAKEflatten", 'ocr-a', "die 'skipping, nosell license'", 'ocr-b-outline',"&MAKEflatten", 'oesch', "die 'skipping, nosell license'", 'ofs', "&MAKEflatten", 'ogonek', "die 'skipping, nonfree license'", 'oldstandard', "&MAKEflatten", 'omegajapanese',"&MAKEflatten", 'onepagem', "die 'skipping, use piff'", 'optima', "die 'skipping, nonfree font'", 'osa', "die 'skipping, relies on endfloat.cfg and non-unique filenames'", 'osmanian', "die 'skipping, no good license info'", 'ot2cyr', "die 'skipping, nonfree font support", 'otfinst', "die 'skipping, python script, perhaps stale", 'opensans', "&MAKEcopy", 'otibet', "&MAKEflatten", 'oxford', "die 'skipping, nosell license'", 'pageno', "die 'skipping, nosell license'", 'pagesLTS', "die 'skipping, use pageslts'", 'pandora', "&MAKEflatten", 'paradigm', "die 'skipping, too old, for BLUe'", 'paratype', "&MAKEcopy", 'pb-diagram', "&MAKEpbdiagram", 'pcarl', "die 'skipping, free support for nonfree font'", 'pclnfss', "die 'skipping, nonfree hardware fonts'", 'pdcmac', "die 'skipping, needs work'", 'pdf-forms-tutorial', "die 'skipping, use pdf-forms-tutorial-de or -en'", 'pdf-forms-tutorial-de', "&MAKEpdf_forms_tutorial", 'pdf-forms-tutorial-en', "&MAKEpdf_forms_tutorial", 'pdfbook', "die 'skipping, requires compilation'", 'pdfjam', "&MAKEflatten", 'pdfmarginpar',"&MAKEflatten", 'pdfrack', "die 'skipping, until someone asks for it'", 'pdfx', "&MAKEflatten", 'persian-modern',"&MAKEflatten", 'pgf', "&MAKEcopy", 'pgfplots', "&MAKEcopy", 'pgothic', "die 'skipping, use bookhands'", 'phaistos', "&MAKEflatten", 'phonetic', "&MAKEphonetic", 'physe', "die 'skipping, noinfo license, c.1992 plain format for physics'", 'phyzzx', "die 'skipping, noinfo license, c.1988 plain format for physics'", 'pict2e', "&MAKEpict2e", 'pictex', "&MAKEflatten", 'pictex-autoarea',"die 'skipping, use autoarea", 'pigpen', "&MAKEflatten", 'pinlabel', "&MAKEnosymlinks", 'pitthesis', "die 'skipping, noinfo license", 'pl', "die 'skipping, not ready, cf. cc-pl, sorry", 'pl-qx', "&MAKEplqx", 'pmx', "die 'skipping, problematic musixtex binaries'", 'pointRuler', "die 'skipping, requires compilation'", 'poltawski', "&MAKEcopy", 'popupmenu', "die 'skipping, per author (dps) request'", 'poster', "die 'skipping, requires compilation'", 'powerdot', "&MAKEflatten", 'ppower4', "die 'skipping, sourceless java circa 2002'", 'prepr', "die 'skipping, circa 1989, never in TL, await request'", 'preview-latex',"die 'skipping, use preview'", 'progkeys', "die 'skipping, noinfo license, author unfindable'", 'proofs', "die 'skipping, nosell license'", 'prosper', "&MAKEflatten", 'ps2eps', "die 'skipping, must go into sources'", 'ps4pdf', "die 'skipping, obsolete'", 'psfig', "die 'skipping, nosell license'", 'psfragx', "&MAKEflatten", 'pslatex', "&MAKEpslatex", 'psnfss', "&MAKEpsnfss", 'psnfss-addons', "die 'skipping, ?'", 'psnfssx', "die 'skipping, situation too confused'", 'pst-2dplot', "&MAKEpst", 'pst-3d', "&MAKEpst", 'pst-3dplot', "&MAKEpst", 'pst-abspos', "&MAKEpst", 'pst-am', "&MAKEpst", 'pst-asr', "&MAKEpst", 'pst-bar', "&MAKEpst", 'pst-barcode', "&MAKEpst", 'pst-bezier', "&MAKEpst", 'pst-blur', "&MAKEpst", 'pst-bspline', "&MAKEpst", 'pst-circ', "&MAKEpst", 'pst-coil', "&MAKEpst", 'pst-cox', "&MAKEflatten", 'pst-dbicons', "&MAKEpst", 'pst-diffraction', "&MAKEpst", 'pst-electricfield', "&MAKEpst", 'pst-eps', "&MAKEpst", 'pst-eucl', "&MAKEpst", 'pst-fill', "&MAKEpst", 'pst-fr3d', "&MAKEpst", 'pst-fractal', "&MAKEpst", 'pst-fun', "&MAKEpst", 'pst-func', "&MAKEpst", 'pst-gantt', "&MAKEpst", 'pst-geo', "&MAKEpst", 'pst-geo-compress', "die 'skipping, in pst-geo, check with hvoss'", 'pst-graphicx',"&MAKEpst", 'pst-ghsb', "&MAKEpst", 'pst-gr3d', "&MAKEpst", 'pst-grad', "&MAKEpst", 'pst-infixplot',"&MAKEpst", 'pst-jftree', "&MAKEpst", 'pst-jtree', "&MAKEpst", 'pst-knot', "&MAKEpst", 'pst-labo', "&MAKEpst", 'pst-layout', "&MAKEpst", 'pst-lens', "&MAKEpst", 'pst-light3d', "&MAKEpst", 'pst-magneticfield', "&MAKEpst", 'pst-math', "&MAKEpst", 'pst-mirror', "&MAKEpst", 'pst-node', "&MAKEpst", 'pst-optexp', "&MAKEpst", 'pst-ob3d', "&MAKEpst", 'pst-optic', "&MAKEpst", 'pst-osci', "&MAKEpst", 'pst-pad', "&MAKEpst", 'pst-pdgr', "&MAKEpst", 'pst-platon', "&MAKEpst", 'pst-plot', "&MAKEpst", 'pst-poly', "&MAKEpst", 'pst-qtree', "&MAKEpst", 'pst-rubans', "&MAKEpst", 'pst-sigsys', "&MAKEpst", 'pst-slpe', "&MAKEpst", 'pst-solides3d',"&MAKEpst", 'pst-soroban', "&MAKEpst", 'pst-spectra', "&MAKEpst", 'pst-stru', "&MAKEpst", 'pst-support', "&MAKEpst", 'pst-text', "&MAKEpst", 'pst-thick', "&MAKEpst", 'pst-tree', "&MAKEpst", 'pst-tvz', "&MAKEpst", 'pst-uml', "&MAKEpst", 'pst-vowel', "&MAKEflatten", 'pst-vue3d', "&MAKEpst", 'pstdoc', "die 'skipping, requires python'", 'pstrees', "die 'skipping, obsolete (for latex 2.09)'", 'pstricks', "&MAKEpstricks", 'pstricks-add',"&MAKEpst", 'ptsans', "die 'skipping, use paratype'", 'ptserif', "die 'skipping, use paratype'", 'pxfonts', "&MAKEflatten", 'pxtxalfa', "&MAKEcopy", 'pzccal', "die 'skipping, obsoleted by urwchancal'", 'r2bib', "die 'skipping, requires compilation'", 'ragged2e', "die 'skipping, part of ms'", 'rake4latex', "die 'skipping, requires rake'", 'rangen', "die 'skipping, per author request'", 'ratexdb', "die 'skipping, needs sql, etc.'", 'realcalc', "die 'skipping, nosell license'", 'references', "die 'skipping, requires binary'", 'renditions', "die 'skipping, per author request'", 'resume', "die 'skipping, nosell license'", 'revnum', "die 'skipping, obsolete'", 'revtex', "&MAKEcopy", 'revtex4-1', "die 'skipping, use revtex'", 'rmannot', "die 'skipping, per author (dps) request'", 'romande', "&MAKEcopy", 'rsfs', "&MAKEflatten", 'rsfso', "&MAKEcopy", 'rst', "die 'skipping, nonfree license'", 'sae', "die 'skipping, nosell license'", 'saferef', "die 'skipping, nonfree license'", 'sagetex', "die 'skipping, omitted at author request (25 Jan 2010 19:50:16)'", 'sapthesis', "&MAKEflatten", # so README.TEXLIVE ends up in doc dir 'schedule', "die 'skipping, noinfo license, too old to matter'", 'script', "die 'skipping, noinfo license, too old to matter'", 'scripttex', "die 'skipping, nosell license'", 'seminar', "&MAKEseminar", 'serbianc', "&MAKEcopy", 'setouterbox', "die 'skipping, use oberdiek'", 'sfarticle', "die 'skipping, LaTeX 2.09'", 'sfheaders', "die 'skipping, noinfo license, no reply from author'", 'shadbox', "die 'skipping, nonfree license'", 'shipunov', "&MAKEcopy", 'shortlst', "die 'skipping, nosell license'", 'showdim', "die 'skipping, noinfo license, author deceased'", 'showexpl', "&MAKEflatten", 'siam', "die 'skipping, nonfree license'", 'siggraph', "die 'skipping, nonfree license'", 'simpsons', "die 'skipping, noinfo license'", 'skak', "&MAKEflatten", 'slashbox', "die 'skipping, noinfo license, c.1993'", 'slidenotes', "die 'skipping, nonfree'", 'smflatex', "die 'skipping, nosource'", 'softmaker-freefonts', "die 'skipping, requires nonfree fonts'", 'songs', "die 'skipping, requires binary'", 'soyombo', "die 'skipping, noinfo license, Mongolian ca.1996'", 'springer', "die 'skipping, licenses not checked'", 'sprite', "die 'skipping, noinfo license'", 'ssqquote', "die 'skipping, nonfree license'", 'staves', "&MAKEflatten", 'stmaryrd', "&MAKEflatten", 'stellenbosch',"&MAKEcopy", 'streetex', "die 'skipping, nonfree'", 'style_showcase', "die 'skipping, until JimH advises it is a good idea'", 'svjour', "die 'skipping, license and packaging unclear'", 'symbolindex', "die 'skipping, requires binary'", 't2', "&MAKEt2", 'tabbing', "die 'skipping, use Tabbing'", 'tabto', "die 'skipping, use tabto-generic or tabto-ltx'", 'tamethebeast',"&MAKEtamethebeast", 'tamil-omega', "die 'skipping, supports nonfree ISM fonts'", #"&MAKEflatten", 'taylor', "die 'skipping, nonfree'", 'tclldoc', "die 'skipping, use tcldoc'", 'tds', "die 'skipping, do by hand from http://tug.org/tds'", 'template', "die 'skipping, already part of xpackages'", 'tengwarscript',"&MAKEflatten", 'tex-gyre', "&MAKEcopy", 'tex-refs', "die 'skipping, needs work'", 'texdraw', "&MAKEtexdraw", 'texlipse', "die 'skipping, plugin for Eclipse'", 'texlog-extract', "die 'skipping, Ruby, not self-locating'", 'texmacs', "die 'skipping, binary'", 'texpower', "&MAKEnosymlinks", 'texsis', "&MAKEtexsis", 'tfrupee', "&MAKEflatten", 'tgothic', "die 'skipping, use bookhands'", 'thaifonts-scalable', "die 'skipping, Thai, fontforge format only'", 'thesis-titlepage-fhAC',"die 'skipping, use ...fhac'", 'thsmc', "die 'skipping, requires nonfree font'", 'ticket', "&MAKEflatten", 'time', "die 'skipping, use piff'", 'timeline', "die 'skipping, LaTeX 2.09, never in TL'", 'timescyr', "die 'skipping, monotype font is nonfree'", 'timesnew', "die 'skipping, monotype/ibm font is nonfree'", 'timing', "die 'skipping, noinfo license, 1994 mf'", 'tipa', "&MAKEtipa", 'titlepage-uni-dortmund', "die 'skipping, needs graphics (too short names) in .'", 'tkhyph', "die 'skipping, part of hyph-utf8'", 'tksbrief', "die 'skipping, LaTeX 2.09'", 'tkz-base', "&MAKEtkz", 'tkz-berge', "&MAKEtkz", 'tkz-euclide', "&MAKEtkz", 'tkz-fct', "&MAKEtkz", 'tkz-graph', "&MAKEtkz", 'tkz-kiviat', "&MAKEtkz", 'tkz-linknodes',"&MAKEtkz", 'tkz-tab', "&MAKEtkz", 'tolkienfonts',"die 'skipping, cannot easily separate free from nonfree fonts'", 'tpcmfont', "die 'skipping, ?'", 'tpic2pdftex', "die 'skipping, in Build/source, not ready'", 'tracking', "die 'skipping, nonfree license'", 'translation-europecv-de', "&MAKEnosymlinks", 'translation-footmisc-de', "die 'skipping, nocommercial'", 'translation-pst-jtree-de', "die 'skipping, nocommercial'", 'translator', "die 'skipping, now part of beamer'", # 'tree-dvips', "die 'skipping, noinfo license, latex 2.09'", 'turkishintro',"die 'skipping, nosource'", 'turnstile', "&MAKEflatten", 'turnthepage', "&MAKEflatten", 'tpx', "die 'skipping, nosource, Windows'", 'txfonts', "&MAKEflatten", 'txfontsb', "&MAKEflatten", 'typedref', "die 'skipping, nonfree license'", 'typespec', "die 'skipping, nonfree font specimens'", 'uafthesis', "&MAKEnosymlinks", 'ucharclasses', "die 'skipping, nonfree license'", 'urwchancal', "&MAKEcopy", 'ucs', "&MAKEucs", 'uebungsblatt',"&MAKEflatten", 'uhrzeit', "die 'skipping, noinfo license, old, tiny'", 'uk-faq', "die 'skipping, use FAQ-en'", 'uk-tex-faq', "die 'skipping, use FAQ-en'", 'ukrhyph', "&MAKEukrhyph", 'ulsy', "die 'skipping, noinfo license, old'", 'umrand', "die 'skipping, nonfree'", 'undertilde', "die 'skipping, noinfo license, author not responsive'", 'unitsdef', "&MAKEflatten", 'univers', "die 'skipping, nonfree font'", 'upgreek', "die 'skipping, use was'", 'upmethodology',"&MAKEflatten", 'vector', "die 'skipping, noinfo license, 1994'", 'velthuis', "&MAKEcopy", 'venturisadf', "&MAKEcopy", 'verdana', "die 'skipping, support for nonfree font'", 'vertex', "die 'skipping, noinfo license, aer.sty clash, ancient'", 'vhistory', "&MAKEflatten", 'vicentino', "die 'skipping, nonfree license'", 'view_print_ps_pdf', "die 'skipping, three-char cmd name for ruby script?'", 'vita', "die 'skipping, nonfree license'", 'voss-de', "&MAKEvossde", 'vpp', "die 'skipping, not self-locating, three-char name for ruby script?'", 'vrb', "die 'skipping, noinfo license, author does not recall'", 'vrsion', "die 'skipping, nonfree license'", 'vxu', "die 'skipping, obsolete'", 'wadalab', "&MAKEwadalab", 'wasy2', "&MAKEflatten", 'winedt', "die 'skipping, nonfree license'", 'wntamil', "die 'skipping, nonfree license'", 'wordcount', "&MAKEwordcount", 'wp-conv', "die 'skipping, nonfree license'", 'wp2latex', "die 'skipping, compilation'", 'xbase', "die 'skipping, use xpackages'", 'xcoffins', "die 'skipping, use xpackages'", 'xeCJK', "die 'skipping, use xecjk'", 'xecolour', "&MAKEflatten", 'xecyr', "&MAKEcopy", 'xelibertine', "die 'skipping, replaced by libertine'", 'xetex-pstricks',"&MAKEcopy", 'xfrac', "die 'skipping, use mh (I think)'", 'xinitials', "die 'skipping, will be in xpackages when ready (Morten says)'", 'xindy-persian', "die 'skipping, don't think it can be found'", 'xits', "&MAKEflatten", 'xkeyval', "&MAKExkeyval", 'xmltex', "&MAKExmltex", 'xor', "die 'skipping, will be in xpackages when ready (Morten says)'", 'xpackages', "die 'skipping, now l3packages, etc.'", 'xparse', "die 'skipping, use xpackages'", 'xtcapts', "die 'skipping, license noinfo'", 'xtheorem', "die 'skipping, will be in xpackages when ready (Morten says)'", 'xymtex', "&MAKExymtex", 'xypic', "&MAKExypic", 'yi4latex', "die 'skipping, nosell license'", 'yplan', "&MAKEnosymlinks", 'yt4pdf', "die 'skipping, per author (dps) request'", 'ytex', "die 'skipping, noinfo license'", 'zefonts', "die 'skipping, noinfo license'", #&MAKEflatten", 'zhmetrics', "&MAKEcopy", 'zwgetfdate', "&MAKEcopy", 'zwpagelayout',"&MAKEcopy", ); %prehook = ( 'cals' => '&PREHOOK_cals', 'chess' => '&PREHOOK_chess', 'cm-super' => '&PREHOOK_cm_super', 'fixme' => '&PREHOOK_fixme', 'ibygrk' => '&PREHOOK_ibygrk', 'mathspic' => '&PREHOOK_mathspic', 'mp3d' => '&PREHOOK_mp3d', 'pictex' => '&PREHOOK_pictex', 'skb' => '&PREHOOK_flatten1', 'suftesi' => '&PREHOOK_flatten1', 'vhistory' => '&PREHOOK_vhistory', 'wsuipa' => '&PREHOOK_wsuipa', ); %posthook = ( 'amscls' => '&POSTamscls', 'amstex' => '&POSTamstex', 'apalike' => '&POSTapalike', 'babelbib' => '&POSTbabelbib', 'biber' => '&POSTbiber', 'bibtex' => '&POSTbibtex', 'context-games' => '&POSTcontext_games', 'coordsys' => '&POSTcoordsys', 'ctex' => '&POSTctex', 'dehyph-exptl' => '&POSTdehyph_exptl', 'doipubmed' => '&POSTlatex2html', 'eplain' => '&POSTeplain', 'epspdf' => '&POSTepspdf', 'fixme' => '&POSTfixme', 'fontools' => '&POSTfontools', 'fpl' => '&POSTfpl', 'grverb' => '&POSTgrverb', 'ibygrk' => '&POSTibygrk', 'impatient' => '&POSTimpatient', 'interactiveworkbook' => '&POSTinteractiveworkbook', 'knitting' => '&POSTknitting', 'knuth' => '&POSTknuth', 'koma-script' => '&POSTrmsymlink', 'latexdiff' => '&POSTlatexdiff', 'latex2e-help-texinfo' => '&POSTlatex2ehelptexinfo', 'lithuanian' => '&POSTlithuanian', 'montex' => '&POSTmontex', 'musixtex' => '&POSTmusixtex', 'pgf' => '&POSTpgf', 'prerex' => '&POSTprerex', 'pst-cox' => '&POSTpstcox', 'pst-geo' => '&POSTpstgeo', 'splitindex' => '&POSTsplitindex', 'thailatex' => '&POSTthailatex', 'tipa-de' => '&POSTrmsymlink', 'xecyr' => '&POSTxecyr', 'xetex-pstricks' => '&POSTxetexpstricks', 'zhspacing' => '&POSTzhspacing', 'zhmetrics' => '&POSTzhmetrics', ); %specialdest = ( 'a2ping', 'texmf', 'bin-cjkutils', 'texmf', 'elhyphen', 'texmf', 'hyphenex', 'texmf-dist', 'mnhyphn', 'texmf', ); $standarddest = "texmf-dist"; %specialfmt = ( 'abbr', 'generic', 'abstyles', 'generic', 'amstex', 'amstex', 'antomega', 'omega', 'arabxetex', 'xelatex', 'arrayjob', 'generic', 'barr', 'generic', 'bghyphen', 'generic', 'bibtex', 'generic', 'circ', 'latex', 'cirth', 'generic', 'dehyph-exptl','generic', 'dratex', 'generic', 'edmac', 'generic', 'eijkhout', 'generic', 'epigram', 'generic', 'eplain', 'eplain', 'epsf', 'generic', 'esint-type1', 'plain', 'fenixpar', 'generic', 'fltpoint', 'generic', 'fontch', 'plain', 'genmisc', 'generic', 'german', 'generic', 'hyphenex', 'generic', 'hyplain', 'plain', 'ibygrk', 'generic', 'iftex', 'generic', 'ifxetex', 'generic', 'jadetex', 'jadetex', 'levy', 'generic', # one .sty, one .tex 'mathabx', 'generic', 'mathdots', 'generic', 'metatex', 'plain', 'mfpic', 'generic', 'midnight', 'generic', 'mkpattern', 'plain', 'oberdiek', 'generic', 'ocherokee', 'lambda', 'ofs', 'generic', 'passivetex', 'xmltex', 'pdcmac', 'plain', 'pdf-trans', 'generic', 'philokalia', 'xelatex', 'pictex', 'generic', 'placeins-plain', 'plain', 'plnfss', 'plain', 'pstricks', 'generic', 'pst-cox', 'generic', 'rsfs', 'plain', 'ruhyphen', 'generic', 'shapepar', 'generic', 'systeme', 'generic', 'tabto-generic', 'generic', 'texsis', 'texsis', 'textmerg', 'generic', 'tugboat-plain', 'plain', 'ulem', 'generic', 'variations', 'generic', 'vaucanson-g', 'generic', 'vertex', 'plain', 'wasy2', 'plain', 'xepersian', 'xelatex', 'xesearch', 'xetex', 'xetex-def', 'xelatex', 'xetexfontinfo', 'xetex', 'xltxtra', 'xelatex', 'xmlplay', 'xmltex', 'xstring', 'generic', 'xunicode', 'xelatex', 'zhspacing', 'xetex', ); $standardfmt='latex'; # packages which need special .tex/.sty files installed $standardtex='\.(.bx|cfg|sty|clo|ldf|cls|def|fd|cmap|4ht)$'; %specialtex = ( '2up', '2up\.tex|' . $standardtex, 'FAQ-en', 'NULL', 'uowthesis', '\.(eps|png)|' . $standardtex, 'abbr', '\.tex', 'abstyles', 'apreambl.tex', # not a4c.sty 'ae', '\.fd$|\.sty', 'amstex', '\.st[iy]|ams(ppt1|tex).tex|amstex.bug', 'apa', '\.apa|\.cls', # not endfloat.cfg 'apacite', '\.apc|' . $standardtex, 'arabtex', '\.tex|' . $standardtex, 'babelbib', '\.bdf|\.sty', 'bangtex', 'bangfont\.tex|' . $standardtex, 'bardiag', '\.bar|\.sty|\.cfg', 'barr', 'diagxy.tex', 'base', 'idx.tex|lablst.tex|latexbug.tex|lablst.tex|docstrip.tex|nfssfont.tex|sample2e.tex|small2e.tex|testpage.tex|ltxcheck.tex|\.cfg|\.fd$|\.cls|\.clo|\.ltx|\.sty|\.def|^\.', 'bbold', 'bbold.sty|\.fd', # no fonttabl.sty 'bclogo', 'bc[^l].*\.(tex|pdf|eps|mps)|bclogo\.sty', 'beamer2thesis','\.jpg|' . $standardtex, 'bghyphen', '\.tex', 'bibtex', 'apalike\..*|' . $standardtex, 'bidi', '^bidi\.tex|' . $standardtex, 'blockdraw_mp','NULL', # skip .sty's 'booktabs-de', 'NULL', # doc package 'booktabs-fr', 'NULL', # doc package 'breqn', '\.sty|\.sym', 'c-pascal', '^[^d].*\.tex|' . $standardtex, # not demo*.tex 'calxxxx', 'cal.*\.tex', 'calxxxx-yyyy','cal.*\.tex', 'captcont', '\.sty|[^c]\.cfg', # omit ltxdoc.cfg, would be system-wide 'captdef', '^..[^s].*\.sty', # not miscdoc.sty 'carlisle', '\.sty|\.ltx', 'chemfig', '(t-)?chemfig.tex|' . $standardtex, 'chemstyle', '\.jdf|' . $standardtex, 'cirth', 'num\.tex', 'cjw', '\.tex|' . $standardtex, 'clock', '\.sty|clock\.tex', 'cmap', '\.cmap|' . $standardtex, 'codepage', '\.sty|\.tex', 'colortab', 'colortab\.tex|' . $standardtex, 'contour', '\.cfg|\.sty|\.cnt', 'ctib', '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$|ctib\.tex', 'custbib', '\.mbs|\.tex', 'custom-bib', '\.mbs|\.tex', 'cyrillic', '\.tex|\.sty|\.fd$|\.def', 'dehyph-exptl','de.*\.tex|\.pat', 'dialogl', '\.sty|listouti\.tex', 'din1505', 'NULL', # no tex files, only natbib.cfg, would be system-wide 'dirtree', '\.tex|' . $standardtex, 'disser', '\.rtx|' . $standardtex, 'dlfltxb', '\.sty', # no sample.cfg 'ean', 'ean[0-9]*\.tex', 'easy', 'easy.*\.sty', # no mydoc.sty 'ecv', '\.sty|\.cls|\.ldf', # no docstrip.cfg, else system-wide 'edmac', 'edmac.tex|edstanza.tex|\.sty', 'eijkhout', '\.tex', 'eltex', 'eltex.*tex', 'elsarticle', 'elsarticle.cls', # no rvdtx, pdfwidgets 'epigram', 'epigram.tex', 'epsf', 'epsf.(tex|sty)', 'epslatex-fr', 'NULL', 'esint-type1', 'esint.tex', 'europecv', 'EuropeFlag|europasslogo|\.cls|\.def', 'fancytooltips', 'fancytipmark\..*|' . $standardtex, 'figflow', '\.tex', 'fjodor', 'fjodor\.sty', # not srbook-mem.sty 'flashmovie', '\.swf|' . $standardtex, 'fltpoint', '\.sty|\.tex', 'fntproof', 'fntproof.tex', 'font-change', 'font.*\.tex', 'fontch', '\.tex', 'footnpag', 'footnpag\.sty', 'fragments', '\.tex|' . $standardtex, 'frame', 'frame\.tex|' . $standardtex, 'frankenstein','\.(sto|stq)|' . $standardtex, 'genmisc', '\.sty|\.tex', 'geometry', '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$', # not cfg 'geometry-de', 'NULL', # all doc 'german', '\.sty', 'getoptk', '\.tex', 'ginpenc', '\.gie|\.sty', 'graphics-pln','^[^e].*\.tex|.*\.sty', # not exmpl* 'harvmac', 'mac\.tex', 'hc', '\.hld|' . $standardtex, 'hfoldsty', '\.sty|\.fd|\.cpa', 'hrefhide', '\.sty|[^c]\.cfg', # omit ltxdoc.cfg, would be system-wide 'hyper', '^[^d].*\.sty|\.hyp', # not defpattern.sty 'hyphenex', 'ushyphex\.tex', 'hyplain', '(hyrules|hy.*plain|hylang)\..*', 'ibygrk', 'iby4extr.tex|ibycus4.tex|ibycusps.tex|pssetiby.tex|setiby4.tex|tlgsqq.tex|version4.tex|' . $standardtex, 'ifmslide', '[^n]\.(eps|pdf|jpg)|' . $standardtex, # not ifmman.pdf 'insbox', 'insbox.tex', 'interactiveworkbook', 'NULL', # done in POSTinteractiveworkbook 'interpreter', 'interpreter.(tex|lua)|' . $standardtex, 'iso10303', 'a.*tex|b.*tex|e.*tex|stp.*tex|\.sty|\.4ht', 'isodate', '\.idf|\.sty', 'isodoc', 'isodoc.cls', # not mystyle.sty, isontg.sty, etc. 'jadetex', '\.ltx|\.def|\.tex|\.ini|\.sty|\.fd', 'js-misc', '(cassette|idverb|js-misc|schild|sperr|xfig)\.tex', 'karnaugh', 'kvmacros.tex', 'kastrup', 'binhex.tex|' . $standardtex, 'keystroke', 'keystroke_.*|\.sty', 'kpfonts', '\.sty|\.fd', 'kuvio', '\.tex|\.sty', 'lastpage', '\.sty', # not .cfg 'latex-course','NULL', # keep doc together 'latex-doc-ptr','NULL', # keep doc together 'latex4wp', 'NULL', # keep doc together 'latex4wp-it', 'NULL', # keep doc together 'lecturer', '(t-)?lecturer.(tex|sty)|ltr-', 'lettre', '\.ins|\.cls', 'levy', 'greekmacros.tex|' . $standardtex, 'librarian', '(t-)?librarian.(tex|sty)', 'listings-ext','\.sty', # not .cfg 'logic', 'milstd\.tex|' . $standardtex, 'lualatex-math', '\.sty', # not phst-doc.cls 'magyar', 'NULL', # do not install in runtime, conflicts with babel 'manjutex', '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$|manju.tex', 'math-e', 'NULL', 'mathdots', 'mathdots\.tex|' . $standardtex, 'mdframed', '\.mdf|' . $standardtex, 'metatex', 'metatex.tex', 'mff', '\.sty|mf[^f].*\.tex', 'mfpic', 'mfpic.tex|mfpic.sty|mfppatch.tex', 'mfpic4ode', 'mfpic4ode.tex|' . $standardtex, 'midnight', '\.tex', 'mil3', 'NULL', 'mathabx', 'mathabx\.(dcl|tex)|' . $standardtex, 'minitoc', '\.ml[do]|' . $standardtex, 'misc', '\.sty|\.ltx|\.cls', 'mkpattern', 'mkpatter.tex', 'montex', '(mlsgalig|mlstrans|mnhyphex)\.tex|' . $standardtex, 'mpman-ru', 'NULL', # doc package 'msg', '-msg\.tex|' . $standardtex, 'msu-thesis', 'gb4e-compat\.tex|' . $standardtex, 'multirow', '^..[^s].*\.sty', # not miscdoc.sty 'mylatexformat', '.*\.ltx', 'nag', '\.nag|' . $standardtex, 'navigator', '(t-)?navigator.tex|' . $standardtex, 'nddiss', '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$', 'notes', '[^s]\.(eps|pdf|png)|' . $standardtex, # not notes.pdf 'ntheorem', '\.sty|\.std', 'ofs', '^ofs\.tex|ofsdef\.tex|ofs-.*\.tex|\.sty|a.*\.tex|.*fn\.tex', 'pageslts', '\.sty|[^c]\.cfg', # omit ltxdoc.cfg, would be system-wide 'papermas', '\.sty|[^c]\.cfg', # omit ltxdoc.cfg, would be system-wide 'patch', '\.tex', 'pdf-trans', 'pdf-trans.tex', 'pdfcprot', '\.cpa|\.sty', 'pdfscreen', 'overlay.*pdf|but.*pdf|left.*pdf|right\.pdf|pdfscreen.sty', 'pdfslide', '\.jpg|\.sty|\.clo|\.cfg|meta.*\.pdf', 'pdfx', '\.xmp$|glyph.*tex|pdfx\.sty', 'petri-nets', 'pnets\.tex|pntext\.tex|\.sty|pndraw\.tex|pnversion\.tex|\.sty|pndraw\.tex', 'pgfmolbio', 'pgfmolbio\..*\.|' . $standardtex, # .lua+.tex submodules 'pictex', '\.sty|\.tex', 'pigpen', 'pigpen\.tex|' . $standardtex, 'pitex', 'pitex\.tex|\.ptx|' . $standardtex, 'placeins-plain', 'placeins.tex', 'plgraph', '\.tex', 'plnfss', '\.tex|\.pfd', 'poster-mac', 'poster\.tex|' . $standardtex, 'powerdot', '\.ps|' . $standardtex, 'ppchtex', 'm.*tex|m.*sty', 'present', 'present.tex', 'prosper', '\.ps|\.eps|\.sty|\.cls', 'pstricks', 'pst-*\.tex', 'pstricks-examples', NULL, 'pst-bspline', 'pst-bspline\.(tex|sty)', 'pst-cox', 'pst-cox(coor|eterp)\.tex', 'pst-eucl-translation-bg', 'NULL', 'pst-geo', 'pst-map.*\.tex|pst-map.*\.sty', 'pst-infixplot', 'infix-RPN\.tex|pst-infixplot\.tex', 'pst-text', 'pst-(char|text)\.(tex|sty)', 'qobitree', 'qobitree.tex', 'r_und_s', '\.tex|\.sty', 'realcalc', 'realcalc.tex', 'resumemac', 'resumemac.tex', 'revtex', '\.sty|\.cls|\.rtx', 'rlepsf', 'rlepsf.tex', 'rsfs', 'scrload\.tex|' . $standardtex, 'sansmath', '^..[^s].*\.sty', # not miscdoc.sty 'seminar', '\.bug|\.bg2|\.cls|\.sty|2up.tex', 'shade', 'shade\.tex', # not description.tex 'shadethm', '\.sth|' . $standardtex, 'shapepar', '\.sty', # not def 'showexpl', '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$', # not cfg 'splitindex', 'splitindex\.tex|' . $standardtex, 'spotcolor', 'spotcolor.*\.tex|' . $standardtex, 'startex', '\.tex', 'subfig', '\.sty|[^c]\.cfg', # not ltxdoc.cfg, would be system-wide 'subfigure', '\.sty|[^c]\.cfg', # not ltxdoc.cfg, would be system-wide 'syntax', 'syntax\.tex', 'systeme', '^systeme\.tex$|' . $standardtex, 'tabls', '^[^m].*\.sty', # not miscdoc.sty 'tabto-generic','tabto.tex', 'taylor', 'diagrams.tex', 'tex-ewd', 'dotnot.tex', 'texapi', 'texapi\.tex', 'texsis', '\.txs|TXS.*tex|texsis.tex', 'thesis-titlepage-fhac', 'LOGO.*|' . $standardtex, 'threeparttable', '^..[^s].*\.sty', # not miscdoc.sty 'ticket', '\.tdf|' . $standardtex, 'tikz-cd', 'tikz-cd.sty', # not pgfmanual.sty 'tikz-qtree', '(pgf|tikz-)(subpic|q?tree(-compat)?)\.(tex|sty)', 'tipa-de', 'NULL', # doc package 'titleref', '^..[^s].*\.sty', # not miscdoc.sty 'tkz-orm', 'tkz.*\.sty', # no pgfmanual.sty 'tools', '\.cfg|\.sty|\.clo|\.cls|\.def|\.fd$|.?\.tex|^\.tex$', 'translator', '\.dict|translator-language-mappings.tex|' . $standardtex, 'translation-europecv-de','NULL', # doc package 'truncate', '^..[^s].*\.sty', # not miscdoc.sty 'tugboat-plain','\.cmn|' . $standardtex, 'underscore', '^..[^s].*\.sty', # not miscdoc.sty 'undolabl', '\.sty|[^c]\.cfg', # omit ltxdoc.cfg, would be system-wide 'universa', '\.fd|uni\.sty', # not unidoc.sty 'upca', '^upca\.tex', 'url', '^[^m].*\.sty', # not miscdoc.sty 'variations', '^variations\.tex|' . $standardtex, # not docvariations.tex 'varisize', '\.tex', 'varwidth', '^..[^s].*\.sty', # not miscdoc.sty 'vaucanson-g', '\.(def|tex)|' . $standardtex, 'vertex', 'vertex\.tex|' . $standardtex, 'vhistory', '\.sty', # not hyperref.cfg 'vrb', 'vrb\.tex', 'vruler', '^..[^s].*\.sty', # not miscdoc.sty 'wasy2', 'wasyfont\.tex', 'wordcount', '\.tex', 'xcomment', 'xcomment\.tex|' . $standardtex, 'xepersian', 'xepersian-mathsdigitspec\.tex|' . $standardtex, 'xesearch', 't-.*|' . $standardtex, 'xetexfontinfo','\.tex', 'xwatermark', '\.sty', # no .cfg 'xlop', 'xlop\.(tex|sty)', # no manual.sty 'xstring', 'xstring\.tex|' . $standardtex, 'yax', '(t-)?yax\.(sty|tex)|' . $standardtex, 'zefonts', '\.sty|\.fd', ); %specialdocfmt = ( 'Asana-Math', 'fonts', 'FAQ-en', 'generic', 'Type1fonts', 'fonts', 'abbr', 'generic', 'abstyles', 'bibtex', 'apalike', 'bibtex', 'accfonts', 'fonts', 'allrunes', 'fonts', 'amstex', 'amstex', 'antomega', 'omega', 'arabxetex', 'xelatex', 'archaic', 'fonts', 'arev', 'fonts', 'around-the-bend', 'generic', 'arrayjob', 'generic', 'ascii-chart', 'support', 'astro', 'fonts', 'asymptote-faq-zh-cn', 'support', 'asymptote-by-example-zh-cn', 'support', 'asymptote-manual-zh-cn', 'support', 'aurical', 'fonts', 'automata', 'metapost', 'ascii', 'fonts', 'barr', 'generic', 'bartel-chess-fonts', 'fonts', 'bbm', 'fonts', 'bengali', 'fonts', 'bera', 'fonts', 'bghyphen', 'generic', 'bib-fr', 'bibtex', 'bibhtml', 'bibtex', 'blacklettert1', 'fonts', 'boisik', 'fonts', 'bundledoc', 'support', 'cbfonts', 'fonts', 'cc-pl', 'fonts', 'chicago-annote', 'bibtex', 'chemarrow', 'fonts', 'circ', 'latex', 'cirth', 'fonts', 'cjhebrew', 'fonts', 'cm-super', 'fonts', 'cmarrows', 'metapost', 'concmath', 'fonts', 'concmath-fonts', 'fonts', 'context-notes-zh-cn', 'context/third', 'context-top-ten', 'context/third', 'cursolatex', 'portuguese', 'de-macro', 'support', 'dehyph-exptl', 'generic', 'devanagr', 'fonts', 'dictsym', 'fonts', 'dingbat', 'fonts', 'dinat', 'bibtex', 'doublestroke', 'fonts', 'dozenal', 'fonts', 'dratex', 'generic', 'economic', 'bibtex', 'edmac', 'generic', 'eiad', 'fonts', 'elhyphen', 'generic', 'elsevier-bib', 'bibtex', 'elvish', 'fonts', 'enctex', 'generic', 'encxvlna', 'generic', 'epigrafica', 'fonts', 'eplain', 'eplain', 'epsf', 'generic', 'epspdf', 'support', 'eurofont', 'fonts', 'eurosym', 'fonts', 'expressg', 'metapost', 'exteps', 'metapost', 'fc', 'fonts', 'featpost', 'metapost', 'fenixpar', 'generic', 'feyn', 'fonts', 'fge', 'fonts', 'fig4latex', 'support', 'findhyph', 'support', 'fltpoint', 'generic', 'fontch', 'plain', 'fontools', 'support', 'fourier', 'fonts', 'fouriernc', 'fonts', 'fpl', 'fonts', 'fragmaster', 'support', 'frcursive', 'fonts', 'genmisc', 'generic', 'german', 'generic', 'gfsartemisia', 'fonts', 'gfsbaskerville', 'fonts', 'gfsbodoni', 'fonts', 'gfscomplutum', 'fonts', 'gfsdidot', 'fonts', 'gfsneohellenic', 'fonts', 'germbib', 'bibtex', 'gnu-freefont', 'fonts', 'gost', 'bibtex', 'greenpoint', 'fonts', 'hfoldsty', 'fonts', 'hieroglf', 'fonts', 'hyplain', 'plain', 'ibygrk', 'fonts', 'iftex', 'generic', 'ifxetex', 'generic', 'ijqc', 'bibtex', 'impatient', 'plain', 'impatient-fr', 'plain', 'inconsolata', 'fonts', 'iopart-num', 'bibtex', 'jablantile', 'fonts', 'jadetex', 'jadetex', 'junicode', 'fonts', 'kixfont', 'fonts', 'knitting', 'fonts', 'kpfonts', 'fonts', 'latexmk', 'support', 'latexmp', 'metapost', 'leawood', 'fonts', 'lfb', 'fonts', 'lh', 'fonts', 'latex-notes-zh-cn', 'generic', 'lua-alt-getopt', 'support', 'marvosym', 'fonts', 'mathabx', 'fonts', 'mathdots', 'generic', 'memdesign', 'fonts', 'metafont-beginners', 'fonts', 'metatex', 'plain', 'metauml', 'metapost', 'mfpic', 'generic', 'midnight', 'generic', 'mkgrkindex', 'support', 'mkpattern', 'plain', 'mkjobtexmf', 'generic', 'mpattern', 'metapost', 'mxedruli', 'fonts', 'nkarta', 'fonts', 'oberdiek', 'generic', 'ofs', 'generic', 'oldlatin', 'fonts', 'orkhun', 'fonts', 'ot2cyr', 'fonts', 'pacioli', 'fonts', 'patgen2-tutorial', 'support', 'pdcmac', 'plain', 'pdf-trans', 'generic', 'pdfcrop', 'support', 'persian-bib', 'xelatex', 'phaistos', 'fonts', 'philokalia', 'xelatex', 'phonetic', 'fonts', 'pictex', 'generic', 'pkfix', 'support', 'pkfix-helper', 'support', 'plnfss', 'plain', 'pst-cox', 'generic', 'purifyeps', 'support', 'pxfonts', 'fonts', 'recycle', 'fonts', 'rsfs', 'fonts', 'shapepar', 'generic', 'skak', 'latex', 'skaknew', 'fonts', 'splines', 'metapost', 'staves', 'fonts', 'systeme', 'generic', 'tamil-omega', 'omega', 'texcount', 'support', 'texdiff', 'support', 'texdirflatten', 'support', 'texloganalyser', 'support', 'texsis', 'texsis', 'textmerg', 'generic', 'textpath', 'metapost', 'timing', 'fonts', 'trajan', 'fonts', 'tugboat-plain', 'plain', 'txfonts', 'fonts', 'txfontsb', 'fonts', 'ulem', 'generic', 'universa', 'fonts', 'vancouver', 'bibtex', 'variations', 'generic', 'vaucanson-g', 'generic', 'velthuis', 'generic', 'vertex', 'plain', 'voss-de', 'german', 'wasy2', 'fonts', 'wsuipa', 'generic', 'xepersian', 'xelatex', 'xesearch', 'xetex', 'xetex-devanagari', 'xetex', 'xetex-itrans', 'xelatex', 'xetex-pstricks', 'xetex', 'xetexfontinfo', 'xetex', 'xetexref', 'xetex', 'xltxtra', 'xelatex', 'xq', 'fonts', 'xstring', 'generic', 'xunicode', 'xelatex', 'zhspacing', 'xetex', ); $standarddocfmt='latex'; # needs special TeX program to run the doc. %specialTEX = ( 'arabtex', 'tex', 'barr', 'latex', 'bytefield', 'pdflatex', 'esint-type1', 'pdftex', 'euro-ce', 'tex', 'floatrow', 'latex', 'genealogy', 'tex', 'insbox', 'tex', 'iso10303', 'pdflatex', 'mfpic', 'tex', 'mpattern', 'true', # requires running mpp, but it's not executable and # anyway it's just a test file. ignore it. 'ofs', 'csplain', 'pdfscreen', 'pdflatex', 'pdfslide', 'pdflatex', 'pl-qx', 'platex', 'subfig', 'pdflatex', 'texsis', 'tex', 'typespec', 'tex', 'wasy2', 'tex', 'webeq', 'pdflatex', ); # %specialsourcefmt = ( 'allrunes', 'fonts', 'antomega', 'omega', 'apl', 'fonts', 'arabxetex', 'xelatex', 'archaic', 'fonts', 'arev', 'fonts', 'arrayjob', 'generic', 'blacklettert1','fonts', 'blockdraw_mp','metapost', 'cb', 'fonts', 'chemarrow', 'fonts', 'circ', 'latex', 'cirth', 'generic', 'cjhebrew', 'fonts', 'cmpica', 'fonts', 'cryst', 'fonts', 'dozenal', 'fonts', 'eplain', 'eplain', 'epsf', 'generic', 'eurofonts', 'fonts', 'eurosym', 'fonts', 'expressg', 'metapost', 'fc', 'fonts', 'feyn', 'fonts', 'fge', 'fonts', 'figflow', 'plain', 'fltpoint', 'generic', 'fourier', 'fonts', 'fouriernc', 'fonts', 'fpl', 'fonts', 'frcursive', 'fonts', 'genmisc', 'generic', 'german', 'generic', 'germbib', 'bibtex', 'gost', 'bibtex', 'greenpoint', 'fonts', 'hfoldsty', 'fonts', 'hyphenex', 'generic', 'jadetex', 'jadetex', 'kixfont', 'fonts', 'kpfonts', 'fonts', 'latexmp', 'metapost', 'leawood', 'fonts', 'lfb', 'fonts', 'latexmp', 'metapost', 'mathdots', 'generic', 'mkjobtexmf', 'generic', 'mnhyphn', 'generic', 'mfpic', 'generic', 'multido', 'generic', 'oberdiek', 'generic', 'ofs', 'generic', 'ot2cyr', 'fonts', 'patch', 'generic', 'pdcmac', 'plain', 'philokalia', 'xelatex', 'pictex', 'generic', 'pstricks', 'generic', 'ruhyphen', 'generic', 'splines', 'metapost', 't2', 'generic', 'textmerg', 'generic', 'trajan', 'fonts', 'universa', 'fonts', 'variations', 'generic', 'velthuis', 'fonts', 'wasy2', 'fonts', 'xltxtra', 'xelatex', ); $standardsourcefmt='latex'; $standardsource='\.(c|drv|dtx|fea|fdd|ins|sfd)$|configure.*|install-sh'; %specialsource= ( 'FAQ-en', 'NULL', 'ae', '\.mtx|\.etx|\.tex|clean|go|install|makepl', 'amsldoc-vn', 'NULL', 'apl', ".*", # get everything, simplest 'arabxetex', 'NULL', # dtx with others, why not 'bbold', $standardsource . '|fonttabl.sty', 'biber', '.*', # keep all, lots to do in post 'bigints', 'NULL', 'blacklettert1', '\.dtx|\.ins|\.pl|Makefile', 'booktabs-de', 'NULL', # doc package 'booktabs-fr', 'NULL', # doc package 'carlisle', '\.dtx|\.ins|ltxtable\.tex', 'chemarrow', '\.mp|\.vfb', 'concmath-fonts', 'NULL', 'crossword', $standardsource . '|AcrossLite', 'epsf', 'NULL', 'epslatex-fr', 'NULL', 'epspdf', 'NULL', # leave .install 'eskdx', 'NULL', # leave makefiles 'eurosym', 'NULL', # leave makefiles, etc. 'export', '\.l|' . $standardsource, 'feynmf', 'feynmf\.pl|' . $standardsource, 'findhyph', 'NULL', # leave makefile 'fmtcount', 'fmtcount.perl|' . $standardsource, 'fpl', 'Add|\.pe|\.ps' . $standardsource, 'geometry-de', 'NULL', # keep together 'grverb', '\.vpl|' . $standardsource, 'hyper', '\.pl|' . $standardsource, 'hyphenex', '.*', 'impatient', 'NULL', # doc package 'intro-scientific', 'NULL', # doc package 'js-misc', 'NULL', # no gain in splitting up 'kpfonts', '\.zip', 'latex-doc-ptr', 'NULL', # doc package 'latex2e-help-texinfo','NULL', # doc package 'latex2man', 'NULL', # leave Makefile 'latexdiff', 'NULL', # leave Makefile 'lua-alt-getopt', 'NULL', 'mff', '\.mfj|\.bat|\.diz', 'microtype-de', 'NULL', # doc package 'mkjobtexmf', 'Makefile.in|' . $standardsource, 'mpman-ru', 'NULL', # doc package 'ot2cyr', '\.afm|\.etx|' . $standardsource, 'patch', '\.doc', 'pdfx', 'rvdtx\.sty|' . $standardsource, 'pgfplots', 'NULL', # manual.install.tex in doc/ 'rcs', 'rcs.el|src|' . $standardsource, 'thailatex', 'NULL', # no gain in splitting up 'translation-chemsym-de', 'NULL', # doc package 'translation-filecontents-de', 'NULL', # doc package 'tkz-orm', 'NULL', # no gain ... 'xlop', 'manual.sty|' . $standardsource, ); # special cases of which .ins files to run; used to remove # normal choices, and get the most general. %specialins = ( 'aastex', 'NULL', # everything is pregenerated 'base', 'NULL', 'bbold', 'bbold.dtx', 'booktabs-de', 'NULL', # doc, no need to build 'blacklettert1','NULL', # don't try to do fontinst 'bosisio', '.*\.dtx', 'canoniclayout','.*\.dtx', 'carlisle', '\.ins|ltxtable.tex', 'ccfonts', 'ccfonts.ins', 'chronology', 'chronology.dtx', 'cmbright', 'NULL', 'cprotect', "$package.dtx", 'curve2e', 'curve2e.dtx', 'dotseqn', 'dotseqn.dtx', 'etextools', 'etextools.dtx', 'feynmf', 'feynmf.ins', 'floatrow', 'floatrow.ins', 'geometry', 'geometry.dtx', 'geometry-de', 'NULL', # doc, no need to build 'imakeidx', 'imakeidx.dtx', 'lastpage', 'lastpage.dtx', 'lettre', 'NULL', 'localloc', 'localloc.dtx', 'luaindex', 'luaindex.dtx', 'makecell', 'makecell.dtx', 'mylatexformat', 'mylatexformat.dtx', 'namespc', 'namespc.dtx', 'uothesis', 'uothesis.dtx', 'pageslts', 'pagesLTS.dtx', 'paper', 'install', 'papermas', "$package.dtx", 'parrun', 'parrun.ins', 'seuthesis', 'NULL', # don't want to run iconv, etc. 'stmaryrd', 'stmaryrd.dtx', 'tablists', 'tablists.dtx', 'thesis', 'install.01|install.ndx', 'termlist', 'termlist.dtx', 'teubner', 'teubner.dtx', 'toptesi', 'toptesi.dtx', 'translation-filecontents-de', 'NULL', # doc package 'turnstile', 'turnstile-en.ins', # skip pt 'ulqda', 'ulqda.dtx', 'undolabl', 'undolabl.dtx', 'xecjk', 'xeCJK.dtx', ); $standardins='\.ins$'; # ltxtable.tex in carlisle uses the {filecontents} environment to write # ltxtable.sty. Unfortunately if the file exists anywhere in the input # tree, it won't be written, and of course TL already has it installed. # So set TEXINPUTS to only the directories actually needed for the run, # so that latex will not find our installed ltxtable.sty. my $core_latex = "$Master/texmf-dist/tex/latex"; %specialinsrunner = ( 'antomega' => 'latex', # requires interaction 'apa6e' => 'latex', # requires interaction 'beamersubframe' => 'latex', # requires interaction 'bosisio' => 'latex -translate-file=empty.tcx', # ^^, no 8-bit 'bullcntr' => 'latex', # requires interaction 'canoniclayout' => 'tex', 'carlisle' => "env TEXINPUTS=$core_latex/base:$core_latex/tools:. latex", 'clefval' => 'latex -translate-file=empty.tcx', # no 8-bit 'ctable' => 'latex', # requires interaction 'curve2e' => 'tex', 'dateiliste' => 'latex', # requires interaction 'dotseqn' => 'latex', # requires interaction 'delimtxt' => 'latex -translate-file=empty.tcx', # no 8-bit 'elteikthesis' => 'latex', # requires interaction 'engpron' => 'latex -translate-file=empty.tcx', # no 8-bit 'ecclesiastic' => 'latex', # requires interaction 'etextools' => 'etex -translate-file=empty.tcx', # no 8-bit 'extpfeil' => 'latex -translate-file=empty.tcx', # no 8-bit 'fancytooltips' => 'latex', # requires interaction 'fancyvrb' => 'latex -translate-file=empty.tcx', # no 8-bit 'fbithesis' => 'latex', # requires interaction 'g-brief' => 'latex', # requires interaction 'geometry' => 'tex', 'german' => 'tex', 'graphics-pln' => "env TEXINPUTS=$Master/texmf-dist/source/latex/base: latex", 'hrlatex' => 'latex', # requires interaction 'isodoc' => 'latex', # requires interaction 'labelcas' => 'latex', # requires interaction 'lastpage' => 'tex', 'lcd' => 'latex -translate-file=empty.tcx', # no 8-bit 'luaindex' => 'lualatex --shell-escape', 'mylatexformat'=> 'tex', 'nomentbl' => 'latex -translate-file=empty.tcx', # no 8-bit 'thumb' => 'latex -translate-file=empty.tcx', # no 8-bit 'pageslts' => 'tex -translate-file=empty.tcx', # no 8-bit 'papermas', => 'tex', 'pauldoc' => 'latex', # requires interaction 'poemscol' => 'latex', # requires interaction 'polski' => 'latex', # requires interaction 'psfragx' => 'latex', # requires interaction 'schedule' => 'latex', # requires interaction 'silence' => 'latex -translate-file=empty.tcx', # no 8-bit 'svn-multi' => 'latex', # interaction for .pl 'teubner' => 'latex', # interaction 'termlist' => 'tex', # interaction for .pl 'thumb' => 'latex -translate-file=empty.tcx', # no 8-bit 'todonotes' => 'latex', # requires interaction 'toptesi' => 'latex', # requires interaction 'undolabl' => 'tex', 'xecjk' => 'xecjk-xelatex', ); $standardinsrunner="latex -interaction=nonstopmode"; %specialmakeindex= ( 'apprends-latex' => 'NULL', # doc 'bigints' => 'NULL', # doc 'mpman-ru' => 'NULL', # doc 'musuos' => 'NULL', # gind.ist conflict 'pst-eucl-translation-bg' => 'NULL', # doc 'seuthesis', => 'NULL', # doc 'tkz-tab', => 'NULL', # doc 'turnthepage', => 'NULL', # doc ); $standardmakeindex='\.ist'; # packages which need special MetaPost files $standardmp = '\.mp$'; %specialmp = ( 'automata', 'automata.mp', # skip example.mp 'bpolynomial', 'bpolynomial.mp', # skip examples.mp 'chemarrow', 'NULL', # don't install arrow.mp 'dviincl', 'fix.*mp', # skip test-bop.mp 'epsincl', 'eps.*mp', # skip testincl.mp 'feynmp', 'feynmp.mp', 'hatching', '[^e].mp', # no htchuse.mp 'latexmp', 'latexmp.mp', 'mpattern', 'mpattern.mp', # don't install test.mp 'mp3d', '^(3d|ani)', # not examples 'mpman-ru', 'NULL', # doc package 'pdfslide', 'NULL', # no meta.mp 'polski', 'NULL', # no sample-*.mp 'semioneside', 'NULL', # don't install figure*.mp 'textpath', 'textpath.mp', # don't install textpathfigs.mp ); %specialdvi = (); $standarddvi = 'NULL'; # rely on authors/CTAN making pdf's. $standardcsf='\.csf'; %specialcsf = ( 'disser' => 'cp1251lc.csf', # cp1251.csf dup with gost ); $standardbst='\.bst$'; %specialbst = ( 'mil3' => 'NULL', 'msu-thesis' => 'NULL', 'przechlewski-book-examples' => 'NULL', 'umthesis' => 'NULL', ); # packages which need special BibTeX data files (not) installed. $standardbib = 'NULL'; # almost all bib files are for the doc #$standardbib='\.bib$'; # $ so we don't find README.bibtex in IEEEtran %specialbib= ( 'IEEEtran' => '\.bib$', 'amsrefs' => 'ams.*bib', # not jr.bib 'bibtex' => 'xampl\.bib$', 'computational-complexity' => '\.bib$', ); # packages which have Metafont sources to run. $standardmf='[0-9]\.mf'; %specialmf= ( 'asaetr', 'NULL', # cmcscsl10.mf conflict 'astro', 'astrosym.mf', 'backgammon', 'bg\.mf', 'cherokee', 'cherokee.mf', 'circ', 'csybimos\.mf|csycirc\.mf|csydiod\.mf|csyrest\.mf|csywidko\.mf|csysym\.mf|optic\.mf', 'cirth', 'cir.*\.mf', 'clock', 'clock.mf', 'cmcyr', 'NULL', # already made 'cmpica', 'cmpic.*\.mf', 'dancers', 'dancers\.mf', 'dice', 'dice3d\.mf', 'dingbat', '\.mf', 'eiad-ltx', 'NULL', # Fr10.mf and Fbf10.mf don't compile (need cmbase) 'engwar', 'engwar\.mf', 'euro-ce', 'eu.*\.mf|ce.*\.mf', 'feynmf', 'feynmf\.mf', 'greenpoint', 'greenpoint\.mf', 'hands', 'hands\.mf', 'ibygrk', 'NULL', 'ifsym', '\.mf|\.gen', 'logic', 'milstd\.mf', 'mfpic', 'grafbase\.mf', 'morse', 'morse10.mf|morse.def', 'niceframe', 'karta15\.mf|umrand[ab]\.mf', # not bbding or dingbat 'ogham', 'ogham\.mf', 'skak', 'skak.*[0-9].*\.mf', 'tengwar', 'tengwar\.mf', 'umrand', 'umrand[ab]\.mf', 'xq', 'xq(normal|large)\.mf', ); %specialfoundry = ( 'antiqua', 'urw', 'fc', 'jknappen', 'mfpic', 'metafont', ); $standardfoundry='public'; # additional mf files to be installed but not run. $standardmfinstall = '\.mf$'; %specialmfinstall = ( 'asaetr' => 'NULL', # cmcscsl10.mf conflict 'astro' => 'astrosym.(cal|cmn|mac|uni|xtr)', 'cmcyr' => '\.mf', 'ibygrk' => 'ibycus4\.map', # tex|mf source 'wnri' => $standardmfinstall . '|wnindic\.map', # mf source ); # packages which have dvips header files $standardpro='\.pro$'; %specialpro= ( 'cm-super' => 'config.cm-super|cm-super.GS', 'dvipsconfig' => '.*', # addpsctrl should be in bin, but ... 'epspdf' => 'NULL', # makegray.pro goes in scripts 'esint-type1' => 'config.esint', 'initials' => 'config.*', 'pspicture' => 'pspicture.ps', 'zefonts' => 'slantcm.cfg', ); $standardmap='\.(map|tec)$'; %specialmap = ( 'adobemapping' => '.', # take them all 'fundus' => 'NULL', # skip startrek fonts we don't have 'ibygrk' => 'iby\.map', # not ibycus4.map, which is tex|mf 'kerntest' => 'NULL', # skip test map file 'skak' => 'NULL', # skip ill-named special.map 'xetex-devanagari' => 'README|' . $standardmap, # no point in breaking up ); # $standardmapdest = "fonts/map/dvips"; %specialmapdest = ( 'adobemapping' => "fonts/cmap", 'arabxetex' => "fonts/misc/xetex/fontmapping", 'xepersian' => "fonts/misc/xetex/fontmapping", 'xetex-devanagari' => "fonts/misc/xetex/fontmapping", 'xetex-itrans' => "fonts/misc/xetex/fontmapping", ); $standardafm='\.afm'; %specialafm = (); $standardvmap='\.ali$'; %specialvmap = (); $standardenc='\.enc'; %specialenc = (); $standardocp='\.ocp'; %specialocp = (); $standardofm='\.ofm'; %specialofm = (); $standardotf='\.otf'; %specialotf = ( 'cm-unicode' => '^[^.]*\.otf', # not Fontmap.CMU.otf ); $standardotp='\.otp'; %specialotp = (); $standardovf='\.ovf'; %specialovf = (); $standardovp='\.ovp'; %specialovp = ( 'psfragx', 'NULL',); $standardpfb = '\.pfb|\.inf$'; %specialpfb = ( 'cm-unicode' => '^[^.]*\.pfb', # not Fontmap.CMU.pfb 'dviincl' => 'NULL', # skip 0dviincl.inf, is a README 'pigpen' => 'pigpen.pfa', ); $standardpfm='\.pfm'; %specialpfm = (); $standardsfd=NULL; # subfont definition, not fontforge! %specialsfd = (); # only dnp, ttf2pk $standardttf='\.ttf'; %specialttf = (); # packages which have xmltex files $standardxmt='\.xmt'; %specialxmt = (); # scripts to install under texmf*/.../scripts, but not bindir. %specialscripts_nobin = ( 'epspdf' => '(epspdf(|\.help|boot|tk)|\.rb|makegray\.pro)$', 'lua-alt-getopt' => '\.lua$', 'luaindex' => '\.lua$', 'lualatex-math' => '\.lua$', 'luasseq' => '\.lua$', ); # scripts that should end up in $bindir too. %specialscripts_bin = ( 'a2ping' => '\.pl$', 'accfonts' => 'mkt1font|vpl2', 'authorindex' => 'authorindex$', 'bibexport' => 'bibexport\.sh$', 'bundledoc' => '(arlatex|bundledoc)$', 'ctanify' => '^ctanify$', 'ctanupload' => '\.pl$', 'de-macro' => 'de-macro', 'dviasm' => '\.py$', 'ebong' => '\.py$', 'epstopdf' => 'epstopdf\.pl', 'fig4latex' => 'fig4latex', 'findhyph' => 'findhyph$', 'fragmaster' => 'fragmaster\.pl$', 'installfont' => 'installfont-tl', 'latex2man' => 'latex2man$', 'latexdiff' => 'latex(diff-so|diff-vc|revise)$', 'latexmk' => '\.pl$', 'listings-ext' => '\.sh$', 'match_parens' => '^match_parens$', 'mathspic' => '^mathspic\.pl$', 'mf2pt1' => '\.pl$', 'mkgrkindex' => 'mkgrkindex$', 'mkjobtexmf' => '\.pl$', 'musixtex' => '\.lua$', 'pdfcrop' => '\.pl$', 'pdfjam' => 'pdf[^.]*$', 'perltex' => '\.pl$', 'pkfix' => '\.pl$', 'pkfix-helper' => 'pkfix-helper$', 'pst2pdf' => 'pst2pdf$', 'purifyeps' => 'purifyeps$', 'sty2dtx' => '\.pl$', 'svn-multi' => 'svn-multi\.pl$', 'texcount' => '\.pl$', 'texdef' => '\.pl$', 'texdiff' => 'texdiff$', 'texdirflatten' => 'texdirflatten$', 'texloganalyser' => 'texloganalyser', 'thumbpdf' => '\.pl$', 'ulqda' => '\.pl$', 'urlbst' => 'urlbst$', 'vpe' => '\.pl$', ); # packages which have info files to install. %specialinfos = ( 'latex2e-help-texinfo' => '\.info', 'latex2man' => '\.info', ); # packages which have man pages to install. %specialmans = ( 'bundledoc' => '\.1$', 'ctanify' => '\.1$', 'epstopdf' => 'epstopdf.1|epstopdf.man1.pdf', 'findhyph' => 'findhyph.1', 'latexdiff' => '\.1$', 'latexmk' => 'latexmk.1', 'mkjobtexmf' => 'mkjobtexmf.man', 'perltex' => 'perltex.1', 'pdfjam' => '\.1$', 'pkfix-helper' => 'pkfix-helper.1', 'purifyeps' => 'purifyeps.1', 'texdiff' => 'texdiff.1', 'texdirflatten' => 'texdirflatten.1', ); # which suffixes to remove after building. Checked after runins and at # the end, in the doc directory. $standardclean = '\.head|\.tmp|\.dvi|\.log|\.out|\.aux|\.toc|\.lof|\.lot' . '|\.bbl|\.blg|\.idx|\.ind|\.ilg|\.glo|\.gls|\.loa'; %specialclean = ( 'a2ping' => 'README', # not worth whole separate doc subdir 'accfonts' => $standardclean . '|dvips.enc', # dup enc 'acmconf' => $standardclean . '|flushend.sty', # dup with sttools 'apalike' => "apalike2.bst", # does not belong 'bardiag' => "example/.*(aux|log)", # junk on CTAN 'bbm-macros' => $standardclean . '|^bbm$', # symlink 'bundledoc' => $standardclean . '|\.pdf$', # regen for a4 'catoptions' => $standardclean . '|Thumbs.db', # bogus file 'cmbright' => 'cmbright.pdf', 'cprotect' => $standardclean . '|\.cpt', # temp files for doc 'dateiliste' => $standardclean . '|dateiliste.README*', # already in dist 'elvish' => '\.pk3', # no pk files 'epstopdf' => 'epstopdf\.pdf', # we generate 'findhyph' => 'findhyph.pdf', # we generate 'fundus' => $standardclean . '|outline.sty', # in own package 'gentle' => 'gentle.ps.gz', # pdf is enough 'hyph-utf8' => 'README', 'jadetex' => $standardclean # these sty files are in passivetex . '|(dummyels|mlnames|ucharacters|unicode)\.sty', 'lshort-russian'=>'lshortbk.zip', # sources are enough 'lshort-spanish'=>'lshort-letter.pdf', # a4 is enough 'mathexam' => 'sample.tex~', 'pkfix-helper' => 'pkfix-helper.pdf', 'purifyeps' => 'purifyeps.pdf', 'revtex' => '00readme.tex|DOWNLOAD|README', # already in doc 'tufte-latex' => $standardclean . '|.tds.zip$', 'wsuipa' => $standardclean . '|.*pk$', # premade pk files ); # if a hash entry is matched here, README.TEXLIVE is created mentioning # that the files were removed. These are checked after runins. %moreclean = ( 'AkkTeX' => 'still to do, sorry', 'bbcard' => 'bbcard.tpm', # old TL infra 'chessboard' => 'chessboard.pdf', # no source 'chessfss' => 'chessfonts_gallery.pdf|chessfss.pdf', # no source 'dcpic' => '.*\.pdf', # no source 'dfgproposal' => '1_02.*\.pdf', # nonfree specs 'din1505' => '(leitbild3|normpatsoft).pdf', # no source 'ecclesiastic' => 'ecclesiastic-sample.pdf', # no source 'easy' => '.*\.pdf|doc.html.tgz', # no source 'ednotes' => 'perpage.sty', # copy from bigfoot 'epslatex-fr' => 'R?Danger.eps', # unneeded, name clash 'flacards' => 'flacards.pdf', # no source 'gfsartemisia' => 'A*Specimen.pdf', # no source 'gfsbaskerville'=> 'B*Specimen.pdf', # no source 'gfsbodoni' => 'B*Specimen.pdf', # no source 'gfscomplutum' => 'C*Specimen.pdf', # no source 'gfsdidot' => '[DO]*Specimen.pdf', # no source 'gfsneohellenic'=> 'N*Specimen.pdf', # no source 'jknapltx' => 'ubbold.fd', # clash bbold's Ubbold.fd; sauter bbold fails 'jlabels' => 'jlabels.pdf', # no source 'linguex' => 'cgloss4e.sty', # symlink 'nowidow' => 'nowidow-test.pdf', # no source 'numericplots' => '.*\.m', # matlab 'piechartmp' => 'piechartmp.pdf', # no source 'ptptex' => '(overcite|cite|wrapfig).sty', # duplicated 'sapthesis' => 'marchiologo.*\.pdf', # univ logos 'stix' => 'STIX_Font_Release_Documentation_2010.pdf', # no source 'stubs' => 'stubs.pdf', # no source 'susy' => 'susy.pdf', # no source 'toptesi' => 'logo.*', # legalities unknown 'tree-dvips' => 'avm.*', # author no response 'xskak' => 'xskak.pdf', # no source 'yannisgr' => '^(digits|gen_acc)\.mf' # levy dup ); # (main program) # Read from config file to make local adjustments to above. readconfig(); # command line options $opt_debug = 1; # verbosity is good exit 2 unless Getopt::Long::GetOptions ( "ctan-dir=s", "debug!", "help", "test|n!", "version", ); for (@ARGV) { $packagedir = $_; if (! -d $packagedir) { warn "$0: $packagedir not a directory, skipping.\n"; next; } &set_dir_defaults ($opt_ctan_dir); @x = split(/\//,$packagedir); $package = pop (@x); my $COOKED_PKG = "$COOKED_TOP/$package"; # output directory if ($specialscripts_bin{$package} || $package eq "biber") { $BUILDDEST = "$COOKED_PKG/Build/source"; $TOPDEST = "$COOKED_PKG/Master"; } else { $BUILDDEST = "oops, no builddest should be needed?"; $TOPDEST = $COOKED_PKG; # that is, Master } $DEST_TREE = $specialdest{$package} || $standarddest; # usually texmf-dist $DEST = "$TOPDEST/$DEST_TREE"; # goes to Master/texmf-dist or whatever $whichformat = $specialfmt{$package} || $standardfmt; $whichdocformat = $specialdocfmt{$package} || $standarddocfmt; $inspatt = $specialins{$package} || $standardins; $insrunner = $specialinsrunner{$package} || $standardinsrunner; $Foundry = $specialfoundry{$package} || $standardfoundry; print "pkg=$package (fmt=$whichformat docfmt=$whichdocformat) -> $DEST\n"; if (exists $special{$package}) { if ($special{$package} =~ s/^die //) { # avoid repeating the die message. die "$package failed: $special{$package}\n"; } else { print "special: $special{$package}...\n"; eval $special{$package}; die "$package failed in $special{$package}:\n $@" if $@; } } else { &donormal; } &xchdir ($RAW_DIR); } # Override our default guess of "latex" if we can intuit from the CTAN # path, which ctan2tl kindly passes us. # sub set_dir_defaults { my ($ctan_dir) = @_; my $guess = ""; if ($ctan_dir =~ m!/tex-archive/biblio/bib!) { $standarddocfmt = $standardsourcefmt = "bibtex"; $guess = "$standarddocfmt for docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/fonts/!) { $standarddocfmt = $standardsourcefmt = "fonts"; $guess = "$standarddocfmt for docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/graphics/metapost/!) { $standarddocfmt = $standardsourcefmt = "metapost"; $guess = "$standarddocfmt for docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/macros/generic/!) { $standarddocfmt = $standardsourcefmt = $standardfmt = "generic"; $guess = "$standarddocfmt for fmt/docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/macros/luatex/generic/!) { $standarddocfmt = $standardsourcefmt = $standardfmt = "luatex"; $guess = "$standarddocfmt for fmt/docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/macros/luatex/latex/!) { $standarddocfmt = $standardsourcefmt = $standardfmt = "lualatex"; $guess = "$standarddocfmt for fmt/docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/macros/plain/!) { $standarddocfmt = $standardsourcefmt = $standardfmt = "plain"; $guess = "$standarddocfmt for fmt/docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/macros/xetex/latex/!) { $standarddocfmt = $standardsourcefmt = $standardfmt = "xelatex"; $guess = "$standarddocfmt for fmt/docfmt/srcfmt"; } elsif ($ctan_dir =~ m!/tex-archive/support/!) { $standarddocfmt = $standardsourcefmt = "support"; $guess = "$standarddocfmt for docfmt/srcfmt"; } print "\t guessed $guess (based on $ctan_dir)\n" if $guess; } sub xchdir { my ($dir) = @_; chdir ($dir) || die "chdir($dir) failed: $!"; my $pwd = getcwd (); print "\t CHDIR $dir (now $pwd)\n"; } sub xmkdir { my (@dirs) = @_; &SYSTEM ("mkdir -p @dirs"); } # run a shell command. # sub SYSTEM { my ($job) = @_; if ($opt_test) { print "\t SYSTEM $job\n"; } else { print "\t SYSTEM $job\n" if $opt_debug; system ($job); } } # copy man pages from runtime to new stage directory, # so they won't appear to be deleted. # sub preserve_man_pages { my ($pkg) = @_; my $mandest = "$TOPDEST/texmf/doc/man/man1"; &xmkdir ($mandest); &SYSTEM ("$CP $Master/texmf/doc/man/man1/$pkg.* $mandest/"); } # some packages need to intervene at the beginning. sub run_prehook { my $prehook = $prehook{$package}; if ($prehook) { print "\t PREHOOK: running $prehook\n"; eval $prehook; die "$package failed in $prehook: $@" if $@; } } # some packages (e.g., vntex) are tl-ready (or near enough). # sub MAKEcopy { my $dest = $_[0] || $DEST; my $pdir = $packagedir; chomp (my $abspackagedir = `cd $pdir && pwd`); print "\t COPY from $abspackagedir to $dest\n"; &xchdir ($pdir); &SYSTEM ("mkdir -p $dest"); # do the copy. &SYSTEM ("$CP -r * $dest"); my $docdir = "$dest/doc/$whichdocformat/$package/"; &xmkdir ($docdir); # for arev et al., remove symlinks. &SYSTEM ("find $dest -type l | xargs --no-run-if-empty rm"); # ditto assorted other for lm (files are in doc subtree already). -r "$dest/MANIFEST.txt" && &SYSTEM ("cd $dest && $RM GUST*.txt MANIFEST.txt README.eng"); # move README for encxvlna and others -r "$dest/README" && &SYSTEM ("$MV $dest/README $docdir/"); # move manifest.txt for droid -r "$dest/manifest.txt" && &SYSTEM ("$MV $dest/manifest.txt $docdir/"); # move CHANGELOG for stellenbosch. -r "$dest/CHANGELOG" && &SYSTEM ("$MV $dest/CHANGELOG $docdir/"); # move README.eulervm for eulervm. -r "$dest/README.eulervm" && &SYSTEM ("$MV $dest/README.eulervm $docdir/"); # for tex-gyre, rename context subdir. (shouldn't be needed next time.) if (-d "$dest/fonts/map/pdftex/context") { print "$package: rename context map dir.\n"; &SYSTEM ("$MV $dest/fonts/map/pdftex/context $dest/fonts/map/pdftex/tex-gyre"); } # for velthuis, remove bin dir (with warning). if ($package eq "velthuis" && -d "$dest/bin") { warn "WARNING: removing bin/ dir in $dest\n"; warn " -- YOU must deal with it!\n"; &SYSTEM ("rm -rf $dest/bin"); } # preserve the lm sources. if ($package eq "lm") { my $srcdir = "$dest/source/fonts/$package/"; &SYSTEM ("mkdir -p $srcdir"); &SYSTEM ("$MV $dest/lm*mt1.zip $srcdir/"); } &xchdir ($DEST); &killfiles ($specialclean{$package} || $standardclean); &killfiles ($moreclean{$package}, "more") if $moreclean{$package}; &do_posthook (); } sub do_posthook { my $posthook = $posthook{$package}; if ($posthook) { print "\t POSTHOOK: running $posthook\n"; eval ($posthook); die "$package failed in $posthook: $@" if $@; } } # # For most packages, this is the first thing called. It copies # everything from $packagedir to the doc directory of the package. # sub setup { my ($ctl) = @_; print "doing setup($ctl)...\n"; # precreate the directories we might need $DOCDIR = "$DEST/doc/$whichdocformat/$package"; &SYSTEM ("mkdir -p $DOCDIR"); &SYSTEM ("mkdir -p $DEST/tex/$whichformat/$package"); &SYSTEM ("mkdir -p $DEST/source/$whichdocformat/$package"); # remove README symlinks. &SYSTEM ("test -h $packagedir/README && $RM $packagedir/README"); return if $ctl eq "nocopytodoc"; # copy everything to the doc directory # and work in there. &SYSTEM ("$CP -r $packagedir/* $DEST/doc/$whichdocformat/$package"); } sub donormal { my ($ctrl) = @_; print "doing donormal($ctrl) with DEST=$DEST\n"; # check for tds-ready packages if (-e "$RAW_DIR/$packagedir/TDS_READY") { print "using TDS_READY tree\n"; &SYSTEM ("$RM $RAW_DIR/$packagedir/TDS_READY"); &SYSTEM ("mkdir -p $DEST"); &xchdir ($DEST); &SYSTEM ("$CP -r $RAW_DIR/$packagedir/* ."); my $scriptdir = "$DEST/scripts/$package"; if (-d $scriptdir) { &xchdir ($scriptdir); &doscripts; } my @docdirs = glob ("doc/*/*/"); if ($moreclean{$package} && @docdirs) { &xchdir ($docdirs[0]); &killfiles ($moreclean{$package}, "more"); } } else { #use the normal procedure &setup unless $ctrl eq "nosetup"; &xchdir ("$DEST/doc/$whichdocformat/$package"); &run_prehook ($package) unless $ctrl eq "nosetup"; &buildfilelist; # run the .ins files (if any) supplied $inspatt = $specialins{$package} || $standardins; $Foundry = $specialfoundry{$package} || $standardfoundry; &runins($inspatt); &killfiles ($moreclean{$package}, "more") if $moreclean{$package}; # rebuild the list of files in the directory &buildfilelist; if ($Foundry eq "metafont") { &dosimplemf; } else { &domf; } &dodvi; # rebuild again, as we have .dvi files now &buildfilelist; &dobst; &domp; &dobib; &doxmt; &dotex; &runfonts; &domakeindex; &doomega; &dosource; &dotype1; &doscripts; &doinfos; &domans; # remove empty directories that we never used. &SYSTEM ("rmdir $DEST/*/$whichformat/$package 2>/dev/null"); &killfiles ($specialclean{$package} || $standardclean); } # do the postaction in any case (we need to adapt some tds zips). &do_posthook (); } sub runins { my ($thispatt) = @_; print "\t RUNINS $thispatt\n"; for (grep (/$thispatt/, @filenames)) { # do not infinite loop on docstrip "output directory", e.g., fltpoint. &runjob ("yes | sed 10q | $insrunner $_"); } &killfiles ($specialclean{$package} || $standardclean); } sub install { my ($destdir,$thispatt) = @_; return unless $thispatt; my @files = grep (/$thispatt/, @filenames); # ugh, @filenames global return unless @files; # avoid lots of useless output print "\t INSTALL $thispatt to $destdir\n"; &xmkdir ($destdir) unless -d $destdir; for my $file (@files) { next if $file eq "dtx-style.sty"; # this should never be in runtime &SYSTEM ("$MV $file $destdir"); } } # build the documentation files (we don't any more). # sub dodvi { # packages which are doc themselves rarely rebuild cleanly, # and aren't worth it. $dvipatt = $specialdvi{$package} || $standarddvi; unless ( "$dvipatt" eq "$standarddvi" ) { warn "$0: Building doc: shouldn't need to do that. Please check."; &rundvi ($dvipatt); } } # move the runtime files sub dotex { my $texpatt = $specialtex{$package} || $standardtex; &install("$DEST/tex/$whichformat/$package", $texpatt); } # move the makeindex runtime files sub domakeindex { $makeindexpatt = $specialmakeindex{$package}; if ($makeindexpatt eq "") { $makeindexpatt=$standardmakeindex; } &install("$DEST/makeindex/$package",$makeindexpatt); } # BibTeX style files: sub dobst { $csfpatt = $specialcsf{$package}; if ($csfpatt eq "") { $csfpatt=$standardcsf; } &install("$DEST/bibtex/csf/$package",$csfpatt); $bstpatt = $specialbst{$package}; if ($bstpatt eq "") { $bstpatt=$standardbst; } &install("$DEST/bibtex/bst/$package",$bstpatt); } # simple MF files, e.g., if specialfoundry eq "metafont". sub dosimplemf { my $mfpatt = $specialmf{$package} || $standardmf; &install ("$DEST/metafont/$package", $mfpatt); } # MetaPost files: sub domp { $mppatt = $specialmp{$package} || $standardmp; &install("$DEST/metapost/$package", $mppatt); } # BibTeX bibliography files: sub dobib { $bibpatt = $specialbib{$package} || $standardbib; &install("$DEST/bibtex/bib/$package", $bibpatt); } # source files: sub dosource { $sourceformat = $specialsourcefmt{$package} || $standardsourcefmt; # default to using specialdocfmt, as we do in setup? $sourcepatt = $specialsource{$package} || $standardsource; &install("$DEST/source/$sourceformat/$package", $sourcepatt); } sub doomega { $ovfpatt = $specialovf{$package}; if ($ovfpatt eq "") { $ovfpatt=$standardovf; } &install("$DEST/fonts/ovf/public/$package",$ovfpatt); $ofmpatt = $specialofm{$package}; if ($ofmpatt eq "") { $ofmpatt=$standardofm; } &install("$DEST/fonts/ofm/public/$package",$ofmpatt); $ovppatt = $specialovp{$package}; if ($ovppatt eq "") { $ovppatt=$standardovp; } &install("$DEST/fonts/ovp/public/$package",$ovppatt); $otppatt = $specialotp{$package}; if ($otppatt eq "") { $otppatt=$standardotp; } &install("$DEST/omega/otp/$package",$otppatt); $ocppatt = $specialocp{$package}; if ($ocppatt eq "") { $ocppatt=$standardocp; } &install("$DEST/omega/ocp/$package",$ocppatt); } # the dvips and font mapping files: sub dotype1{ my $encpatt = $specialenc{$package} || $standardenc; &install("$DEST/fonts/enc/dvips/$package", $encpatt); my $mappatt = $specialmap{$package} || $standardmap; my $mapdest = $specialmapdest{$package} || $standardmapdest; &install ("$DEST/$mapdest/$package", $mappatt); my $vmappatt = $specialvmap{$package} || $standardvmap; &install("$DEST/fonts/map/vtex/$package", $vmappatt); my $propatt = $specialpro{$package} || $standardpro; &install("$DEST/dvips/$package", $propatt); my $foundry = $specialfoundry{$package} || $standardfoundry; my $pfbpatt = $specialpfb{$package} || $standardpfb; &install("$DEST/fonts/type1/$foundry/$package", $pfbpatt); my $afmpatt = $specialafm{$package} || $standardafm; &install("$DEST/fonts/afm/$foundry/$package", $afmpatt); my $pfmpatt = $specialpfm{$package} || $standardpfm; &install("$DEST/fonts/type1/$foundry/$package", $pfmpatt); my $otfpatt = $specialotf{$package} || $standardotf; &install("$DEST/fonts/opentype/$foundry/$package", $otfpatt); my $ttfpatt = $specialttf{$package} || $standardttf; &install("$DEST/fonts/truetype/$foundry/$package", $ttfpatt); my $sfdpatt = $specialsfd{$package} || $standardsfd; &install("$DEST/fonts/sfd/$package", $sfdpatt); } # scripts. Make them executable even if it isn't always necessary. # Build/source/tex/texlive/linked_scripts/Makefile.am installs symlinks # in the bin directories where needed. That Makefile is independently # maintained, needs to be updated by hand when new user-visible scripts # are added. We do add/update the script itself under linked_scripts. # We also make the symlinks/w32-wrapper-copy in Master/bin. # sub doscripts { my $pwd = getcwd(); # first do the ones that don't go in the bindirs. my $scriptpatt = $specialscripts_nobin{$package}; if ($scriptpatt) { if ($pwd ne "$DEST/scripts/$package") { # in the .tds.zip case, we will already be in the scripts dir. &install ("$DEST/scripts/$package", $scriptpatt); &SYSTEM ("chmod a+x $DEST/scripts/$package/*"); } } # now the user-visible bindir entries. Duplicating above, sorry. $scriptpatt = $specialscripts_bin{$package}; return unless $scriptpatt; if ($pwd ne "$DEST/scripts/$package") { # in the .tds.zip case, we will already be in the scripts dir. &install ("$DEST/scripts/$package", $scriptpatt); &SYSTEM ("chmod a+x $DEST/scripts/$package/*"); } # update the copy in Build, too. my $build_tldir = "texk/texlive"; my $build_scriptsdir = "$build_tldir/linked_scripts"; my $builddir = "$BUILDDEST/$build_scriptsdir/$package"; &xmkdir ($builddir); &SYSTEM ("$CP $DEST/scripts/$package/* $builddir/"); # List of scripts we're installing. chomp (my @scripts = `cd $builddir && ls`); # For each, give a warning if missing from the Makefile.am in the sources. # Also, if not already present, create the platform-specific bindir entries. # my $scripts_Makefile = "$Build/$build_scriptsdir/Makefile.in"; chomp (my @platforms = `cd $Master/bin && ls`); # for my $s (@scripts) { system ("grep $package/$s $scripts_Makefile >&/dev/null"); if ($? != 0) { print "*** $package/$s not in $scripts_Makefile\n"; } (my $linkname = $s) =~ s/\..*$//; for my $p (@platforms) { my $platdir = "$TOPDEST/bin/$p"; &xmkdir ($platdir); if ($p ne "win32") { my $linktarget = "../../$DEST_TREE/scripts/$package/$s"; &SYSTEM ("ln -s $linktarget $platdir/$linkname"); &SYSTEM ("ln -s $linkname $platdir/r$linkname") if $linkname eq "pdfcrop"; # rpdfcrop -> pdfcrop } else { # Windows. If a shell script, skip. Else copy the wrapper. next if $s =~ /\.sh$/; my $w32_wrapper = "$Build/$build_tldir/w32_wrapper/runscript.exe"; &SYSTEM ("$CP $w32_wrapper $platdir/$linkname.exe"); &SYSTEM ("$CP $w32_wrapper $platdir/r$linkname.exe") if $linkname eq "pdfcrop"; # rpdfcrop.exe } } } } # info files. We put these in texmf/doc/info, which is where we keep # the info files for the programs, too. Having an info dir in # texmf-dist also would imply lots of changes in the installer, and # there seems to be no gain. # sub doinfos { my $infopatt = $specialinfos{$package}; return unless $infopatt; &install ("$TOPDEST/texmf/doc/info/", $infopatt); } # xmltex files sub doxmt { my $xmtpatt = $specialxmt{$package} || $standardxmt; &install ("$DEST/tex/xmltex/$package", $xmtpatt); } # build the font files sub domf { $mfpatt = $specialmf{$package} || $standardmf; &runmf ($mfpatt); my $mfdir = "$DEST/fonts/source/$Foundry/$package"; # # don't use $mfpatt since that's only the tfm-able mf files; just # install all the .mf files. my $mf_inst_patt = $specialmfinstall{$package} || $standardmfinstall; &install ($mfdir, $mf_inst_patt); } # man pages. We put these in texmf/doc/man/man1, a la info (see above). # sub domans { my $manpatt = $specialmans{$package}; return unless $manpatt; &install ("$TOPDEST/texmf/doc/man/man1/", $manpatt); &tl_man_to_pdf (); # make pdfs for them } # When a package has man pages, we want to update the pdf versions of # them that we distribute using our Makefile setup, so that they are # all consistent. So we copy over our Makefiles, run make, and then # remove them. # sub tl_man_to_pdf { my $Master_man = "$Master/texmf/doc/man"; my $pkg_man = "$TOPDEST/texmf/doc/man"; print "tl_man_to_pdf for: " . join (" ", <$pkg_man/man1/*>) . "\n"; &SYSTEM ("cd $Master_man && $CP --parents Makefile man1/Makefile $pkg_man/"); # Extra complication: we don't want to rebuild everything, only those # that have changed. Therefore, also copy in the pdfs for the package # being updated from the Master man dir. for my $man (<$pkg_man/man1/*>) { if ($man =~ /\.man$/) { # rename from .man to .1 (my $man1 = $man) =~ s/\.man$/\.1/; &SYSTEM ("$MV $man $man1"); $man = $man1; } (my $pdf_man = $man) =~ s,^.*/,,; # just foo.1, no directories $pdf_man =~ s/1$/man1.pdf/; # foo.1 -> foo.man1.pdf # my $Master_pdf_man = "$Master_man/man1/$pdf_man"; if (-r $Master_pdf_man) { &SYSTEM ("$CP $Master_pdf_man $pkg_man/man1/"); # copy existing } } &SYSTEM ("cd $pkg_man && make DIR=man1"); # build new pdfs &SYSTEM ("cd $pkg_man && $RM Makefile man1/Makefile"); # rm Makefiles } sub rundvi { local($thispatt) = @_; $TEX = $specialTEX{$package}; if ($TEX eq "") { if ($whichformat eq 'latex') { $TEX="pdflatex"; } else { $TEX=$whichformat; } } if ($TEX eq "generic") { $TEX="pdflatex"; } print "\t MAKEDVI $thispatt using $TEX (@filenames)\n"; for (grep(/$thispatt/,@filenames)) { ($FileBase,$Filepath,$Filesuffix) = fileparse($_,"\.[A-z]*"); print "found $FileBase\n"; if (-r "$FileBase.drv" && $Filesuffix eq ".dtx" ) { $Filesuffix=".drv" ; } print "\t DOC: run $TEX on $FileBase$Filesuffix\n"; open(TMP,">$FileBase.aux"); close(TMP); &runjob("TEXMFLOCAL=. $TEX '\\nonstopmode\\input $FileBase$Filesuffix'"); &runjob("bibtex $FileBase"); &runjob("TEXMFLOCAL=. $TEX '\\nonstopmode\\input $FileBase$Filesuffix'"); if ($Filesuffix eq ".drv" || $Filesuffix eq ".dtx" ) { &runjob("$CP $RAW_DIR/gind.ist ."); &runjob("makeindex -s gind.ist $FileBase"); unlink "gind.ist"; } else { &runjob("makeindex $FileBase"); } &runjob("$TEX '\\nonstopmode\\input $FileBase$Filesuffix'"); } print "\t MAKEDVI done\n"; } # run a &SYSTEM job, and append stderr output to log file # sub runjob { my ($job) = @_; my $status = 0; if ($opt_test) { print "WOULDRUNJOB $job\n"; } else { my $Jobid = "_$$"; &SYSTEM ("$job >$Jobid.log 2>&1"); $status = $?; local *TMP; open (TMP, "$Jobid.log") || die "open($Jobid.log) failed: $!"; my @output = (); if ($job =~ /^mktextfm/) { print $output[$#output-1]; # successfully generated line $status = 0; # do not worry if the bitmap failed, e.g., grtt10.mf. } else { print `cat $Jobid.log`; } close (TMP); system ("$RM -f /tmp/$Jobid.log; mv $Jobid.log /tmp/"); # save last log die "goodbye, exit status $status for $job\n" if $status != 0; } return $status; } # remove all files matching something in $KILLPATT. # also remove .ps files for which we have a .pdf. # if MORE is true, remove additional files matching something in # $moreclean and create a README.TEXLIVE which lists the removed files. # # As a kludge created for rangen, if KILLPATT starts with a directory # path (e.g., doc/), we cd to that directory before globbing (and cd # back at the end). # # (Switching all the kill patterns to globs, so we could just use the # glob function, seemed too ugly. And removing the file in a posthook # would have meant a separate fn for README.TEXLIVE, also ugly.) # sub killfiles { my ($killpatt,$more) = @_; print "killfiles($killpatt,$more)\n"; return unless $killpatt; # cd to a leading directory name in KILLPATT. my $origdir = ""; if ($killpatt =~ m,^(.*)/,,) { $origdir = getcwd (); &xchdir ($1); $killpatt =~ s,^$1/,,; } local *DOT; opendir (DOT, ".") || die "opendir(.) failed: $! in " . `pwd`; my @delfiles = (); for (grep (/$killpatt/, readdir (DOT))) { if (unlink ($_)) { print "\t Removing $_\n"; push (@delfiles, $_); } else { warn "unlink($_) failed: $!"; } } for (grep (/\.ps$/, @filenames)) { (my $pdf = $_) =~ s/ps$/pdf/; next unless grep (/$pdf/, @filenames); print "\t Removing ps $_ (since have $pdf)\n"; unlink ($_) && push (@delfiles, $_); } if ($more && @delfiles) { # get package url on CTAN my $ctan_url = '.'; chomp (my $ctan_root = `tlpkginfo --ctan-root`); chomp (my $ctan_dir = `tlpkginfo --ctan-dir $packagedir`); if (not $?) { $ctan_dir =~ s!$ctan_root/!!; $ctan_url = " at\n\thttp://mirror.ctan.org/$ctan_dir"; } # create/update README.TEXLIVE. open (RTL, ">README.TEXLIVE") || warn "open(>README.TEXLIVE) failed: $!"; print RTL <<"EOF"; The following files have been removed in the TeX Live installation of the current package, typically due to duplication, lack of space, or missing source code. You can find these files on CTAN$ctan_url If questions or concerns, email tex-live\@tug.org. EOF foreach my $f (@delfiles) { print RTL "\t$f\n"; } close RTL; } # if we cd'd, cd back. &xchdir ($origdir) if $origdir; &buildfilelist(); } # rebuild list of input files, e.g., after flattening sub buildfilelist { print "doing buildfilelist()...\n"; opendir (DIR ,'.') || die "opendir(.) failed: $!"; @filenames = grep (!/^\.\.?$/, readdir (DIR)); closedir (DIR); } sub runmf { my ($mfpatt) = @_; print "\t doing runmf for $package ($mfpatt)\n"; for my $file (grep (/$mfpatt/, @filenames)) { ($FileBase,$Filepath,$Filesuffix) = fileparse ($file, "\.[A-z]*"); if (! -e "$FileBase.tfm") { print "\t\t Make TFM from $file\n"; &runjob ("mktextfm --destdir=`pwd` $FileBase.tfm"); &SYSTEM ("$RM *pk"); # not worth the space } } } sub runfonts { $Foundry = $specialfoundry{$package} || $standardfoundry; for (grep(/\.vf$/, @filenames)) { $needdir=1; print "\t\t install VF $_\n"; ($FileBase,$Filepath,$Filesuffix) = fileparse($_,"\.[A-z]*"); if ($needdir) { &SYSTEM("mkdir -p $DEST/fonts/vf/$Foundry/$package"); $needdir=0; } &SYSTEM("$MV $FileBase.vf $DEST/fonts/vf/$Foundry/$package "); } for (grep(/.tfm/,@filenames)) { $needdir=1; print "\t\t INSTALL tfm $_\n"; ($FileBase,$Filepath,$Filesuffix) = fileparse($_,"\.[A-z]*"); if ($needdir) { &SYSTEM("mkdir -p $DEST/fonts/tfm/$Foundry/$package"); $needdir=0; } &SYSTEM("$MV $FileBase.tfm $DEST/fonts/tfm/$Foundry/$package"); } } sub MAKEflatten { # don't to this in a tds-ready tree... -e "$RAW_DIR/$packagedir/TDS_READY" && die "$0: using MAKEflatten with TDS_READY tree $RAW_DIR/$packagedir.\n"; &setup; &xchdir ("$DEST/doc/$whichdocformat/$package"); print "\t SPECIAL flatten $package\n"; # cm-super et al. need to intervene at this point. &run_prehook ($package); # I don't think flattened packages ever want symlinks. &SYSTEM ("find . -type l | xargs --no-run-if-empty $RM"); # mv foo/README to README.foo. README.txt is for psfragx. # LISEZ-MOI is for bclogo. # Obviously should be generalized to non-README files. my $findcmd = "find . -mindepth 2 '(' " . "-name README -o -name README.txt -o -name LISEZ-MOI ')'"; &SYSTEM ("for r in `$findcmd`; do" . ' mv $r $r.`basename \`dirname $r\``; done'); # move all non-directories to top level, but don't accidentally # overwrite one with another. &SYSTEM ("yes n | find . -mindepth 2 -not -type d -exec mv -i '\{\}' . \\;"); # remove newly empty directories. &SYSTEM ("find -depth -type d -print | xargs rmdir 2>/dev/null"); # do the usual. &buildfilelist; &donormal ("nosetup"); } sub MAKEunzipandflatten { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("unzip -q -o -a $package.zip; rm $package.zip"); &SYSTEM("$MV */*/*/*/* .; rmdir */*/*/*"); &SYSTEM("$MV */*/*/* .; rmdir */*/*"); &SYSTEM("$MV */*/*/* .; rmdir */*/*"); &SYSTEM("$MV */*/* .; rmdir */*"); &SYSTEM("$MV */*/* .; rmdir */*"); &SYSTEM("$MV */* .; rmdir *"); &buildfilelist; &donormal; } sub MAKEnosymlinks { &setup; &xchdir ("$DEST/doc/$whichdocformat/$package"); print "\t SPECIAL nosymlinks $package\n"; &SYSTEM ("find . -type l | xargs --no-run-if-empty rm"); &buildfilelist; &donormal ("nosetup"); } # do some stuff for simple packages with hyphenation files, like # cbcoptic and ibycus-babel. The arguments are: # LANGNAME - full language name, like "coptic" (first arg of .dat line) # LANGABBREV - abbreviated language name, like "cop" (in .dat filename) # HYPHFILE - hyphenation .tex file name, like "copthyph.tex" # # General procedure is: # # create: tlpkg/tlpsrc/hyphen-language.tlpsrc # (must be done by hand) # create: texmf/tex/generic/config/language.ll.dat # (done here, unless it already exists) # install pattern file from ctan: texmf/tex/generic/hyphen/langhyph.tex # (done here) # add in: tlpkg/tlpsrc/collection-langwhatever.tlpsrc # (must be done by hand) # sub GENMAKEhyphenation { my ($langname,$langabbrev,$hyphfile) = @_; &setup; &buildfilelist; &donormal; print "\t SPECIAL $package: install $hyphfile\n"; my $generichyphdir = "$TOPDEST/texmf/tex/generic/hyphen"; &SYSTEM("mkdir -p $generichyphdir"); &SYSTEM("$MV $hyphfile $generichyphdir"); my $genericconfigdir = "$TOPDEST/texmf/tex/generic/config"; my $configfile = "$genericconfigdir/language.$langabbrev.dat"; if (! -r $configfile) { print "\t SPECIAL $package: create $configfile\n"; &SYSTEM("mkdir -p $genericconfigdir"); &SYSTEM("echo $langname $hyphfile >$configfile"); } print "YOU-MUST-DO! $package: create hyphen-$langname.tlpsrc\n"; print "YOU-MUST-DO! $package: add to collection-langwhatever.tpm\n"; } sub MAKEcbcoptic { &GENMAKEhyphenation ("coptic", "cop", "copthyph.tex"); } sub MAKEibycusbabel { &GENMAKEhyphenation ("ibycus", "iby", "ibyhyph.tex"); } # since existing mongolian is written in a different encoding, # seems best to keep both? sub MAKEmnhyphn { &GENMAKEhyphenation ("mongolian2a", "mn2a", "mnhyphn.tex"); } # we don't want a package named nohyph. Hmm. #sub MAKEnohyph #{ # &GENMAKEhyphenation ("norsk", "no", "nohyphbx.tex"); # &GENMAKEhyphenation ("nynorsk", "no", "nnhyph.tex"); # &GENMAKEhyphenation ("bokmal", "no", "nbhyph.tex"); #} sub MAKEaqcm { print "\t SPECIAL $package"; # sort of flatten, but not completely (keep the 'examples' subdir) &xchdir($packagedir); &SYSTEM('mv latex/* . && rmdir latex'); &SYSTEM('mv doc/README README.doc'); &SYSTEM('mv doc/* . && rmdir doc'); # now do the normal thing &xchdir($RAW_DIR); &donormal(); } sub MAKEarabi { &xchdir ("$packagedir/arabi/texmf"); # author will remove these next time # print "\t SPECIAL $package - removing microsoft and nonfree\n"; &SYSTEM('find -name microsoft -o -name nonfree | xargs rm -rf'); # print "\t SPECIAL $package - rearranging for tds\n"; &SYSTEM ("mkdir -p tex; mv latex tex"); &SYSTEM ("$RM tex/latex/arabi/updmap.cfg"); &SYSTEM ("$MV tex/latex/arabi/bblopts.cfg doc/latex/arabi"); &SYSTEM ("rm -rf dvips"); # print "\t SPECIAL $package - copying to $DEST\n"; &SYSTEM ("mkdir -p $DEST"); &SYSTEM ("$CP -r * $DEST/"); } sub MAKEarabtex { &xchdir ($packagedir); # print "\t SPECIAL $package: removing top-level links\n"; &SYSTEM('for f in apatch.sty arabtex.tex hebtex.tex hepatch.sty; do test -h $f && rm -v $f; done'); # print "\t SPECIAL $package: removing top-level tgz's\n"; &SYSTEM('for f in *.tgz; do rm -v $f; done'); # print "\t SPECIAL $package: removing bitmap fonts\n"; &SYSTEM("rm -rf laser.pk"); # print "\t SPECIAL $package: renaming arabtex.htm\n"; &SYSTEM('mv doc/html/arabtex.htm arabtex1.htm'); &SYSTEM('mv doc/txt/arabtex.htm arabtex2.htm'); # print "\t SPECIAL $package: flatten\n"; &xchdir (".."); &MAKEflatten (); # print "\t SPECIAL $package: removing redundant files\n"; &SYSTEM("rm -rf doc texinput"); } sub MAKEarphic { # tds-ready tarballs with a top-level dir name. copy all into new/. &SYSTEM ("mkdir -p new"); for my $tar (<*.tar.*>) { (my $tarbase = $tar) =~ s/\.tar.*//; &SYSTEM ("tar xf $tar " . "&& (cd $tarbase && cp -arf * ../new)" . "&& rm -rf $tar $tarbase"); } # move everything from new to the top level. &SYSTEM ("mv new/* . && rmdir new"); # # move docs to subdir. &SYSTEM ("mv arphic-sampler* doc/fonts/arphic"); # # copy to dest. &xchdir (".."); &MAKEcopy (); } sub MAKEaurical { &xchdir ($packagedir); # # basically have a tds hier to unzip, with some cleanups. &SYSTEM ("unzip -q aurical_texmf.zip"); &SYSTEM ("mkdir -p fonts/source/public/aurical/"); &SYSTEM ("$MV $DEST/README doc/latex/aurical/"); &SYSTEM ("$MV aurical_source.zip fonts/source/public/aurical/"); &SYSTEM ("$RM aurical.pdf aurical_texmf.zip"); # &xchdir (".."); &MAKEcopy (); } sub MAKEeskdx { &setup; &xchdir ("$DEST/doc/$whichdocformat/$package"); print "\t SPECIAL $package: flatten unpacked/ dir (only)\n"; &SYSTEM ("$MV unpacked/Makefile Makefile.unpacked"); &SYSTEM ("$MV unpacked/* ."); &SYSTEM ("rmdir unpacked"); &buildfilelist; &donormal; } sub MAKElh { &setup (); &xchdir ($DOCDIR); # # basically have several tds hiers to unzip, with some cleanups. print "\t SPECIAL $package: unzip etc.\n"; for my $zip (<*.zip>) { &SYSTEM ("cd $DEST && unzip -q -o $DOCDIR/$zip; $RM $DOCDIR/$zip"); } # they had wrong texmf level in zip; can't mv since dirs exist &SYSTEM ("cd $DEST/texmf && cp -arf . .. && rm -rf $DEST/texmf"); } sub MAKEmathdesign { &setup (); &xchdir ($DOCDIR); # # basically have several tds hiers to unzip, with some cleanups. print "\t SPECIAL $package: unzip etc.\n"; for my $zip (<*.zip>) { &SYSTEM ("cd $DEST && unzip -q -o $DOCDIR/$zip; $RM $DOCDIR/$zip"); } &SYSTEM ("rm -rf commercialfonts"); &SYSTEM ("mv $DEST/dvips/config $DEST/dvips/mathdesign"); } sub MAKEmetauml { &setup; &xchdir ("$DEST/doc/$whichdocformat/$package"); &SYSTEM ("$MV doc/* examples/* inputs/* ."); &SYSTEM ("rmdir doc examples inputs"); &buildfilelist; &donormal; } sub MAKEfp { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &runjob("mkdir -p $DEST/tex/plain/fp; $CP fp.tex $DEST/tex/plain/fp"); &donormal; } sub MAKEgermbib { &xchdir ($packagedir); # print "\t SPECIAL $package remove symlinks\n"; &SYSTEM ("find . -type l | xargs --no-run-if-empty rm"); # # we can't conflict with standard apalike.sty. print "\t SPECIAL $package rename second apalike.sty\n"; &SYSTEM ("$MV styles/apalike.sty styles/apalike.germbib_sty"); # &xchdir (".."); &MAKEflatten (); } sub MAKEgnu_freefont { &xchdir ($packagedir); # two tarballs and one zip file with a common top-level dir name. # do the zip first to avoid overwrite questions. &SYSTEM ("unzip -q *.zip && rm *.zip"); for my $tar (<*.tar.*>) { &SYSTEM ("tar xf $tar && rm -rf $tar"); } # move everything out of the subdir to the doc dir, # to get ready for setup. my $docdir = "$DEST/doc/$whichdocformat/$package"; &SYSTEM ("mkdir -p $docdir/"); &SYSTEM ("$MV freefont-*/* $docdir/ && rmdir freefont-*"); # &donormal ("nosetup"); } sub MAKExkeyval { # needs files in both latex and generic. &MAKEflatten (); print "\t SPECIAL $package moving .tex\n"; my $generic = "$DEST/tex/generic/$package/"; &SYSTEM ("mkdir -p $generic; mv *.tex $generic"); } sub MAKExymtex { &setup; chdir("$DEST/doc/latex/$package"); &SYSTEM("$MV doc200/* ."); &SYSTEM("rmdir doc"); &buildfilelist; &donormal; } sub MAKEnewsletr { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM ("$MV newsletr.tex $DEST/tex/$whichformat/$package"); &SYSTEM ("$RM *.dvi"); } sub MAKEnotes { &setup; &xchdir ($DOCDIR); &SYSTEM ("make eps png pdf"); &donormal; } sub MAKEpbdiagram { &setup; chdir("$DEST/doc/latex/$package"); &SYSTEM("rm -rf mf tfm"); &buildfilelist; &donormal; } # copy seminar files. sub MAKEseminar { &SYSTEM("mkdir -p $DEST/tex/latex/$package"); &SYSTEM("$CP $packagedir/inputs/* $DEST/tex/latex/$package"); # &SYSTEM("mkdir -p $DEST/source/latex/$package"); &SYSTEM("$CP $packagedir/src/* $DEST/doc/latex/$package"); # &SYSTEM("mkdir -p $DEST/doc/latex/$package"); &SYSTEM("$CP $packagedir/*read* $packagedir/doc/* $DEST/doc/latex/$package"); } sub MAKExypic { # Copy source files per INSTALL instructions. &xchdir ($packagedir); my $Foundry = "public"; &SYSTEM ("mkdir -p $DEST/doc/generic/xypic"); &SYSTEM ("$CP [A-Z]* $DEST/doc/generic/xypic/"); &SYSTEM ("$CP doc/*.* $DEST/doc/generic/xypic"); &SYSTEM ("$CP -r support/ $DEST/doc/generic/xypic"); # copy dir as dir # &SYSTEM ("mkdir -p $DEST/tex/generic/xypic"); &SYSTEM ("$CP texinputs/* $DEST/tex/generic/xypic/"); # &SYSTEM ("mkdir -p $DEST/fonts/tfm/$Foundry/xypic"); &SYSTEM ("$CP texfonts/* $DEST/fonts/tfm/$Foundry/xypic/"); # &SYSTEM ("mkdir -p $DEST/fonts/afm/$Foundry/xypic"); &SYSTEM ("$CP afm/* $DEST/fonts/afm/$Foundry/xypic/"); # &SYSTEM ("mkdir -p $DEST/fonts/map/dvips/xypic"); &SYSTEM ("$CP map/* $DEST/fonts/map/dvips/xypic/"); # &SYSTEM ("mkdir -p $DEST/fonts/enc/dvips/xypic"); &SYSTEM ("$CP enc/* $DEST/fonts/enc/dvips/xypic/"); # &SYSTEM ("mkdir -p $DEST/fonts/source/$Foundry/xypic"); &SYSTEM ("$CP mfinputs/* $DEST/fonts/source/$Foundry/xypic/"); # &SYSTEM ("mkdir -p $DEST/fonts/type1/$Foundry/xypic"); &SYSTEM ("$CP type1/* $DEST/fonts/type1/$Foundry/xypic/"); &SYSTEM ("$CP pfm/* $DEST/fonts/type1/$Foundry/xypic/"); # &SYSTEM ("mkdir -p $DEST/dvips/xypic"); &SYSTEM ("$CP ps/* $DEST/dvips/xypic/"); } sub MAKEborceux { &setup; chdir("$DEST/doc/$whichdocformat/$package/user-guides"); &SYSTEM("$MV -f * $DEST/doc/$whichdocformat/$package"); chdir("$DEST/doc/$whichdocformat/$package/diagram"); &SYSTEM("$MV -f * $DEST/tex/$whichformat/$package"); } sub MAKEplqx { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("$MV tex/* ."); &SYSTEM("$MV doc/* ."); &SYSTEM("rmdir doc tex"); &buildfilelist; &donormal; } sub MAKEaugie { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("$MV dvips/* ."); &SYSTEM("$MV tfm/* ."); &SYSTEM("$MV afm/* ."); &SYSTEM("$MV doc/* ."); &SYSTEM("$MV vf/* ."); &SYSTEM("$MV tex/* ."); &SYSTEM("$MV type1/* ."); &SYSTEM("rmdir type1 tex vf afm dvips doc tfm"); &buildfilelist; &donormal; } sub MAKEae { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("$MV tfm/* ."); &SYSTEM("$MV vf/* ."); &SYSTEM("$MV src/* ."); &SYSTEM("$MV tex/* ."); &SYSTEM("rmdir tex vf src tfm"); &buildfilelist; &dosource; &dotex; &domakeindex; &runfonts; } sub MAKEdevanagr { &xchdir ($packagedir); # print "\t SPECIAL $package: renaming README files\n"; &SYSTEM('for f in *; do test -r $f/README && mv $f/README README.$f; done'); # print "\t SPECIAL $package: moving .c and .exe to /tmp\n"; &SYSTEM('mv bin/devnag.c bin/devnag.exe /tmp'); # print "\t SPECIAL $package: flatten\n"; &xchdir (".."); &MAKEflatten; print "YOU-MUST-DO! update /tmp/devnag.c and devnag.exe into Build\n"; } # We don't want to flatten the templates, only the source. # sub MAKEdisser { &setup; &xchdir ("$DEST/doc/$whichdocformat/$package"); print "\t SPECIAL $package\n"; &SYSTEM ("$MV -f src/* ."); &buildfilelist; &donormal ("nosetup"); } sub MAKEeasy { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("$MV doc/* $DEST/doc/$whichdocformat/$package"); &buildfilelist; &dotex; &domakeindex; &dosource; &killfiles ($moreclean{$package}, "more") if $moreclean{$package}; } sub MAKEfootnpag { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("$MV src/* ."); &buildfilelist; &dodvi; # rebuild again, as we have .dvi files now &buildfilelist; &dotex; &domakeindex; &dosource; } sub MAKEfeynmf { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("gunzip manual.ps"); &buildfilelist; &runins('feynmf.ins'); &buildfilelist; &dosimplemf; &dodvi; &buildfilelist; &domp; &dotex; &domakeindex; &dosource; killfiles($standardclean); } sub MAKEchangebar { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &buildfilelist; &donormal; } sub MAKEsiam { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &buildfilelist; &dodvi; &buildfilelist; &dobst; &dotex; &domakeindex; &dosource; &SYSTEM("mkdir -p $DEST/doc/plain/siam"); &SYSTEM("mkdir -p $DEST/doc/amstex/siam"); &SYSTEM("mkdir -p $DEST/tex/plain/siam"); &SYSTEM("mkdir -p $DEST/tex/plain/amstex"); &SYSTEM("$MV plain/*doc* $DEST/doc/plain/siam"); &SYSTEM("$MV plain/* $DEST/tex/plain/siam"); &SYSTEM("$MV amstex/*doc* $DEST/doc/amstex/siam"); &SYSTEM("$MV amstex/* $DEST/tex/amstex/siam"); killfiles($standardclean); } sub MAKEmisc { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &buildfilelist; &dotex; &domakeindex; killfiles($standardclean); } sub MAKEtamethebeast { my $destdir = "$DEST/doc/bibtex/$package"; &SYSTEM("mkdir -p $destdir"); &SYSTEM("$CP -r $packagedir/* $destdir"); } sub MAKEtexdraw { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &buildfilelist; &dotex; &domakeindex; &SYSTEM("mkdir -p $DEST/doc/generic/texdraw"); &SYSTEM("$MV manual/* $DEST/doc/generic/texdraw"); killfiles($standardclean); } sub MAKEexpressg { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &buildfilelist; $inspatt = $specialins{$package}; &buildfilelist; if ($inspatt eq "") { $inspatt=$standardins; } &runins($inspatt); &SYSTEM("mpost expeg.mp"); # rebuild the list of files in the directory &buildfilelist; &dodvi; # rebuild again, as we have .dvi files now &buildfilelist; &runfonts; &dobst; &dobib; &dotex; &domakeindex; &dosource; &dotype1; # # this is a bit weird, but its an easy way to remove # empty directories that we never used. # &SYSTEM("rmdir $DEST/tex/$whichformat/$package 2> /dev/null"); &SYSTEM("rmdir $DEST/doc/$whichdocformat/$package 2> /dev/null"); &SYSTEM("rmdir $DEST/source/$whichformat/$package 2> /dev/null"); killfiles($standardclean); } sub MAKEpslatex { &xchdir ($packagedir); $Foundry = $specialfoundry{$package} || $standardfoundry; # &runjob("mkdir -p $DEST/tex/latex/pslatex"); &runjob("$CP latex/* $DEST/tex/latex/pslatex"); # &runjob("mkdir -p $DEST/fonts/tfm/$Foundry/pslatex"); &runjob("$CP tfm/* $DEST/fonts/tfm/$Foundry/pslatex"); # &runjob("mkdir -p $DEST/fonts/vf/$Foundry/pslatex"); &runjob("$CP vf/* $DEST/fonts/vf/$Foundry/pslatex"); # &runjob("mkdir -p $DEST/fonts/map/dvips/pslatex"); &runjob("$CP dvips/* $DEST/fonts/map/dvips/pslatex"); # &runjob("mkdir -p $DEST/source/latex/pslatex"); &runjob("$CP -r fontinst $DEST/source/latex/pslatex"); &runjob("$CP -r shell $DEST/source/latex/pslatex"); } sub MAKEeco { # this simply copies source files chdir($packagedir) || die ("ERROR: cannot open directory"); &runjob("mkdir -p $DEST/fonts/tfm/$Foundry/eco"); &runjob("mkdir -p $DEST/fonts/vf/$Foundry/eco"); &runjob("mkdir -p $DEST/tex/latex/eco"); &runjob("mkdir -p $DEST/dvips/eco"); &runjob("mkdir -p $DEST/doc/latex/eco"); &runjob("$CP src/*sty $DEST/tex/latex/eco"); &runjob("$CP fd/* $DEST/tex/latex/eco"); &runjob("$CP tfm/* $DEST/fonts/tfm/$Foundry/eco"); &runjob("$CP vf/* $DEST/fonts/vf/$Foundry/eco"); &runjob("$CP -r src/*tex src/*x src/*sh $DEST/doc/latex/eco"); &runjob("$CP -r [A-Z]* $DEST/doc/latex/eco"); } sub MAKEelhyphen { &setup; &buildfilelist; &donormal; print "\t SPECIAL $package: lowercase names\n"; &SYSTEM('for f in GR*hyph*.tex; do mv $f `echo $f | tr A-Z a-z`; done'); print "\t SPECIAL $package: install gr*hyph.tex files\n"; my $generichyphdir = "$TOPDEST/texmf/tex/generic/hyphen"; &SYSTEM("mkdir -p $generichyphdir"); &SYSTEM("$MV gr*hyph*.tex $generichyphdir"); print "YOU-MUST-DO! $package: update texmf/tex/generic/config/language.gr.dat\n"; print "YOU-MUST-DO! $package: update texmf/tpm/hyphen-greek.tpm\n"; print "YOU-MUST-DO! $package: add to texmf/tpm/collection-langgreek.tpm\n"; } # all the lshort translations are pretty similar. sub MAKElshort { print "MAKElshort $package\n"; (my $lang = $package) =~ s,.*-,,; # lshort-english -> english my $destdir = "$DEST/doc/latex/$package"; &SYSTEM ("mkdir -p $destdir"); &SYSTEM ("$CP -r $packagedir/* $destdir"); # keep only the main pdf to save space. &SYSTEM ("cd $destdir && $RM lshort*.ps *lshort*.ps.*z* lshort*.dvi"); &SYSTEM ("cd $destdir && $RM *lshort*-a5.pdf lshort*-letter.pdf"); &SYSTEM ("cd $destdir && $RM lshort-*-book.zip"); # remove symlinks such as README. &SYSTEM ("cd $destdir && find -type l | xargs --no-run-if-empty rm"); } sub MAKEltt { # this simply copies source files chdir($packagedir) || die ("ERROR: cannot open directory"); &runjob("mkdir -p $DEST/doc/ltt"); &runjob("$CP * $DEST/doc/ltt"); } sub MAKEpstricks { # move the directories. &xchdir ($packagedir); &xmkdir ("$DEST/doc/generic"); # my $docdir = "$DEST/doc/generic/pstricks"; &SYSTEM ("$MV doc $docdir"); # # move multiple Changes files out of runtime. &runjob("$MV generic/Changes $docdir/Changes.generic"); &runjob("$MV latex/Changes $docdir/Changes.latex"); &runjob("$MV dvips/Changes $docdir/Changes.dvips"); # &xmkdir ("$DEST/dvips"); &SYSTEM ("$MV dvips $DEST/dvips/pstricks"); # &xmkdir ("$DEST/tex/generic"); &SYSTEM ("$MV generic $DEST/tex/generic/pstricks"); &SYSTEM ("$MV config $DEST/tex/generic/pstricks/"); # &xmkdir ("$DEST/tex/latex"); &SYSTEM ("$MV latex $DEST/tex/latex/pstricks"); } sub MAKEwilson { &setup; my $docdir = "$DEST/doc/$whichdocformat/$package"; &xchdir ($docdir); my $mapdir = "$DEST/fonts/map/dvips/$package"; -d $mapdir || &SYSTEM ("mkdir -p $mapdir"); &SYSTEM ("$MV *.map $mapdir"); # archaicprw.map opendir (DIR, '.') || die "opendir(.) failed: $!"; @dirnames = grep (!/^\.\.?$/, readdir (DIR)); closedir (DIR); for my $d (@dirnames) { if ($d =~ /\.zip$/) { unlink ("$docdir/$d"); next; } # phaistos and linearA are nothing to do with Wilson's archaic, but # are separate packages created by AS. if ($d =~ /^(phaistos|linearA)$/) { &SYSTEM ("rm -rf $d $docdir/$d"); next; } # tgothic filenames conflict with ptex fonts. next if $d eq "tgothic"; my $target = "$docdir/$d"; next if ! -d $target; # samples/readme files print "\t PROCESS Wilson subdir $d\n"; &xchdir ($target); for my $f (glob ("try*"), glob ("*.pdf"), "README") { next unless -f $f; # trysqrcaps.pdf matches both, can only mv once my $dest = "$docdir/"; $dest .= "$d-" if $f !~ /$d/; $dest .= $f; &runjob("$MV $f $dest"); } &buildfilelist; # run the .ins files (if any) supplied $inspatt = $specialins{$package} || $standardins; &runins($inspatt); unlink ("auncial.sty", "allauncl.sty"); # in auncial-new package &dodvi; &domf; &dodvi; # rebuild again, as we have .dvi files now &buildfilelist; &runfonts; unlink ("$DEST/fonts/tfm/$Foundry/$package/auncl10.tfm", "$DEST/fonts/tfm/$Foundry/$package/aunclb10.tfm"); &dobst; &dobib; &dotex; &domakeindex; &dosource; &dotype1; killfiles($standardclean); } killfiles($standardclean); &SYSTEM ("find $docdir -name \*.ps | xargs gzip"); # compress big output } sub MAKEt2 { &xchdir ($packagedir); &xmkdir ("$DEST/tex/plain"); &runjob ("$MV cyrplain $DEST/tex/plain"); # &xmkdir ("$DEST/tex/generic/t2"); &runjob ("$MV cyrfinst $DEST/tex/generic/t2"); # &xmkdir ("$DEST/fonts/enc/t2"); &runjob ("$CP enc-maps/encfiles/* $DEST/fonts/enc/t2"); # &xmkdir ("$DEST/doc/generic/t2"); &runjob ("$MV enc-maps/*.* enc-maps/[MR]* $DEST/doc/generic/t2"); &runjob ("$MV etc examples $DEST/doc/generic/t2"); # &xchdir ("$DEST/doc/generic/t2/etc"); &xmkdir ("$DEST/tex/latex/t2"); &runjob ("latex mathtext.ins"); &runjob ("rm *log; mv *sty $DEST/tex/latex/t2"); } sub MAKEtkz { # move files in latex to runtime, and doc/* up a level. &donormal (); # my $texdest = "$DEST/tex/$whichformat/$package"; &xmkdir ($texdest); &SYSTEM ("$MV `find latex -type f` $texdest/"); &SYSTEM ("$RM -r latex"); # rm now-empty dir &SYSTEM ("$MV doc/* ."); # # remove newly empty directories. &SYSTEM ("find -depth -type d -print | xargs rmdir 2>/dev/null"); } sub MAKEtipa { &xchdir("$packagedir/tipa-1.3"); my $Foundry = "public"; &runjob("mkdir -p $DEST/fonts/source/$Foundry/tipa"); &runjob("mkdir -p $DEST/fonts/type1/$Foundry/tipa"); &runjob("mkdir -p $DEST/fonts/tfm/$Foundry/tipa"); &runjob("mkdir -p $DEST/fonts/map/dvips/tipa"); &runjob("mkdir -p $DEST/tex/latex/tipa"); &runjob("mkdir -p $DEST/doc/fonts/tipa"); &runjob("mkdir -p $DEST/source/latex/tipa"); &runjob("$CP dvips/* $DEST/fonts/map/dvips/tipa"); &runjob("$CP sty/* $DEST/tex/latex/tipa"); &runjob("$CP tfm/* $DEST/fonts/tfm/$Foundry/tipa"); &runjob("$CP type1/* $DEST/fonts/type1/$Foundry/tipa"); &runjob("$CP mf/* $DEST/fonts/source/$Foundry/tipa"); &runjob("$CP doc/* $DEST/doc/fonts/tipa"); &runjob("$CP ../tipaman.pdf $DEST/doc/fonts/tipa"); } # docs in two languages. The English one is in a separate package, # mathmode. Just remove it from the copy when building the German one. # sub MAKEvossde { my $docdir = "$DEST/doc/german/$package"; &SYSTEM("mkdir -p $docdir"); &SYSTEM("$CP -r $packagedir/* $docdir"); &SYSTEM("rm -r $docdir/mathmode"); } # wadalab provides nearly TDS-ready .tar.gz with additional stuff # sub MAKEwadalab { print "MAKEwadalab $package - munge tds-ready tarballs\n"; &setup; &xchdir ("$DEST/doc/$whichdocformat/$package"); # each XX.tar.gz contains a tds-ready tree under XX/texmf: use it opendir (HERE, ".") || die "opendir(.) failed: $!"; my @tarfiles = grep /\.tar\.gz$/, readdir HERE; closedir (HERE); # my $destfonts = "$DEST/fonts"; &SYSTEM ("mkdir -p $destfonts"); foreach my $tarfile (@tarfiles) { &SYSTEM ("tar xzf $tarfile && rm $tarfile"); $tarfile =~ s/\.tar\.gz$//; &SYSTEM ("cp -r $tarfile/texmf/* $DEST"); &SYSTEM ("rm -r $tarfile/texmf && rmdir $tarfile"); } # # except the mincho-1-8-* tarball misses the doc/fonts level. &SYSTEM ("$MV $DEST/doc/wadalab/* $DEST/doc/fonts/wadalab/"); # # wadalab has a dir of xdelta from the original fonts. Remove it. -d "xdelta" && &SYSTEM ("rm -rf xdelta"); # # rm unused directories. &SYSTEM ("rmdir $DEST/*/$whichformat/$package 2>/dev/null"); } sub MAKEwordcount { &xchdir ($packagedir); # print "\t SPECIAL $package: moving wordcount.sh to /tmp\n"; &SYSTEM('mv wordcount.sh /tmp/'); # &xchdir (".."); &donormal (); # print "YOU-MUST-DO! update /tmp/wordcount.sh to source/texk/texlive\n"; } sub MAKEukrhyph { chdir($packagedir) || die ("ERROR: cannot open directory"); &runjob("mkdir -p $DEST/tex/generic/ukrhyph"); &runjob("mkdir -p $DEST/doc/generic/ukrhyph"); &runjob("$CP README $DEST/doc/generic/ukrhyph"); &runjob("$CP *.* $DEST/tex/generic/ukrhyph"); &runjob("$MV $DEST/tex/generic/ukrhyph/*.pdf $DEST/doc/generic/ukrhyph"); &runjob("rm $DEST/tex/generic/ukrhyph/*.ps"); } # The jadetex distribution is a mess. Last updated in 2003, so no point in # trying to push changes upstream that I can see, though. sub MAKEjadetex { # Unpack the tarball. &SYSTEM ("cd $packagedir && tar xf jadetex*.tar.gz && mv jadetex-*/* ."); &SYSTEM ("cd $packagedir && (rm -rf jadetex-3* doc/.cvsignore)"); # Get rid of the useless doc/ dir. &MAKEflatten (); # Rename resulting jadetex/jadetex dirs to jadetex/base. &xchdir ($DEST); for my $dir ("doc", "source", "tex") { &SYSTEM ("$MV $dir/jadetex/jadetex $dir/jadetex/base"); } # This didn't get flattened since there's a name clash. &SYSTEM ("$MV doc/jadetex/base/doc/Makefile doc/jadetex/base"); # Their pdfjadetex.ini predates pdftexconfig.tex. my $pdfini = "tex/jadetex/base/pdfjadetex.ini"; &SYSTEM ("(echo '\\input pdftexconfig.tex'; cat $pdfini) >/tmp/pj$$; mv /tmp/pj$$ $pdfini"); } sub MAKElfb { # remove pregenerated pk files. &MAKEflatten (); print "\t SPECIAL removing lfb PK files\n"; &SYSTEM("rm *pk"); } sub MAKEliterat { &xchdir($packagedir); &runjob("mkdir -p $DEST/fonts/tfm/paragrap/literat"); &runjob("mkdir -p $DEST/fonts/vf/paragrap/literat"); &runjob("mkdir -p $DEST/fonts/type1/paragrap/literat"); &runjob("mkdir -p $DEST/fonts/afm/paragrap/literat"); &runjob("mkdir -p $DEST/tex/latex/literat"); &runjob("mkdir -p $DEST/dvips/literat"); &runjob("mkdir -p $DEST/doc/fonts/literat"); &runjob("$CP dvips/* $DEST/dvips/literat"); &runjob("$CP tex/*tex $DEST/doc/fonts/literat"); &runjob("$CP psfonts/*pfb $DEST/fonts/type1/paragrap/literat"); &runjob("$CP psfonts/*inf $DEST/fonts/type1/paragrap/literat"); &runjob("$CP psfonts/*afm $DEST/fonts/afm/paragrap/literat"); &runjob("$CP tex/*sty tex/*fd $DEST/tex/latex/literat"); &runjob("$CP tfm/* $DEST/fonts/tfm/paragrap/literat"); &runjob("$CP tfm-raw/* $DEST/fonts/tfm/paragrap/literat"); &runjob("$CP vf/* $DEST/fonts/vf/paragrap/literat"); &runjob("$CP [A-Z]* insta* license $DEST/doc/fonts/literat"); } sub MAKExmltex { &xchdir($packagedir); &runjob("mkdir -p $DEST/tex/xmltex/config"); &runjob("mkdir -p $DEST/tex/xmltex/base"); &runjob("mkdir -p $DEST/doc/xmltex/base"); &runjob("$CP *.ini $DEST/tex/xmltex/config"); &runjob("$CP xmltex.tex *xmt xmltex.cfg $DEST/tex/xmltex/base"); &runjob("$CP manual* *xml test* *txt $DEST/doc/xmltex/base"); } sub MAKEfancyvrb { &setup; chdir("$DEST/doc/latex/$package"); print "\t SPECIAL $package: move contrib\n"; &SYSTEM("$MV contrib/README README.contrib"); &SYSTEM("$MV contrib/* .; rmdir contrib"); &buildfilelist; &donormal("nosetup"); } sub MAKEfeatpost { &setup; chdir("$DEST/doc/metapost/$package") || die "chdir($DEST/doc/metapost/$package) failed: $!"; print "\t SPECIAL $package, leaving most in doc\n"; @filenames = glob("macro/*.mp"); &install("$DEST/metapost/featpost", ".mp"); &SYSTEM("rm -rf system"); # seeing his texmf.cnf will only confuse people } sub MAKEucs { &setup; chdir("$DEST/doc/latex/$package"); &SYSTEM("$MV data $DEST/tex/latex/ucs"); &SYSTEM("$MV *def *sty $DEST/tex/latex/ucs"); &SYSTEM("$MV contrib/* $DEST/tex/latex/ucs"); } sub MAKEtexsis { &setup; chdir("$DEST/doc/texsis/$package"); &SYSTEM("make TXSsite.tex"); &buildfilelist; &donormal; &SYSTEM("rm *.ps"); } sub MAKEIEEEtran { print "\t SPECIAL $package - renaming README files, then flatten\n"; chdir ($packagedir) || die "chdir($packagedir) failed: $!"; &SYSTEM('for f in *; do test -r $f/README && mv $f/README README.$f; done'); chdir (".."); &MAKEflatten; # let's not worry about the fact that the tex run on testflow fails (it # wants a paper size); we still get the distributed pdf, which is good enough. } sub MAKEbardiag { &setup; &xchdir ("$DEST/doc/latex/$package"); print "\t SPECIAL $package - no symlinks, one-level flattening of doc dir\n"; &SYSTEM ("find . -type l | xargs --no-run-if-empty rm"); &SYSTEM ("$MV doc/* ."); &buildfilelist; &donormal; } sub MAKEmathpazo { &setup; chdir("$DEST/doc/latex/$package"); &SYSTEM("$MV latex/* type1/* afm/* vf/* tfm/* dvips/* .; rmdir latex type1 afm vf tfm dvips"); &buildfilelist; &donormal; } sub MAKEhaprosper { &setup ("nocopytodoc"); # create dirs but that's all chdir("$packagedir"); &SYSTEM("mkdir -p $DEST"); print "\t SPECIAL copying HA-prosper\n"; &SYSTEM("$CP -r README Doc/* $DEST/doc/latex/HA-prosper"); &SYSTEM("$CP -r Run/* $DEST/tex/latex/HA-prosper"); &SYSTEM("$CP -r Source/* $DEST/source/latex/HA-prosper"); } sub MAKEpclnfss { chdir("$packagedir"); &SYSTEM("mkdir -p $DEST/source/fonts/pclnfss"); &SYSTEM("mkdir -p $DEST/doc/fonts/pclnfss"); &SYSTEM("$CP -r [A-Z]* $DEST/doc/fonts/pclnfss"); &SYSTEM("$CP -r fonts $DEST"); &SYSTEM("$CP -r tex $DEST"); &SYSTEM("$CP -r src/* tests $DEST/source/fonts/pclnfss"); } sub MAKEpdf_forms_tutorial { # called for both the en and de versions. both are the same catalogue # entry, which is rather excruciating for us. &xchdir ($packagedir); my $lang; my $ll = substr ($package, -2); # en or de if ($ll eq "en") { $lang = "english"; } elsif ($ll eq "de") { $lang = "german"; } else { die "unexpected language code for $package: $ll"; } my $dest_lang = "$DEST/doc/$lang"; my $dest_pkg = "$dest_lang/pdf-forms-tutorial-$ll"; &SYSTEM ("mkdir -p $dest_lang"); &SYSTEM ("$CP -r $ll $dest_pkg"); &SYSTEM ("$CP README fdl.txt $dest_pkg"); } sub MAKEbeamer { &xchdir ($packagedir); my $destdoc = "$DEST/doc/latex/beamer"; &SYSTEM ("mkdir -p $destdoc"); &SYSTEM ("$CP -r * $destdoc"); &xchdir ($destdoc); my $desttex = "$DEST/tex/latex/beamer"; &SYSTEM("mkdir -p $desttex"); &SYSTEM("$MV base/* $desttex"); } # this doesn't work. sub MAKEbeebe { &setup; print "\t SPECIAL moving beebe .bib and .bst\n"; chdir ("$DEST/doc/latex/$package") || die; &SYSTEM("mkdir -p $DEST/bibtex/bib/beebe $DEST/bibtex/bst/beebe"); &SYSTEM("$MV tex*.bib tug*.bib $DEST/bibtex/bib/beebe"); #xx ugh, they aren't there &SYSTEM("$MV *.bst $DEST/bibtex/bst/beebe"); &SYSTEM("rm *"); } # pstricks packages usually support both plain and latex. # sub MAKEpst { print "\t SPECIAL pst $package starts\n"; # pst-laboObj.tex and pst-fp.sty need special cases: $standardtex = qq!^(($package(Obj)?)|pst-fp)\.(tex|sty)!; $whichformat='generic'; $whichdocformat='generic'; $specialsourcefmt{$package}='generic'; $specialsource{$package} = "Makefile|$standardsource"; &setup; &xchdir("$DEST/doc/$whichdocformat/$package"); &buildfilelist; $inspatt=$standardins if ! $inspatt; &runins($inspatt); &buildfilelist; &dosource; &dotex; &dotype1; killfiles($standardclean); &killfiles ($moreclean{$package}, "more") if $moreclean{$package}; &SYSTEM("mkdir -p $DEST/tex/latex/$package"); &SYSTEM("mv $DEST/tex/generic/$package/*sty $DEST/tex/latex/$package"); &SYSTEM("mv $DEST/doc/generic/$package/*cfg $DEST/tex/latex/$package") unless $package eq "pst-pad"; # its showexpl.cfg is for the doc my $postaction = $posthook{$package}; eval ($postaction) if $postaction; } sub MAKEfontinst { &xchdir ($packagedir); &runjob("mkdir -p $DEST/tex/latex/fontinst"); &runjob("mkdir -p $DEST/tex/fontinst"); &runjob("mkdir -p $DEST/source/fontinst"); &runjob("mkdir -p $DEST/doc/fonts/fontinst"); &runjob("$CP -r examples test $DEST/doc/fonts/fontinst"); &runjob("$CP -r doc/* README test $DEST/doc/fonts/fontinst"); &runjob("$CP -r source $DEST/source/fontinst/base"); &runjob("$CP -r latex/* $DEST/tex/latex/fontinst"); &runjob("$CP -r inputs/* $DEST/tex/fontinst"); print "\t YOU-MUST-DO $package copy fontinst.bat to bin/win32\n"; } sub MAKEpsnfss { # we use the psnfss.zip from the latex-tds project. # But we don't want the actual tfm/vf; TL has many more tfm's (in # different packages), and we don't want to mess with that. So just # remove the fonts subdir -- except for the map files, which we do want. # print "\t SPECIAL $package omit fonts from latex-tds version\n"; # Start with the usual straight copy. &MAKEcopy (); # Then remove the entire fonts tree. &xchdir ("$DEST/fonts"); &SYSTEM ("rm -rf enc tfm vf"); } # CJK (from Werner Lemberg) sub I { my ($s, $d) = @_; &SYSTEM ("$INSTALL $s $DEST/$d"); } sub MAKEcjk_common { print "\t SPECIAL $package wholesale rearranging for cjk\n"; &xchdir ($packagedir); # also need cjk doc tarball. should move in next release. my $cjkdoc = "cjk-?.?.?-doc.tar.gz"; &SYSTEM ("tar -C cjk-?.?.? -xf $cjkdoc --strip-components=1"); # remove the version number top-level directory. &SYSTEM ("$RM *.tar.gz && $MV cjk-?.?.?/* . && rmdir cjk-?.?.?"); } sub MAKEcjk { &MAKEcjk_common (); require "cjk.pl"; # in tlpkg/libexec } sub MAKEbin_cjkutils { &MAKEcjk_common (); require "bin-cjkutils.pl"; } sub MAKEc90 { &MAKEcjk_common (); require "c90.pl"; } sub MAKEdnp { &MAKEcjk_common (); require "dnp.pl"; } sub MAKEgaruda_c90 { &MAKEcjk_common (); require "garuda-c90.pl"; } sub MAKEnorasi_c90 { &MAKEcjk_common (); require "norasi-c90.pl"; } sub MAKEcmlgc { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &SYSTEM("rm -rf vtex"); &MAKEflatten; } sub MAKEphonetic { &setup; &xchdir ("$DEST/doc/$whichdocformat/$package"); print "\t SPECIAL MAKE$package\n"; &SYSTEM ("$MV Doc/2e/* ."); # do the usual. &buildfilelist; &donormal ("nosetup"); } sub MAKEpict2e { &setup; chdir("$DEST/doc/$whichdocformat/$package"); &setup; chdir("$DEST/doc/$whichdocformat/$package"); &buildfilelist; # run the .ins files (if any) supplied $inspatt = $specialins{$package} || $standardins; $Foundry = $specialfoundry{$package} || $standardfoundry; &runins($inspatt); # rebuild the list of files in the directory &SYSTEM("$MV pict2e-example.cfg pict2e.cfg"); &buildfilelist; &dodvi; # rebuild again, as we have .dvi files now &buildfilelist; &dotex; &dosource; &SYSTEM("rmdir $DEST/tex/$whichformat/$package 2> /dev/null"); &SYSTEM("rmdir $DEST/source/$whichformat/$package 2> /dev/null"); &SYSTEM("rmdir $DEST/doc/$whichdocformat/$package 2> /dev/null"); killfiles($standardclean); } sub PREHOOK_cals { print "PREHOOK_$package - flatten only cals subdir\n"; &SYSTEM ("$MV cals/* ."); } sub PREHOOK_chess { print "PREHOOK_$package - no babel inputs\n"; &SYSTEM ("$MV inputs/chess.sty ."); &SYSTEM ("$RM -rf inputs pkfonts.zip"); } sub PREHOOK_cm_super { print "PREHOOK_$package - remove dvipdfm map files\n"; # We generate our own dvipdfm (not to mention pdftex) map files. &SYSTEM ("$RM -rf dvipdfm"); } sub PREHOOK_fixme { print "PREHOOK_$package - create dtx subdirs\n"; &xmkdir ("themes", "layouts", "layouts/env", "layouts/target"); } sub PREHOOK_flatten1 { print "PREHOOK_$package - move files up one level\n"; &SYSTEM ("$MV */* ."); } sub PREHOOK_ibygrk { print "PREHOOK_$package - handle ibycus4.map\n"; # ibygrk has two instances of the same file ibycus4.map; it is # both tex source and mf source. the usual method cannot deal, of course. &SYSTEM ("$MV fonts/source/public/ibycus4/ibycus4.map ."); &SYSTEM ("$RM tex/generic/ibycus4/ibycus4.map"); } sub PREHOOK_mathspic { print "PREHOOK_$package - eliminate version from mathspicNNN.pl\n"; # the w32 wrapper can only find foo.pl from foo, not fooNNN.pl. &SYSTEM ("$MV mathspic*.pl mathspic.pl"); } sub PREHOOK_mp3d { print "PREHOOK_$package - rm 1.0\n"; &SYSTEM ("$RM -rf v1.0"); } sub PREHOOK_pictex { print "PREHOOK_$package - rm autoarea\n"; &SYSTEM ("$RM -rf addon/autoarea*"); } sub PREHOOK_vhistory { print "PREHOOK_$package - rm dup file\n"; &SYSTEM ("$RM doc/sets.sty"); } sub PREHOOK_wsuipa { print "PREHOOK_$package - rearrange directories, except for doc\n"; # we can't use flatten because we want to preserve the subdirs inside doc. # annoyingly, the same filenames are repeated. &SYSTEM ("$MV changes/* doc/* macros/* mf/* pk/* tfm/* ."); } sub POSTamscls { print "POST$package - bibtex/bst/amscls\n"; &SYSTEM ("$MV $DEST/bibtex/bst/ams $DEST/bibtex/bst/amscls"); } sub POSTamstex { print "POST$package - cleanup, base subdir\n"; die "not done -- doc format, man page, goodbye"; # but pretty close # &SYSTEM ("$RM amssym.tex amssym.def"); # in amsfonts # my $configdir = "$DEST/tex/amstex/config/"; &xmkdir ($configdir); &SYSTEM ("$MV amstex.ini $configdir/"); # &xchdir ($DEST); for my $dir ("doc", "tex") { &SYSTEM ("$MV $dir/$package/$package $dir/$package/base"); } } sub POSTapalike { print "POST$package - move apalike.tex to runtime\n"; # can't use specialtex because we also need apalike.sty in latex. my $src = "$DEST/doc/$whichdocformat/$package/apalike.tex"; my $dstdir = "$DEST/tex/plain/$package"; &xmkdir ($dstdir); &SYSTEM ("$MV $src $dstdir/"); } sub POSTbabelbib { print "POST$package - removed texmf level\n"; &SYSTEM ("cd $DEST && $MV texmf/* . && rmdir texmf"); } sub POSTbiber { print "POST$package - unpack and install binaries\n"; # we've started with everything under source/. &xchdir ("$DEST/source/bibtex/biber"); # clean spurious biber/ copy. &SYSTEM ("$RM -rf biber"); # move doc pdf. &SYSTEM ("$MV biber.pdf $DOCDIR/"); # biber uses different platform names. my %tl_platform = ( "MSWIN" => "win32", "amd64-freebsd" => "amd64-freebsd", "cygwin32" => "i386-cygwin", "darwin_x86_64" => "x86_64-darwin", "darwin_x86_i386" => "universal-darwin", "i386-freebsd" => "i386-freebsd", "i386-pc-solaris2" => "i386-solaris", "linux_x86_32" => "i386-linux", "linux_x86_64" => "x86_64-linux", "x86_64-pc-solaris2" => "x86_64-solaris", ); # handle the prebuilt binaries, which are zipped or tarred. for my $archive (sort ()) { next if $archive =~ /freebsd[68]\./; # we only want freebsd7 my $unarchiver = &unarchiver ($archive); &SYSTEM ("$unarchiver $archive"); # each .tar.gz unpacks into a single file named biber, # .zip unpacks into biber.exe. my $biber_binary = "biber"; $biber_binary .= ".exe" if $archive =~ /MSWIN|cygwin/i; # Put the executable in both the # (a) Master bin directory and # (b) Build source directory. (my $biber_platform = $archive) =~ s/biber-(.*?)\..*/$1/; my $tl_platform = $tl_platform{$biber_platform}; die "unknown biber platform $biber_platform, goodbye" if ! $tl_platform; my $builddir = "$BUILDDEST/utils/biber/bin/$tl_platform"; &SYSTEM ("mkdir -p $builddir/"); &SYSTEM ("$CP $biber_binary $builddir/$biber_binary"); # # really need to do svn cp for this (in place, can't do it here). my $bindir = "$TOPDEST/bin/$tl_platform"; &SYSTEM ("mkdir -p $bindir/"); &SYSTEM ("$MV $biber_binary $bindir/"); # bindir should already exist } # don't keep binary archives around in Master tree. &SYSTEM ("$RM biber[-.]*"); } # biber binaries are distributed in a variety of ways. The idea here is # to specify the commands that will get from the distribution on CTAN to # a binary named "biber". # sub unarchiver { my ($archive) = @_; my ($unarch) = ("", ""); if ($archive =~ /\.tar\./) { $unarch = "tar xf"; } elsif ($archive =~ /\.zip$/) { $unarch = "unzip -q"; } else { die "do not know unarchiver for $archive"; } return $unarch; } sub POSTbibtex { print "POST$package - switch to base/\n"; &SYSTEM ("cd $DEST && $MV bibtex/bst/bibtex bibtex/bst/base"); &SYSTEM ("cd $DEST && $MV bibtex/bib/bibtex bibtex/bib/base"); &SYSTEM ("cd $DEST && $MV doc/bibtex/bibtex doc/bibtex/base"); &SYSTEM ("$RM bibtex.web"); # handle separately &preserve_man_pages ("bibtex"); } sub POSTcontext_games { print "POST$package - remove duplicated fonts\n"; &SYSTEM ("$RM -rf fonts"); } sub POSTcoordsys { print "POST$package - rename `putfile.' to `putfile.maple'.\n"; # Apparently dtx insists on always adding the period; this can make # vfat filesystems choke. &SYSTEM ("$MV putfile. putfile.maple"); } sub POSTctex { print "POST$package - move subdirectories.\n"; my $dstdir = "$DEST/tex/latex/$package"; &xmkdir ($dstdir); &SYSTEM ("$MV back cfg def engine fd fontset opt $dstdir/"); &SYSTEM ("$MV doc/* .; rmdir doc"); } sub POSTdehyph_exptl { print "POST$package - *YOU* must update tlpsrc directives, right now!\n"; } sub POSTeplain { print "POST$package - mv README, eplain.info\n"; &SYSTEM ("$MV doc/eplain/eplain/README doc/eplain/README.TOP"); my $infodir = "$TOPDEST/texmf/doc/info/"; &xmkdir ($infodir); &SYSTEM ("$MV doc/eplain/doc/eplain.info $infodir/"); } sub POSTepspdf { print "POST$package - construct images subdir\n"; &xmkdir ("images"); &SYSTEM ("$MV *.png images/"); &SYSTEM ("$MV *.bat epspdf.texlua /tmp/"); print "YOU-MUST-DO! update /tmp/$package* into bin/win32, etc.\n"; } sub POSTfixme { print "POST$package - move subdirectories\n"; my $dstdir = "$DEST/tex/latex/$package"; &xmkdir ($dstdir); &SYSTEM ("$MV themes layouts $dstdir/"); } sub POSTfontools { # it seems simpler to do it this way than flatten and expand it back # out, because of its nice examples/ subdirectories. print "POST$package - handle subdirs\n"; # my $scriptdir = "$DEST/scripts/$package"; &xmkdir ($scriptdir); &SYSTEM ("$MV bin/* $scriptdir/"); &SYSTEM ("chmod a+x $scriptdir/*"); &SYSTEM ("rmdir bin"); # my $mandir = "$TOPDEST/texmf/doc/man/man1"; &xmkdir ($mandir); &SYSTEM ("$MV doc/*.1 $mandir/"); &SYSTEM ("rm -rf doc"); # skip pdfs, we'll make our own # my $encdir = "$DEST/fonts/enc/dvips/$package"; &xmkdir ($encdir); &SYSTEM ("$MV share/* $encdir/"); &SYSTEM ("rmdir share"); # skip pdfs, we'll make our own # &tl_man_to_pdf (); } sub POSTfpl { print "POST$package - rename README.source\n"; &SYSTEM ("$MV README.source $DEST/source/fonts/fpl/README"); } sub POSTgrverb { print "POST$package - rename psfonts.map\n"; my $mapdir = "$DEST/fonts/map/dvips/grverb"; &SYSTEM ("$MV $mapdir/psfonts.map $mapdir/grverb.map"); } sub POSTibygrk { print "POST$package - second copy of ibycus4.map\n"; # after the ibygrk structure has been set up, copy ibycus4.map to the # tex dir. &SYSTEM ("cd $DEST && $CP fonts/source/public/ibygrk/ibycus4.map " . "tex/generic/ibygrk/ibycus4.map"); } sub POSTimpatient { print "POST$package - remove artwork and fr subdirectories\n"; &SYSTEM ("$RM -r artwork fr"); } sub POSTinteractiveworkbook { print "POST$package - mv .sty directory\n"; my $dest = "$DEST/tex/latex/$package"; &SYSTEM ("mkdir -p $dest"); &SYSTEM ("$MV interactiveworkbook.sty/* $dest/"); &SYSTEM ("rmdir interactiveworkbook.sty"); } sub POSTknitting { print "POST$package - move generic .tex file\n"; my $dest = "$DEST/tex/plain/$package"; &SYSTEM ("mkdir -p $dest"); &SYSTEM ("$MV knitting.tex $dest/"); } sub POSTknuth { print "POST$package - removing nonfree/duplicated files\n"; # &xchdir ("$DEST"); &xmkdir ("doc/generic"); &SYSTEM ("$MV doc/knuth doc/generic/"); # &xmkdir ("source/generic"); &SYSTEM ("$MV source/knuth source/generic/"); # # remove nonfree. &xchdir ("$DEST/doc/generic/knuth"); &SYSTEM ("$RM tex/texbook.tex mf/mfbook.tex"); # # remove sources that are in build tree. &xchdir ("$DEST/source/generic/knuth"); &SYSTEM ("rm -rf etc mf mfware tex/tex.web tex/trip* texware web/*.web"); } sub POSTlatex2html { print "POST$package - moving $package.perl to doc\n"; my $dest = "$DEST/doc/latex/$package"; &SYSTEM ("mkdir -p $dest"); &SYSTEM ("$MV $DEST/scripts/latex2html/styles/$package.perl $dest"); } sub POSTlatexdiff { print "POST$package - rename $package-so to $package.pl\n"; # to avoid special case in w32 wrapper my $dir = "$DEST/scripts/$package"; &SYSTEM ("$MV $dir/latexdiff-so $dir/latexdiff.pl"); &SYSTEM ("$MV $dir/latexrevise $dir/latexrevise.pl"); &SYSTEM ("$MV $dir/latexdiff-vc $dir/latexdiff-vc.pl"); } sub POSTlatex2ehelptexinfo { print "\t POST$package - remove translation subdir\n"; &SYSTEM ("$RM -rf spanish"); } sub POSTlithuanian { print "\t POST$package - remove old language support\n"; # these files are no longer used in TL. &SYSTEM ("$RM language.lt.dat $DEST/tex/latex/lithuanian/language.lt.def"); print "\t POST$package - fix location of .dfu file\n"; &SYSTEM ("$MV $DEST/doc/latex/lithuanian/l7xenc.dfu $DEST/tex/latex/lithuanian/"); } sub POSTmontex { print "\t POST$package - avoid 00readme case clash\n"; # these files are no longer used in TL. &SYSTEM ("$MV 00readme 00readme.mfinput.km"); } # post instead of specialman because we use the tds.zip, which has the # man pages in an unusual place. sub POSTmusixtex { print "POST$package - cp man pages\n"; my $mydest = "$TOPDEST/texmf/doc/man/man1/"; &xmkdir ($mydest); &SYSTEM ("$CP $DEST/doc/generic/$package/scripts/*.1 $mydest/"); &tl_man_to_pdf (); } sub POSTpgf { print "POST$package - mv generic,latex,... directories\n"; &SYSTEM ("cd $DEST && mkdir tex && mv context generic latex plain tex"); &SYSTEM ("$RM $DEST/README"); } sub POSTprerex { print "POST$package - rm dup prerex subdir\n"; &SYSTEM ("$RM -rf prerex"); } sub POSTpstcox { print "POST$package - mv latex .sty, doc Gallery\n"; &SYSTEM ("mkdir -p $DEST/tex/latex/$package"); &SYSTEM ("mv -v $DEST/doc/generic/$package/*sty $DEST/tex/latex/$package"); &xchdir ("$DEST/doc/generic/$package"); &SYSTEM ("mkdir pst-coxeterp/"); # oops, depends on find order &SYSTEM ("mv -v Gallery.tex pst-coxeterp?* pst-coxeterp/"); &SYSTEM ("mv -v doc/pst-coxcoor/ pst-coxcoor"); &SYSTEM ("mv -v pst-coxcoor?* pst-coxcoor"); } sub POSTpstgeo { print "POST$package - mv data, doc\n"; &SYSTEM ("$MV data/pst*compress.pl ."); &SYSTEM ("$RM dataII/pst*compress.pl"); &SYSTEM ("$MV data dataII $DEST/tex/generic/pst-geo/"); &SYSTEM ("$MV doc/* ."); } sub POSTrmsymlink { print "POST$package - removing symlinks\n"; &SYSTEM ("find $DEST -type l | xargs --no-run-if-empty rm"); } # has to be post instead of specialman because we use the tds.zip. sub POSTsplitindex { print "POST$package - mv man page\n"; my $mydest = "$TOPDEST/texmf/doc/man/man1/"; &xmkdir ($mydest); &SYSTEM ("$MV doc/latex/splitindex/$package.1 $mydest"); } sub POSTthailatex { # don't install tlatex since we don't have the other preprocessors # it needs to actually work. print "POST$package - mv fonts\n"; my $fontdir = "$TOPDEST/texmf-dist/fonts/"; for my $ext ("afm", "pfb") { my $level = $ext eq "pfb" ? "type1" : $ext; my $dest = "$fontdir/$level/public/$package/"; &xmkdir ($dest); &SYSTEM ("$MV fonts/*.$ext $dest"); } # somehow it seems more appropriate to put everything in source/ # than doc/ in this case. Their doc/ dir seems to be just examples. &xchdir ($DEST); &SYSTEM ("$MV doc/latex/$package source/latex/$package"); } sub POSTxecyr { print "POST$package - handling bat, moving language.dat.add from runtime\n"; &SYSTEM ("$MV $DEST/tex/generic/xecyr/language.dat.add" . " $DEST/doc/xelatex/xecyr"); # Just moving to bin/win32 doesn't work, since we don't want to # svn add them -- they exist in xecyr.PLATFORM, not xecyr. They never # change anyway, so just remove until it become an issue. #my $wdir = "$TOPDEST/bin/win32"; #&xmkdir ($wdir); #&SYSTEM ("$MV $DEST/bin/xecyr/*.bat $wdir/"); &SYSTEM ("$RM $DEST/bin/xecyr/*.bat"); } sub POSTxetexpstricks { print "POST$package - need tex/ level\n"; &xchdir ($DEST); &xmkdir ("tex", "doc/generic/$package"); &SYSTEM ("$MV xelatex xetex tex"); } sub POSTzhmetrics { # source seems better than making a doc directory just for the map file. print "POST$package - move example ttfonts.map out of runtime\n"; &SYSTEM ("$MV $DEST/fonts/map/ttf2pk/ttfonts.map $DEST/source/fonts/zhmetrics"); } sub POSTzhspacing { print "POST$package - move subdirectories\n"; my $dstdir = "$DEST/tex/xetex/$package"; &xmkdir ($dstdir); &SYSTEM ("$MV context latex plain $dstdir/"); &SYSTEM ("$MV doc/* .; rmdir doc"); } # Allow overrides. In particular, CTAN can change some hashes to make # packages with licenses that TL doesn't allow. # # Put the config file "ctan2tds-config.pl" in the dir from which you # run this script, or better, set the environment variable "CTAN2TDS_CONFIG". # sub readconfig { my ($base,$dir,$ext) = fileparse ($0,'\.pl'); my $configFileName = "$dir/$base-config.pl"; $configFileName = $ENV{"CTAN2TDS_CONFIG"} || $configFileName; my $result; if (-f $configFileName) { my $err = "Error: CTAN config file $configFileName"; $result = eval `cat $configFileName`; # like require, but no look in INC die "$err; evaluation in file failed: $@" if $@; die "$err; yielded result that is false" unless $result; } else { $result=1; } return $result; } # vim: set tabstop=8 shiftwidth=2 expandtab: