def glob(self, pathname, ondisk=True, source=False, strings=False, exclude=None):
        """
        Returns a list of Nodes (or strings) matching a specified
        pathname pattern.

        Pathname patterns follow UNIX shell semantics:  * matches
        any-length strings of any characters, ? matches any character,
        and [] can enclose lists or ranges of characters.  Matches do
        not span directory separators.

        The matches take into account Repositories, returning local
        Nodes if a corresponding entry exists in a Repository (either
        an in-memory Node or something on disk).

        By defafult, the glob() function matches entries that exist
        on-disk, in addition to in-memory Nodes.  Setting the "ondisk"
        argument to False (or some other non-true value) causes the glob()
        function to only match in-memory Nodes.  The default behavior is
        to return both the on-disk and in-memory Nodes.

        The "source" argument, when true, specifies that corresponding
        source Nodes must be returned if you're globbing in a build
        directory (initialized with VariantDir()).  The default behavior
        is to return Nodes local to the VariantDir().

        The "strings" argument, when true, returns the matches as strings,
        not Nodes.  The strings are path names relative to this directory.

        The "exclude" argument, if not None, must be a pattern or a list
        of patterns following the same UNIX shell semantics.
        Elements matching a least one pattern of this list will be excluded
        from the result.

        The underlying algorithm is adapted from the glob.glob() function
        in the Python library (but heavily modified), and uses fnmatch()
        under the covers.
        """
        dirname, basename = os.path.split(pathname)
        if not dirname:
            result = self._glob1(basename, ondisk, source, strings)
        else:
            if has_glob_magic(dirname):
                list = self.glob(dirname, ondisk, source, False, exclude)
            else:
                list = [self.Dir(dirname, create=True)]
            result = []
            for dir in list:
                r = dir._glob1(basename, ondisk, source, strings)
                if strings:
                    r = [os.path.join(str(dir), x) for x in r]
                result.extend(r)
        if exclude:
            excludes = []
            excludeList = SCons.Util.flatten(exclude)
            for x in excludeList:
                r = self.glob(x, ondisk, source, strings)
                excludes.extend(r)
            result = [x for x in result if not any(fnmatch.fnmatch(str(x), str(e)) for e in SCons.Util.flatten(excludes))]
        return sorted(result, key=lambda a: str(a))