[cig-commits] commit: Add back in dist.py, since it is needed by the build scripts

Mercurial hg at geodynamics.org
Mon Apr 5 14:34:24 PDT 2010


changeset:   280:407e8078f9a8
tag:         tip
user:        Walter Landry <wlandry at caltech.edu>
date:        Mon Apr 05 13:51:50 2010 -0700
files:       script/dist.py
description:
Add back in dist.py, since it is needed by the build scripts


diff -r 15bf95dfc3cf -r 407e8078f9a8 script/dist.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/script/dist.py	Mon Apr 05 13:51:50 2010 -0700
@@ -0,0 +1,220 @@
+import os, shutil
+from SCons.Script import *
+
+class ToolInstWarning(SCons.Warnings.Warning):
+    pass
+
+SCons.Warnings.enableWarningClass(ToolInstWarning)
+
+def to_list(var):
+    if isinstance(var, str):
+        return [var]
+    elif var is None:
+        return []
+    elif isinstance(var, list):
+        return var
+    elif isinstance(var, tuple):
+        return list(var)
+    else:
+        return [var]
+
+def multiget(dicts, key, default=None):
+    for d in dicts:
+        if d.has_key(key):
+            return d[key]
+    else:
+        return default
+
+def copytree(src, dest, symlinks=False, ignore=None):
+    def copyItems(src, dest):
+        dir_list = os.listdir(src)
+        if ignore:
+            ignored = ignore(src, dir_list)
+            dir_list = [n for n in dir_list if n not in ignored]
+        for item in dir_list:
+            srcPath = os.path.join(src, item)
+            if os.path.isdir(srcPath):
+                srcBasename = os.path.basename(srcPath)
+                destDirPath = os.path.join(dest, srcBasename)
+                if not os.path.exists(destDirPath):
+                    os.makedirs(destDirPath)
+                copyItems(srcPath, destDirPath)
+            elif os.path.islink(srcPath):
+                pass
+#             elif os.path.islink(srcPath) and symlinks:
+#                 linkto = os.readlink(srcPath)
+#                 os.symlink(linkto, dest)
+            else:
+                shutil.copy2(srcPath, dest)
+ 
+    # case 'cp -R src/ dest/' where dest/ already exists
+    if os.path.exists(dest):
+        if os.path.isdir(src):
+            destPath = os.path.join(dest, os.path.basename(src))
+            if not os.path.exists(destPath):
+                os.makedirs(destPath)
+        else:
+            destPath = dest
+    # case 'cp -R src/ dest/' where dest/ does not exist
+    else:
+        os.makedirs(dest)
+        destPath = dest
+    # actually copy the files
+    if os.path.isdir(src):
+        copyItems(src, destPath)
+    else:
+        shutil.copy2(src, destPath)
+
+def check_target(env, target_name, **kw):
+    target = multiget([kw, env], target_name)
+    return target in COMMAND_LINE_TARGETS
+
+def check_inst_target(env, **kw):
+    return check_target(env, "INST_TARGET", **kw) or \
+        check_target(env, "BIN_TARGET", **kw)
+
+def check_bin_target(env, **kw):
+    return check_target(env, "BIN_TARGET", **kw)
+
+def check_dist_target(env, **kw):
+    return check_target(env, "DIST_TARGET", **kw)
+
+def get_prefix(env, **kw):
+    if check_inst_target(env, **kw):
+        prefix = multiget([kw, env], "INST_PREFIX", "")
+    else:
+        prefix = multiget([kw, env], "INST_BUILD_DIR", "")
+    return prefix
+
+def modify_args(env, **kw):
+    new_kw = dict(kw)
+    if check_inst_target(env, **kw):
+        prefix = multiget([kw, env], "INST_PREFIX", "")
+        build_dir = multiget([kw, env], "INST_BUILD_DIR", "")
+
+        if build_dir:
+            rpaths = multiget([kw, env], "RPATH", [])
+            if not isinstance(rpaths, list):
+                rpaths = [rpaths]
+            rpaths = [p for p in rpaths if p != build_dir + "/lib"]
+        rpaths.append(prefix + "/lib")
+
+        if build_dir:
+            lib_paths = multiget([kw, env], "LIBPATH", [])
+            if not isinstance(lib_paths, list):
+                lib_paths = [lib_paths]
+            lib_paths = [p for p in lib_paths if p != build_dir + "/lib"]
+        lib_paths.append(prefix + "/lib")
+
+        new_kw["RPATH"] = rpaths
+        new_kw["LIBPATH"] = lib_paths
+
+    return new_kw
+
+def generate(env, **kw):
+
+    env.SetDefault(INST_TARGET="install",
+                   DIST_TARGET="dist",
+                   DIST_EXCLUDE_PATTERNS=[".*", "*.pyc"],
+                   BIN_TARGET="binary")
+
+    def Install(env, target, source, **kw):
+        prefix = get_prefix(env, **kw)
+        nodes = env.SConsInstall(os.path.join(prefix, target[0]), source, **kw)
+        return nodes
+
+    def Library(env, target, source, **kw):
+        prefix = get_prefix(env, **kw)
+        nodes = env.SConsLibrary(os.path.join(prefix, target[0]), source, **kw)
+        return nodes
+
+    def SharedLibrary(env, target, source, **kw):
+        prefix = get_prefix(env, **kw)
+        new_kw = modify_args(env, **kw)
+        nodes = env.SConsSharedLibrary(os.path.join(prefix, target[0]), source, **new_kw)
+        return nodes
+
+    def Program(env, target, source, **kw):
+        prefix = get_prefix(env, **kw)
+        new_kw = modify_args(env, **kw)
+        nodes = env.SConsProgram(os.path.join(prefix, target[0]), source, **new_kw)
+        return nodes
+
+    def Dist(env, target, source, **kw):
+        if check_dist_target(env, **kw):
+            n = env.DistTar(target, source, **kw)
+            env.Alias(multiget([kw, env], "DIST_TARGET"), n)
+            env.AlwaysBuild(n)
+        else:
+            n = []
+        return n
+
+    def DistTarAction(target, source, env):
+        import shutil, fnmatch, tarfile
+
+        def ignore(cur_dir, cur_names):
+            ptrns = to_list(env.get("DIST_EXCLUDE_PATTERNS", []))
+            excludes = []
+            for n in cur_names:
+                if target[0].abspath == os.path.join(cur_dir, n):
+                    excludes.append(n)
+                    continue
+                for p in ptrns:
+                    if fnmatch.fnmatch(n, p):
+                        excludes.append(n)
+            return excludes
+
+        import tempfile
+        tmp_dir = tempfile.mkdtemp()
+        src_dir = os.path.basename(str(target[0]))[:-len(".tar.gz")]
+
+        dir = os.path.join(tmp_dir, src_dir)
+        for s in source:
+            copytree(str(s), dir, symlinks=True, ignore=ignore)
+
+        f = tarfile.open(str(target[0]), "w:gz")
+        old_dir = os.getcwd()
+        os.chdir(tmp_dir)
+        f.add(src_dir)
+        f.close()
+        os.chdir(old_dir)
+
+    def DistTarPrint(target, source, env):
+        return "Creating distribution '%s'"%(target[0])
+
+#     def Binary(env, target, source, **kw):
+#         dir = multiget([kw, env], "DIST_TMP_DIR")
+#         env.Command([Mkdir(dir), Copy(dir
+#         target = source
+#         prefix = multiget([kw, env], "INST_PREFIX")
+#         dist_target = multiget([kw, env], "DIST_TARGET")
+#         if dist_target is None or prefix is None or \
+#                 dist_target not in COMMAND_LINE_TARGETS:
+#             return []
+#         env.Command(target[0], prefix, Mkdir(target[0]))
+#         return env.Alias(dist_target, target[0],
+#                          env.Tar(env.CopyAs(Dir(target[0]), Dir(prefix)),
+#                                  TARFLAGS="-cz",
+#                                  TARSUFFIX=".tar.gz"),
+#                          Mkdir(Dir(prefix)))
+
+    env.SConsInstall = env.Install
+    env["BUILDERS"]["Install"] = Install
+    env["BUILDERS"]["SConsLibrary"] = env["BUILDERS"]["Library"]
+    env["BUILDERS"]["Library"] = Library
+    env["BUILDERS"]["SConsSharedLibrary"] = env["BUILDERS"]["SharedLibrary"]
+    env["BUILDERS"]["SharedLibrary"] = SharedLibrary
+    env["BUILDERS"]["SConsProgram"] = env["BUILDERS"]["Program"]
+    env["BUILDERS"]["Program"] = Program
+    env["BUILDERS"]["Dist"] = Dist
+    env["BUILDERS"]["DistTar"] = env.Builder(action=env.Action(DistTarAction, DistTarPrint),
+                                             suffix="tar.gz",
+                                             target_factory=env.File,
+                                             source_factory=env.fs.Entry)
+
+    AddOption("--dist-version", dest="dist_version", nargs=1, type="string",
+              action="store", help="Distribution version",
+              default="unknown")
+
+def exists(env):
+    return True



More information about the CIG-COMMITS mailing list