2005-01-02 22:05:17 +00:00
|
|
|
# -*- python -*-
|
|
|
|
"""
|
|
|
|
SCons builder for creating source tars.
|
|
|
|
"""
|
|
|
|
|
|
|
|
import SCons
|
|
|
|
from SCons.Node.FS import Base
|
2005-01-09 20:02:09 +00:00
|
|
|
from SCons.Node.Python import Value
|
|
|
|
|
|
|
|
class DistSourceOfFile(Value): pass
|
2005-01-02 22:05:17 +00:00
|
|
|
|
|
|
|
def _e_dist(target, source, env):
|
|
|
|
|
2005-01-09 20:02:09 +00:00
|
|
|
def collect_sources(sources, collected, done):
|
2005-01-02 22:05:17 +00:00
|
|
|
for s in sources:
|
2005-01-09 20:02:09 +00:00
|
|
|
if done.has_key(s): continue
|
2005-01-02 22:05:17 +00:00
|
|
|
done[s] = None
|
|
|
|
if not s.is_derived(): # this node is not built (nor side-effect)
|
|
|
|
#assert not s.all_children()
|
|
|
|
if isinstance(s, Base) and s.is_under(env.fs.Dir('#')):
|
2005-01-09 21:11:49 +00:00
|
|
|
if not s.srcnode().exists():
|
|
|
|
print 'warning: file', s.srcnode(), 'is missing'
|
|
|
|
else:
|
|
|
|
collected[s] = None
|
2005-01-02 22:05:17 +00:00
|
|
|
else:
|
2005-01-09 20:02:09 +00:00
|
|
|
collect_sources(s.all_children(scan=1), collected, done)
|
2005-01-02 22:05:17 +00:00
|
|
|
|
|
|
|
def cmp_path(a, b):
|
|
|
|
return cmp(a.get_path(), b.get_path())
|
|
|
|
|
2005-01-09 20:02:09 +00:00
|
|
|
collected = {}; done = {}
|
|
|
|
for s in source:
|
|
|
|
if isinstance(s, DistSourceOfFile):
|
|
|
|
collect_sources([s.value], collected, done)
|
|
|
|
else:
|
|
|
|
collected[s] = None
|
2005-01-02 22:05:17 +00:00
|
|
|
collected = [ c.srcnode() for c in collected.keys() ]
|
|
|
|
collected.sort(cmp_path)
|
|
|
|
return (target, collected)
|
|
|
|
|
|
|
|
def DistTar(target, source, env):
|
|
|
|
import tarfile
|
|
|
|
tar = tarfile.open(str(target[0]), "w:gz")
|
|
|
|
for name in source:
|
|
|
|
name = str(name)
|
|
|
|
tar.add(name, env.subst('${PACKAGE}-${VERSION}/') + name)
|
|
|
|
tar.close()
|
|
|
|
|
|
|
|
def _str_DistTar(target, source, env):
|
|
|
|
return env.subst('tar czf $TARGET $SOURCES')
|
|
|
|
|
|
|
|
_builder = SCons.Builder.Builder(
|
|
|
|
action="$TARCOM",
|
|
|
|
emitter = _e_dist,
|
|
|
|
multi = 1,
|
|
|
|
)
|
|
|
|
|
|
|
|
_builder_dist = SCons.Builder.Builder(
|
|
|
|
action=SCons.Action.Action(DistTar,strfunction=_str_DistTar),
|
|
|
|
emitter = _e_dist,
|
2005-01-09 20:02:09 +00:00
|
|
|
multi = 1,
|
2005-01-02 22:05:17 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
def generate(env):
|
|
|
|
env['BUILDERS']['SourceTar'] = _builder
|
|
|
|
env['BUILDERS']['DistTar'] = _builder_dist
|
2005-01-09 20:02:09 +00:00
|
|
|
env.DistSourceOfFile = DistSourceOfFile
|
2005-01-02 22:05:17 +00:00
|
|
|
|
|
|
|
def exists(env):
|
|
|
|
import SCons.Tools.tar
|
|
|
|
return SCons.Tools.tar.exists(env)
|