diff options
author | Karl Berry <karl@freefriends.org> | 2018-03-08 23:45:11 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-03-08 23:45:11 +0000 |
commit | 64ee185d962cd13195e329ab4ac8a9da6535b677 (patch) | |
tree | 652f96f04e1826a75ef1c3a38ab3d2a72ff9c067 /Master/texmf-dist/scripts/l3build/l3build-ctan.lua | |
parent | a502f321bf373ab83e239389e55d622e6c6980e2 (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.lua | 245 |
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 + |