diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/mkimport | 253 | ||||
| -rwxr-xr-x | scripts/mkstatus | 3 | 
2 files changed, 195 insertions, 61 deletions
diff --git a/scripts/mkimport b/scripts/mkimport index abe1608..b3c71fe 100755 --- a/scripts/mkimport +++ b/scripts/mkimport @@ -30,10 +30,16 @@ local md5 = require "md5"  local os  = require "os"  require "lualibs" +require "util-mrg" + +assert (utilities and utilities.merger and utilities.merger.compact +        and type (utilities.merger.compact) == "function", +        "Whoa, util-mrg.lua is not accessible! How do you expect this to work‽")  local filedirname      = file.dirname  local fileiswritable   = file.is_writable  local ioloaddata       = io.loaddata +local iosavedata       = io.savedata  local iopopen          = io.popen  local iowrite          = io.write  local lfschdir         = lfs.chdir @@ -90,8 +96,6 @@ local prefixes = {  --doc]]-- -local loader_merge_name  = "luaotfload-package.lua" -local loader_output_name = "luaotfload-package-merged.lua"  local loader_target_name = "fontloader-%s.lua"  local loader_orig_dir    = "/src/fontloader/"  local loader_target_dir  = "/build/" @@ -245,6 +249,107 @@ local imports = {    }, --[[ [context] ]]  } --[[ [imports] ]] +local package = { + +  optional = { --- components not included in the default package + +--- The original initialization sequence by Hans Hagen, see the file +--- luatex-fonts.lua for details: +--- +---   [01] l-lua.lua +---   [02] l-lpeg.lua +---   [03] l-function.lua +---   [04] l-string.lua +---   [05] l-table.lua +---   [06] l-io.lua +---   [07] l-file.lua +---   [08] l-boolean.lua +---   [09] l-math.lua +---   [10] util-str.lua +---   [11] luatex-basics-gen.lua +---   [12] data-con.lua +---   [13] luatex-basics-nod.lua +---   [14] font-ini.lua +---   [15] font-con.lua +---   [16] luatex-fonts-enc.lua +---   [17] font-cid.lua +---   [18] font-map.lua +---   [19] luatex-fonts-syn.lua +---   [20] font-tfm.lua +---   [21] font-afm.lua +---   [22] font-afk.lua +---   [23] luatex-fonts-tfm.lua +---   [24] font-oti.lua +---   [25] font-otf.lua +---   [26] font-otb.lua +---   [27] luatex-fonts-inj.lua +---   [28] luatex-fonts-ota.lua +---   [29] luatex-fonts-otn.lua +---   [30] font-otp.lua +---   [31] luatex-fonts-lua.lua +---   [32] font-def.lua +---   [33] luatex-fonts-def.lua +---   [34] luatex-fonts-ext.lua +---   [35] luatex-fonts-cbk.lua +--- +--- Of these, nos. 01--10 are provided by the Lualibs. Keeping them +--- around in the Luaotfload fontloader is therefore unnecessary. +--- Packaging needs to account for this difference. + +    "l-lua", +    "l-lpeg", +    "l-function", +    "l-string", +    "l-table", +    "l-io", +    "l-file", +    "l-boolean", +    "l-math", +    "util-str", + +--- Another file containing auxiliary definitions must be present +--- prior to initialization of the configuration. + +    "luatex-basics-gen", + +  }, --[[ [package.optional] ]] + +--- The files below constitute the “fontloader proper”. Some of the +--- functionality like file resolvers is overloaded later by +--- Luaotfload. Consequently, the resulting package is pretty +--- bare-bones and not usable independently. + +  required = { + +    "data-con", +    "basics-nod", +    "font-ini", +    "font-con", +    "fonts-enc", +    "font-cid", +    "font-map", +    "fonts-syn", +    "font-tfm", +    "font-afm", +    "font-afk", +    "fonts-tfm", +    "font-oti", +    "font-otf", +    "font-otb", +    "fonts-inj", +    "fonts-ota", +    "fonts-otn", +    "font-otp", +    "fonts-lua", +    "font-def", +    "fonts-def", +    "fonts-ext", +    "fonts-cbk", + +  }, --[[ [package.required] ]] + +} --[[ [package] ]] +  local hash_file = function (fname)    if not lfsisfile (fname) then      die ("cannot find %s.", fname) @@ -663,10 +768,8 @@ local build_paths = function (argv)    local orig_dir    = lfscurrentdir ()    local base_dir    = orig_dir .. loader_orig_dir -  local target_name = orig_dir .. loader_target_dir -                   .. stringformat (loader_target_name, os.date ("%F")) -  local merge_name  = base_dir .. loader_merge_name -  local output_name = base_dir .. loader_output_name +  local loader_name = stringformat (loader_target_name, os.date ("%F")) +  local target_name = orig_dir .. loader_target_dir .. loader_name    if #argv >= 2 then      local fname = argv[2] @@ -676,8 +779,7 @@ local build_paths = function (argv)             argv[2])      end      base_dir    = dir -    merge_name  = fname -    output_name = dir .. loader_output_name +    target_name  = fname    end    if #argv == 3 then @@ -696,28 +798,93 @@ local build_paths = function (argv)      base_dir    = base_dir,      merge_name  = merge_name,      target_name = target_name, -    output_name = output_name, +    loader_name = loader_name,    }    return ret  end ---[[doc-- +local luaotfload_header = [==[ +--[[info----------------------------------------------------------------------- +  Luaotfload fontloader package +  build %s by %s@%s +------------------------------------------------------------------------------- -  Packaging works as follows: +  © %s PRAGMA ADE / ConTeXt Development Team -      * Files are looked up the usual way, allowing us to override the -        distribution-supplied scripts with our own alternatives in the -        local path. +  The code in this file is provided under the GPL v2.0 license. See the +  file COPYING in the Luaotfload repository for details. -      * The merged package is written to the same directory as the -        packaging script (not ``$PWD``). +  Report bugs to github.com/lualatex/luaotfload -  There is some room for improvements: Instead of reading a file with -  fixed content from disk, the merge script could be composed -  on-the-fly from a list of files and then written to memory (not sure -  though if we can access shm_open or memfd and the likes from Lua). +  This file has been assembled from components taken from Context. See +  the Luaotfload documentation for details: ---doc]]-- +      $ texdoc luaotfload +      $ man 1 luaotfload-tool +      $ man 5 luaotfload.conf + +  Included files: + +%s + +--info]]----------------------------------------------------------------------- + +]==] + +local make_header = function (files) +  local filelist = { } +  for i = 1, #files do +    local f = files[i] +    local _void, ourname = derive_ourname (f, kind_merged) +    filelist [#filelist + 1] = stringformat ("    · %s", ourname) +  end +  return stringformat (luaotfload_header, +                       os.date "%F %T", +                       os.getenv "USER" or "anon", +                       os.getenv "HOSTNAME" or "void", +                       os.date "%Y", +                       table.concat (filelist, "\n")) +end + + +local scope_start         = "\ndo  --- [luaotfload, %s scope for “%s” %s] ---\n\n" +local scope_stop          = "\nend --- [luaotfload, %s scope for “%s”] ---\n\n" +local luaotfload_modeline = "\n--- vim:ft=lua:sw=2:ts=8:et:tw=79\n" + +local assemble_fontloader = function (tgt, dst) +  status ("packaging fontloader as “%s”.", emphasis (tgt)) +  local required  = package.required +  local compact   = utilities.merger.compact +  local sequence  = { [1] = make_header (required) } +  for i = 1, #required do +    local cur = required [i] +    local subdir, ourname = derive_ourname (cur, kind_merged) +    local ourpath = file.join (fontloader_subdir, subdir, ourname) +    local data = ioloaddata (ourpath) +    if not data then +      bad ("file “%s” cannot be loaded from “%s”", ourname, ourpath) +      return false +    end +    sequence[#sequence + 1] = stringformat (scope_start, tgt, cur, md5sumhexa (data)) +    sequence[#sequence + 1] = compact (data) +    sequence[#sequence + 1] = stringformat (scope_stop , tgt, cur) +  end +  sequence[#sequence + 1] = luaotfload_modeline +  local raw = table.concat (sequence) +  local _void, chunk, err = pcall (loadstring, raw) +  print(_void, chunk) +  if chunk == nil then +    bad ("packaging result not well-formed") +    bad ("error message: “%s”", err) +    bad ("dumping to fontloader-junk.lua") +    iosavedata ("fontloader-junk.lua", raw) +    return false +  end +  iosavedata (dst, raw) +  status ("amalgamated %d files, written to “%s”.", +          #required, dst) +  return dst +end  local package = function (argv)    local t0    = osgettimeofday () @@ -725,21 +892,18 @@ local package = function (argv)    status ("assuming fontloader source in      %s", paths.base_dir)    status ("reading merge instructions from    %s", paths.merge_name) -  status ("mtx-package result at              %s", paths.output_name)    status ("writing output to                  %s", paths.target_name)    --- check preconditions    if not lfsisdir (paths.base_dir)          then die ("directory %s does not exist", emphasis (paths.base_dir   )) end -  if not lfsisfile (paths.merge_name)       then die ("missing merge file at %s",    emphasis (paths.merge_name )) end -  if not fileiswritable (paths.output_name) then die ("cannot write to %s",          emphasis (paths.output_name)) end    if not fileiswritable (paths.target_name) then die ("cannot write to %s",          emphasis (paths.target_name)) end  ---- not lfschdir (paths.base_dir)          then die ("failed to cd into %s",        emphasis (paths.base_dir   )) end -  if lfsisfile (paths.output_name) then +  if lfsisfile (paths.target_name) then      status ("output file already exists at “%s”, unlinking", -            paths.output_name) -    local ret, err = os.remove (paths.output_name) +            paths.target_name) +    local ret, err = os.remove (paths.target_name)      if ret == nil then        if not lfschdir (paths.orig_dir) then          status ("warning: failed to cd retour into %s", @@ -748,18 +912,11 @@ local package = function (argv)        die ("failed to remove existing merge package")      end    end -    --die ("missing merge file at %s",    emphasis (paths.merge_name )) end -    --- perform merge -  local cmd = { "mtxrun", "--script", "package", "--merge", paths.merge_name } -  local shl = tableconcat (cmd, " ") - -  status ("invoking %s as “%s”", emphasis "mtx-package", shl) +  local ret = assemble_fontloader (paths.loader_name, paths.target_name) -  local fh = iopopen (shl, "r") - -  if not fh then +  if not ret then      if not lfschdir (paths.orig_dir) then        status ("warning: failed to cd retour into %s",                emphasis (paths.orig_dir)) @@ -767,15 +924,6 @@ local package = function (argv)      die ("merge failed; failed to invoke mtxrun")    end -  local junk = fh.read (fh, "*all") -  if not junk then -    status ("warning: received no output from mtxrun; this is strange") -  end - -  fh.close (fh) - -  if debug then print (junk) end -    --- clean up    if not lfschdir (paths.orig_dir) then @@ -785,24 +933,13 @@ local package = function (argv)    --- check postconditions -  if not lfsisfile (paths.output_name) then -    die ("merge failed; package not found at " .. paths.output_name) +  if not lfsisfile (ret) then +    die ("merge failed; package not found at “%s”", paths.output_name)    end    --- at this point we know that mtxrun was invoked correctly and the    --- result file has been created -  if lfsisfile (paths.target_name) then -    status ("target file %s exists, overwriting", emphasis (paths.target_name)) -  end - -  local res, err = osrename (paths.output_name, paths.target_name) - -  if res == nil then -    die ("merge failed; failed to move package from %s to %s", -         paths.output_name, paths.target_name) -  end -    status ("merge complete; operation finished in %.0f ms",            (osgettimeofday() - t0) * 1000)    status ("a fresh fontloader at %s is ready to roll", paths.target_name) diff --git a/scripts/mkstatus b/scripts/mkstatus index f27d571..21d5e71 100755 --- a/scripts/mkstatus +++ b/scripts/mkstatus @@ -71,9 +71,6 @@ local names = {    { scriptdir,    "mkstatus",                       },    { scriptdir,    "mktests",                        }, -  --- merge script -  { loaderdir,    "luaotfload-package.lua",         }, -    --- fontloader runtimes    { rtdir,        "fontloader-basics-gen.lua",      },    { rtdir,        "fontloader-reference.lua",       },  | 
