+########################################################################
+# Code for adding source files of various types
+#
+class SourceMeta(type):
+ def __init__(cls, name, bases, dict):
+ super(SourceMeta, cls).__init__(name, bases, dict)
+ cls.all = []
+
+ def get(cls, **kwargs):
+ for src in cls.all:
+ for attr,value in kwargs.iteritems():
+ if getattr(src, attr) != value:
+ break
+ else:
+ yield src
+
+class SourceFile(object):
+ __metaclass__ = SourceMeta
+ def __init__(self, source):
+ tnode = source
+ if not isinstance(source, SCons.Node.FS.File):
+ tnode = File(source)
+
+ self.tnode = tnode
+ self.snode = tnode.srcnode()
+ self.filename = str(tnode)
+ self.dirname = dirname(self.filename)
+ self.basename = basename(self.filename)
+ index = self.basename.rfind('.')
+ if index <= 0:
+ # dot files aren't extensions
+ self.extname = self.basename, None
+ else:
+ self.extname = self.basename[:index], self.basename[index+1:]
+
+ for base in type(self).__mro__:
+ if issubclass(base, SourceFile):
+ bisect.insort_right(base.all, self)
+
+ def __lt__(self, other): return self.filename < other.filename
+ def __le__(self, other): return self.filename <= other.filename
+ def __gt__(self, other): return self.filename > other.filename
+ def __ge__(self, other): return self.filename >= other.filename
+ def __eq__(self, other): return self.filename == other.filename
+ def __ne__(self, other): return self.filename != other.filename
+
+class Source(SourceFile):
+ '''Add a c/c++ source file to the build'''
+ def __init__(self, source, Werror=True, swig=False, bin_only=False,
+ skip_lib=False):
+ super(Source, self).__init__(source)
+
+ self.Werror = Werror
+ self.swig = swig
+ self.bin_only = bin_only
+ self.skip_lib = bin_only or skip_lib
+
+class PySource(SourceFile):
+ '''Add a python source file to the named package'''