Implement support for XZ dist tarball

Motivation
----------
Currenly tarballs for linux created manually. ZIP files are not
suitable, because they do not preserve unix file permissions.

Modification
------------
Implement 'koch xz' command to produce dist tarball in xz format. Also
the same command implemented in niminst.nim.

Result
------
Now it is easy to create source distribution for git stapshot and use it
further in packaging scripts.
This commit is contained in:
Sergey Avseyev 2015-05-26 12:51:31 +03:00
commit ba2aa474a1
2 changed files with 50 additions and 0 deletions

View file

@ -47,6 +47,7 @@ Possible Commands:
csource [options] builds the C sources for installation csource [options] builds the C sources for installation
pdf builds the PDF documentation pdf builds the PDF documentation
zip builds the installation ZIP package zip builds the installation ZIP package
xz builds the installation XZ package
nsis [options] builds the NSIS Setup installer (for Windows) nsis [options] builds the NSIS Setup installer (for Windows)
tests [options] run the testsuite tests [options] run the testsuite
update updates nim to the latest version from github update updates nim to the latest version from github
@ -112,6 +113,12 @@ proc targz(args: string) =
exec("$# --var:version=$# --var:mingw=none --main:compiler/nim.nim targz compiler/installer.ini" % exec("$# --var:version=$# --var:mingw=none --main:compiler/nim.nim targz compiler/installer.ini" %
["tools" / "niminst" / "niminst".exe, VersionAsString]) ["tools" / "niminst" / "niminst".exe, VersionAsString])
proc xz(args: string) =
exec("$3 cc -r $2 --var:version=$1 --var:mingw=none --main:compiler/nim.nim scripts compiler/installer.ini" %
[VersionAsString, compileNimInst, findNim()])
exec("$# --var:version=$# --var:mingw=none --main:compiler/nim.nim xz compiler/installer.ini" %
["tools" / "niminst" / "niminst".exe, VersionAsString])
proc buildTool(toolname, args: string) = proc buildTool(toolname, args: string) =
exec("$# cc $# $#" % [findNim(), args, toolname]) exec("$# cc $# $#" % [findNim(), args, toolname])
copyFile(dest="bin"/ splitFile(toolname).name.exe, source=toolname.exe) copyFile(dest="bin"/ splitFile(toolname).name.exe, source=toolname.exe)
@ -368,6 +375,7 @@ of cmdArgument:
of "csource", "csources": csource(op.cmdLineRest) of "csource", "csources": csource(op.cmdLineRest)
of "zip": zip(op.cmdLineRest) of "zip": zip(op.cmdLineRest)
of "targz": targz(op.cmdLineRest) of "targz": targz(op.cmdLineRest)
of "xz": xz(op.cmdLineRest)
of "nsis": nsis(op.cmdLineRest) of "nsis": nsis(op.cmdLineRest)
of "install": install(op.cmdLineRest) of "install": install(op.cmdLineRest)
of "test", "tests": tests(op.cmdLineRest) of "test", "tests": tests(op.cmdLineRest)

View file

@ -36,6 +36,7 @@ type
actionScripts # action: create install and deinstall scripts actionScripts # action: create install and deinstall scripts
actionZip, # action: create zip file actionZip, # action: create zip file
actionTargz, # action: create targz file actionTargz, # action: create targz file
actionXz, # action: create xz file
actionDeb # action: prepare deb package actionDeb # action: prepare deb package
FileCategory = enum FileCategory = enum
@ -173,6 +174,7 @@ proc parseCmdLine(c: var ConfigData) =
of "scripts": incl(c.actions, actionScripts) of "scripts": incl(c.actions, actionScripts)
of "zip": incl(c.actions, actionZip) of "zip": incl(c.actions, actionZip)
of "targz": incl(c.actions, actionTargz) of "targz": incl(c.actions, actionTargz)
of "xz": incl(c.actions, actionXz)
of "inno": incl(c.actions, actionInno) of "inno": incl(c.actions, actionInno)
of "nsis": incl(c.actions, actionNsis) of "nsis": incl(c.actions, actionNsis)
of "deb": incl(c.actions, actionDeb) of "deb": incl(c.actions, actionDeb)
@ -600,6 +602,44 @@ proc targzDist(c: var ConfigData) =
finally: finally:
setCurrentDir(oldDir) setCurrentDir(oldDir)
proc xzDist(c: var ConfigData) =
let proj = toLower(c.name) & "-" & c.version
var n = "$#.tar.xz" % proj
let tmpDir = if c.outdir.len == 0: "build" else: c.outdir
template processFile(z, dest, src) =
let s = src
let d = dest
echo "Copying ", s, " to ", tmpDir / d
let destdir = tmpdir / d.splitFile.dir
if not dirExists(destdir): createDir(destdir)
copyFile(s, tmpDir / d)
processFile(z, proj / buildBatFile32, "build" / buildBatFile32)
processFile(z, proj / buildBatFile64, "build" / buildBatFile64)
processFile(z, proj / buildShFile, "build" / buildShFile)
processFile(z, proj / makeFile, "build" / makeFile)
processFile(z, proj / installShFile, installShFile)
processFile(z, proj / deinstallShFile, deinstallShFile)
for f in walkFiles(c.libpath / "lib/*.h"):
processFile(z, proj / "c_code" / extractFilename(f), f)
for osA in 1..c.oses.len:
for cpuA in 1..c.cpus.len:
var dir = buildDir(osA, cpuA)
for k, f in walkDir("build" / dir):
if k == pcFile: processFile(z, proj / dir / extractFilename(f), f)
for cat in items({fcConfig..fcOther, fcUnix}):
for f in items(c.cat[cat]): processFile(z, proj / f, f)
let oldDir = getCurrentDir()
setCurrentDir(tmpDir)
try:
if execShellCmd("tar Jcf $1.tar.xz $1" % proj) != 0:
echo("External program failed")
finally:
setCurrentDir(oldDir)
# -- prepare build files for .deb creation # -- prepare build files for .deb creation
proc debDist(c: var ConfigData) = proc debDist(c: var ConfigData) =
@ -668,5 +708,7 @@ if actionZip in c.actions:
quit("libzip is not installed") quit("libzip is not installed")
if actionTargz in c.actions: if actionTargz in c.actions:
targzDist(c) targzDist(c)
if actionXz in c.actions:
xzDist(c)
if actionDeb in c.actions: if actionDeb in c.actions:
debDist(c) debDist(c)