summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/scripts/l3build/l3build-ctan.lua
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2018-03-08 23:45:11 +0000
committerKarl Berry <karl@freefriends.org>2018-03-08 23:45:11 +0000
commit64ee185d962cd13195e329ab4ac8a9da6535b677 (patch)
tree652f96f04e1826a75ef1c3a38ab3d2a72ff9c067 /Master/texmf-dist/scripts/l3build/l3build-ctan.lua
parenta502f321bf373ab83e239389e55d622e6c6980e2 (diff)
l3build now cmdline script (9mar18)
git-svn-id: svn://tug.org/texlive/trunk@46894 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/scripts/l3build/l3build-ctan.lua')
-rw-r--r--Master/texmf-dist/scripts/l3build/l3build-ctan.lua245
1 files changed, 245 insertions, 0 deletions
diff --git a/Master/texmf-dist/scripts/l3build/l3build-ctan.lua b/Master/texmf-dist/scripts/l3build/l3build-ctan.lua
new file mode 100644
index 00000000000..875f50dc4fa
--- /dev/null
+++ b/Master/texmf-dist/scripts/l3build/l3build-ctan.lua
@@ -0,0 +1,245 @@
+--[[
+
+File l3build-ctan.lua Copyright (C) 2018 The LaTeX3 Project
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+
+ http://www.latex-project.org/lppl.txt
+
+This file is part of the "l3build bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+-----------------------------------------------------------------------
+
+The development version of the bundle can be found at
+
+ https://github.com/latex3/l3build
+
+for those people who are interested.
+
+--]]
+
+local gsub = string.gsub
+local match = string.match
+local insert = table.insert
+
+-- Copy files to the main CTAN release directory
+function copyctan()
+ mkdir(ctandir .. "/" .. ctanpkg)
+ local function copyfiles(files,source)
+ if source == currentdir or flatten then
+ for _,filetype in pairs(files) do
+ cp(filetype,source,ctandir .. "/" .. ctanpkg)
+ end
+ else
+ for _,filetype in pairs(files) do
+ for file,_ in pairs(tree(source,filetype)) do
+ local path = splitpath(file)
+ local ctantarget = ctandir .. "/" .. ctanpkg .. "/"
+ .. source .. "/" .. path
+ mkdir(ctantarget)
+ cp(file,source,ctantarget)
+ end
+ end
+ end
+ end
+ for _,tab in pairs(
+ {bibfiles,demofiles,docfiles,pdffiles,scriptmanfiles,typesetlist}) do
+ copyfiles(tab,docfiledir)
+ end
+ copyfiles(sourcefiles,sourcefiledir)
+ for _,file in pairs(textfiles) do
+ cp(file, currentdir, ctandir .. "/" .. ctanpkg)
+ end
+end
+
+-- Copy files to the correct places in the TDS tree
+function copytds()
+ local function install(source, dest, files, tool)
+ local moduledir = moduledir
+ -- For material associated with secondary tools (BibTeX, MakeIndex)
+ -- the structure needed is slightly different from those items going
+ -- into the tex/doc/source trees
+ if tool then
+ -- "base" is reserved for the tools themselves: make the assumption
+ -- in this case that the tdsroot name is the right place for stuff to
+ -- go (really just for the team)
+ if module == "base" then
+ moduledir = tdsroot
+ else
+ moduledir = module
+ end
+ end
+ -- Convert the file table(s) to a list of individual files
+ local filenames = { }
+ for _,i in ipairs(files) do
+ for _,j in ipairs(i) do
+ for file,_ in pairs(tree(source, j)) do
+ insert(filenames, file)
+ end
+ end
+ end
+ -- The target is only created if there are actual files to install
+ if next(filenames) ~= nil then
+ local installdir = tdsdir .. "/" .. dest .. "/" .. moduledir
+ mkdir(installdir)
+ for _,i in ipairs(filenames) do
+ cp(i, source, installdir)
+ end
+ end
+ end
+ install(
+ docfiledir,
+ "doc",
+ {bibfiles, demofiles, docfiles, pdffiles, textfiles, typesetlist}
+ )
+ install(unpackdir, "makeindex", {makeindexfiles}, true)
+ install(unpackdir, "bibtex/bst", {bstfiles}, true)
+ install(sourcefiledir, "source", {sourcelist})
+ install(unpackdir, "tex", {installfiles})
+ install(unpackdir, "scripts", {scriptfiles}, true)
+ -- Any script man files need special handling
+ for _,glob in pairs(scriptmanfiles) do
+ for file,_ in pairs(tree(docfiledir,glob)) do
+ -- Man files should have a single-digit extension: the type
+ local installdir = tdsdir .. "/doc/man/man" .. match(file,".$")
+ mkdir(installdir)
+ cp(file,docfiledir,installdir)
+ end
+ end
+end
+
+-- Standard versions of the main targets for building modules
+
+function ctan()
+ -- Always run tests for all engines
+ options["engine"] = nil
+ local function dirzip(dir, name)
+ local zipname = name .. ".zip"
+ local function tab_to_str(table)
+ local string = ""
+ for _,i in ipairs(table) do
+ string = string .. " " .. "\"" .. i .. "\""
+ end
+ return string
+ end
+ -- Convert the tables of files to quoted strings
+ local binfiles = tab_to_str(binaryfiles)
+ local exclude = tab_to_str(excludefiles)
+ -- First, zip up all of the text files
+ run(
+ dir,
+ zipexe .. " " .. zipopts .. " -ll ".. zipname .. " " .. "."
+ .. (
+ (binfiles or exclude) and (" -x" .. binfiles .. " " .. exclude)
+ or ""
+ )
+ )
+ -- Then add the binary ones
+ run(
+ dir,
+ zipexe .. " " .. zipopts .. " -g ".. zipname .. " " .. ". -i" ..
+ binfiles .. (exclude and (" -x" .. exclude) or "")
+ )
+ end
+ local errorlevel
+ local standalone = false
+ if bundle == "" then
+ standalone = true
+ end
+ if standalone then
+ errorlevel = check()
+ bundle = module
+ else
+ errorlevel = call(modules, "bundlecheck")
+ end
+ if errorlevel == 0 then
+ rmdir(ctandir)
+ mkdir(ctandir .. "/" .. ctanpkg)
+ rmdir(tdsdir)
+ mkdir(tdsdir)
+ if standalone then
+ errorlevel = bundlectan()
+ else
+ errorlevel = call(modules, "bundlectan")
+ end
+ else
+ print("\n====================")
+ print("Tests failed, zip stage skipped!")
+ print("====================\n")
+ return errorlevel
+ end
+ if errorlevel == 0 then
+ for _,i in ipairs(textfiles) do
+ for _,j in pairs({unpackdir, currentdir}) do
+ cp(i, j, ctandir .. "/" .. ctanpkg)
+ cp(i, j, tdsdir .. "/doc/" .. tdsroot .. "/" .. bundle)
+ end
+ end
+ dirzip(tdsdir, ctanpkg .. ".tds")
+ if packtdszip then
+ cp(ctanpkg .. ".tds.zip", tdsdir, ctandir)
+ end
+ dirzip(ctandir, ctanpkg)
+ cp(ctanpkg .. ".zip", ctandir, currentdir)
+ else
+ print("\n====================")
+ print("Typesetting failed, zip stage skipped!")
+ print("====================\n")
+ end
+ return errorlevel
+end
+
+function bundlectan()
+ -- Generate a list of individual file names excluding those in the second
+ -- argument: the latter is a table
+ local function excludelist(include, exclude, dir)
+ local include = include or { }
+ local exclude = exclude or { }
+ local dir = dir or currentdir
+ local includelist = { }
+ local excludelist = { }
+ for _,i in ipairs(exclude) do
+ for _,j in ipairs(i) do
+ for file,_ in pairs(tree(dir, j)) do
+ excludelist[file] = true
+ end
+ end
+ end
+ for _,i in ipairs(include) do
+ for file,_ in pairs(tree(dir, i)) do
+ if not excludelist[file] then
+ insert(includelist, file)
+ end
+ end
+ end
+ return includelist
+ end
+ unpack()
+ local errorlevel = doc()
+ if errorlevel == 0 then
+ -- Work out what PDF files are available
+ pdffiles = { }
+ for _,i in ipairs(typesetfiles) do
+ insert(pdffiles, (gsub(i, "%.%w+$", ".pdf")))
+ end
+ -- For the purposes here, any typesetting demo files need to be
+ -- part of the main typesetting list
+ local typesetfiles = typesetfiles
+ for _,v in pairs(typesetdemofiles) do
+ insert(typesetfiles, v)
+ end
+ typesetlist = excludelist(typesetfiles, {sourcefiles}, docfiledir)
+ sourcelist = excludelist(
+ sourcefiles, {bstfiles, installfiles, makeindexfiles, scriptfiles},
+ sourcefiledir
+ )
+ copyctan()
+ copytds()
+ end
+ return errorlevel
+end
+