summary refs log tree commit diff stats
path: root/tools/niminst/niminst.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tools/niminst/niminst.nim')
-rwxr-xr-xtools/niminst/niminst.nim92
1 files changed, 90 insertions, 2 deletions
diff --git a/tools/niminst/niminst.nim b/tools/niminst/niminst.nim
index 8f73ae93a..207df0d32 100755
--- a/tools/niminst/niminst.nim
+++ b/tools/niminst/niminst.nim
@@ -14,7 +14,7 @@ when haveZipLib:
   import zipfiles
 
 import
-  os, strutils, parseopt, parsecfg, strtabs, streams
+  os, strutils, parseopt, parsecfg, strtabs, streams, debcreation
 
 const
   maxOS = 20 # max number of OSes
@@ -30,7 +30,8 @@ type
     actionNone,   # action not yet known
     actionCSource # action: create C sources
     actionInno,   # action: create Inno Setup installer
-    actionZip     # action: create zip file
+    actionZip,    # action: create zip file
+    actionDeb     # action: prepare deb package
 
   TFileCategory = enum
     fcWinBin,     # binaries for Windows
@@ -56,6 +57,7 @@ type
     vars: PStringTable
     app: TAppType
     nimrodArgs: string
+    debOpts: TDebOptions
 
 const
   unixDirVars: array[fcConfig..fcLib, string] = [
@@ -86,6 +88,11 @@ proc initConfigData(c: var TConfigData) =
   c.uninstallScript = false
   c.vars = newStringTable(modeStyleInsensitive)
 
+  c.debOpts.buildDepends = ""
+  c.debOpts.pkgDepends = ""
+  c.debOpts.shortDesc = ""
+  c.debOpts.licenses = @[]
+
 proc firstBinPath(c: TConfigData): string =
   if c.binPaths.len > 0: result = c.binPaths[0]
   else: result = ""
@@ -121,6 +128,7 @@ Command:
   csource             build C source code for source based installations
   zip                 build the ZIP file
   inno                build the Inno Setup installer
+  deb                 create files for debhelper
 Options:
   -o, --output:dir    set the output directory
   --var:name=value    set the value of a variable
@@ -145,6 +153,7 @@ proc parseCmdLine(c: var TConfigData) =
           of "csource": incl(c.actions, actionCSource)
           of "zip": incl(c.actions, actionZip)
           of "inno": incl(c.actions, actionInno)
+          of "deb": incl(c.actions, actionDeb)
           else: quit(Usage)
       else:
         c.infile = addFileExt(key.string, "ini")
@@ -266,6 +275,36 @@ proc parseIniFile(c: var TConfigData) =
         of "innosetup": pathFlags(p, k.key, v, c.innoSetup)
         of "ccompiler": pathFlags(p, k.key, v, c.ccompiler)
         of "linker": pathFlags(p, k.key, v, c.linker)
+        of "deb":
+          case normalize(k.key)
+          of "builddepends":
+            c.debOpts.buildDepends = v
+          of "packagedepends", "pkgdepends":
+            c.debOpts.pkgDepends = v
+          of "shortdesc":
+            c.debOpts.shortDesc = v
+          of "licenses":
+            # file,license;file,license;
+            var i = 0
+            var file = ""
+            var license = ""
+            var afterComma = false
+            while i < v.len():
+              case v[i]
+              of ',':
+                afterComma = true
+              of ';':
+                if file == "" or license == "":
+                  quit(errorStr(p, "Invalid `licenses` key."))
+                c.debOpts.licenses.add((file, license))
+                afterComma = false
+                file = ""
+                license = ""
+              else:
+                if afterComma: license.add(v[i])
+                else: file.add(v[i])
+              inc(i)
+          else: quit(errorStr(p, "unknown variable: " & k.key))
         else: quit(errorStr(p, "invalid section: " & section))
 
       of cfgOption: quit(errorStr(p, "syntax error"))
@@ -415,6 +454,52 @@ when haveZipLib:
     else:
       quit("Cannot open for writing: " & n)
 
+# -- prepare build files for .deb creation
+
+proc debDist(c: var TConfigData) =
+  if not existsFile("build.sh"): quit("No build.sh found.")
+  if not existsFile("install.sh"): quit("No install.sh found.")
+  
+  if c.debOpts.shortDesc == "": quit("shortDesc must be set in the .ini file.")
+  if c.debOpts.licenses.len == 0:
+    echo("[Warning] No licenses specified for .deb creation.")
+  
+  # -- Copy files into /tmp/..
+  echo("Copying source to tmp/niminst/deb/")
+  var currentSource = getCurrentDir()
+  var workingDir = getTempDir() / "niminst" / "deb"
+  var upstreamSource = (c.name.toLower() & "-" & c.version)
+  
+  createDir(workingDir / upstreamSource)
+  
+  template copyNimDist(f, dest: string): stmt =
+    createDir((workingDir / upstreamSource / dest).splitFile.dir)
+    copyFile(currentSource / f, workingDir / upstreamSource / dest)
+  
+  # Don't copy all files, only the ones specified in the config:
+  copyNimDist(buildShFile, buildShFile)
+  copyNimDist(installShFile, installShFile)
+  createDir(workingDir / upstreamSource / "build")
+  for f in walkFiles(c.libpath / "lib/*.h"):
+    copyNimDist(f, "build" / extractFilename(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(dir):
+        if k == pcFile: copyNimDist(f, dir / extractFilename(f))
+  for cat in items({fcConfig..fcOther, fcUnix}):
+    for f in items(c.cat[cat]): copyNimDist(f, f)
+
+  # -- Create necessary build files for debhelper.
+
+  let mtnName = c.vars["mtnname"]
+  let mtnEmail = c.vars["mtnemail"]
+
+  prepDeb(c.name, c.version, mtnName, mtnEmail, c.debOpts.shortDesc,
+          c.description, c.debOpts.licenses, c.cat[fcUnixBin], c.cat[fcConfig],
+          c.cat[fcDoc], c.cat[fcLib], c.debOpts.buildDepends,
+          c.debOpts.pkgDepends)
+
 # ------------------- main ----------------------------------------------------
 
 var c: TConfigData
@@ -430,3 +515,6 @@ if actionZip in c.actions:
     zipdist(c)
   else:
     quit("libzip is not installed")
+if actionDeb in c.actions:
+  debDist(c)
+