summaryrefslogtreecommitdiffstats
path: root/src/python/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/package.py')
-rw-r--r--src/python/package.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/python/package.py b/src/python/package.py
new file mode 100644
index 00000000..9c79a944
--- /dev/null
+++ b/src/python/package.py
@@ -0,0 +1,124 @@
+import os
+import sys
+import optparse
+import zipfile
+import tarfile
+import tempfile
+import time
+
+def zip_library(f, extra_files = []):
+ lib = "%s/lib/python%s/"%(sys.prefix,sys.version[:3])
+
+ zf = zipfile.ZipFile(f, "w", zipfile.ZIP_DEFLATED)
+
+ for root, _, files in os.walk(lib):
+ arcroot = os.path.relpath(root, lib)
+ for f in files:
+ _, ext = os.path.splitext(f)
+ if ext in ['.py', '.pyo', '.pyc']:
+ zf.write(os.path.join(root,f), os.path.join(arcroot, f))
+
+ for s, r in extra_files:
+ zf.write( s, r )
+
+ zf.close()
+
+def add_dir(tf, dir, mtime):
+ ti = tarfile.TarInfo(dir)
+ ti.mode = 0777
+ ti.mtime = mtime
+ ti.type = tarfile.DIRTYPE
+
+ tf.addfile(ti)
+
+def add_fileobj(tf, f, arcname, mode, mtime):
+ ti = tarfile.TarInfo(arcname)
+ ti.mode = mode
+ ti.mtime = mtime
+
+ f.seek(0, os.SEEK_END)
+ ti.size = f.tell()
+
+ f.seek(0, os.SEEK_SET)
+ tf.addfile(ti, f)
+
+def add_file(tf, fname, arcname, mode, mtime):
+ f = open(fname, "rb")
+ add_fileobj(tf, f, arcname, mode, mtime)
+ f.close()
+
+def package(abc_exe, abc_sh, pyabc, ofname, scripts_dir, use_sys):
+ mtime = time.time()
+
+ tf = tarfile.open(ofname, "w:gz")
+
+ add_dir(tf, "pyabc", mtime)
+
+ add_dir(tf, "pyabc/bin", mtime)
+
+ add_file(tf, abc_exe, "pyabc/bin/abc_exe", 0777, mtime)
+ add_file(tf, abc_sh, "pyabc/bin/abc", 0777, mtime)
+
+ if scripts_dir:
+ for fn in os.listdir(scripts_dir):
+ fullname = os.path.join(scripts_dir, fn)
+ if os.path.isfile(fullname):
+ fnroot, fnext = os.path.splitext(fn)
+ if fnext==".sh":
+ add_file( tf, fullname, os.path.join("pyabc/bin", fnroot), 0777, mtime)
+ else:
+ add_file( tf, fullname, os.path.join("pyabc/scripts", fn), 0666, mtime)
+
+ add_dir(tf, "pyabc/lib", mtime)
+ add_file( tf, pyabc, "pyabc/lib/pyabc.py", 0666, mtime)
+
+ if not use_sys:
+ # ZIP standard library
+ zf = tempfile.NamedTemporaryFile("w+b")
+ #zip_library(zf, [(pyabc, "pyabc.py")])
+ zip_library(zf, [])
+ zf.flush()
+
+ add_fileobj(tf, zf, "pyabc/lib/python_library.zip", 0666, mtime)
+
+ zf.close()
+
+ # add all extensions
+
+ lib_dynload = os.path.join(sys.exec_prefix,"lib", "python%s"%sys.version[:3], "lib-dynload")
+
+ for fn in os.listdir(lib_dynload):
+ fullname = os.path.join(lib_dynload, fn)
+ if os.path.isfile(fullname):
+ add_file( tf, fullname, os.path.join("pyabc/lib", fn), 0666, mtime)
+
+ tf.close()
+
+
+def main(args):
+
+ usage = "usage: %prog [options]"
+
+ parser = optparse.OptionParser(usage)
+
+ parser.add_option("-a", "--abc", dest="abc", help="location of the ABC exeutable")
+ parser.add_option("-s", "--abc_sh", dest="abc_sh", help="location of the ABC setup script")
+ parser.add_option("-p", "--pyabc", dest="pyabc", help="location of pyabc.py")
+ parser.add_option("-o", "--out", dest="out", help="location of output tar gzipped file")
+ parser.add_option("-x", "--scripts", dest="scripts", default="scripts", help="location of scripts")
+ parser.add_option("-S", "--system", action="store_false", dest="sys", default=True, help="use default python installation")
+
+ options, args = parser.parse_args(args)
+
+ if len(args) > 1:
+ parser.print_help()
+ return 1
+
+ if not options.abc or not options.abc_sh or not options.pyabc or not options.out:
+ parser.print_help()
+ return 1
+
+ return package(options.abc, options.abc_sh, options.pyabc, options.out, options.scripts, options.sys)
+
+if __name__=="__main__":
+ main(sys.argv)