Пример #1
0
 def RelativePathExpr(self):
     StepExpr = self.StepExpr()
     steps = [StepExpr]
     while self._peek("r'\\/'", "r'\\/\\/'", "'\\|'", 'MUL_COMP',
                      'ADD_COMP', 'REL_COMP', 'EQ_COMP', "r'and'", "r'or'",
                      'END', "r'\\]'", "r'\\)'",
                      "r'\\,'") in ["r'\\/'", "r'\\/\\/'"]:
         _token_ = self._peek("r'\\/'", "r'\\/\\/'")
         if _token_ == "r'\\/'":
             self._scan("r'\\/'")
         else:  # == "r'\\/\\/'"
             self._scan("r'\\/\\/'")
             steps.append(X.AxisStep('descendant-or-self'))
         StepExpr = self.StepExpr()
         steps.append(StepExpr)
     return X.PathExpr(steps)
Пример #2
0
    def _get_clean_commands(self, mk_fmt, expr_fmt, graphs, submakefiles):
        if self.uses_builddir:
            for e in self.autoclean_extensions:
                p = expr.PathExpr([expr.LiteralExpr("*." + e)], expr.ANCHOR_BUILDDIR)
                yield "%s %s" % (self.del_command, expr_fmt.format(p))
        for g in graphs:
            for node in g.all_nodes():
                for f in node.outputs:
                    try:
                        if f.get_extension() not in self.autoclean_extensions:
                            yield "%s %s" % (self.del_command, expr_fmt.format(f))
                    except CannotDetermineError:
                        yield "%s %s" % (self.del_command, expr_fmt.format(f))

        for subname, subdir, subfile, subdeps in submakefiles:
            yield mk_fmt.submake_command(subdir, subfile, "clean")
Пример #3
0
def _make_build_nodes_for_file(toolset, target, srcfile, ft_to, files_map):
    src = srcfile.filename
    assert isinstance(src, expr.PathExpr)

    ext = src.get_extension()
    # FIXME: don't use target_basename.o form for object files, use just the basename,
    #        unless there's a conflict between two targets
    if srcfile in files_map:
        objbase = files_map[srcfile]
    else:
        objbase = src.get_basename()
    objname = expr.PathExpr(
        [expr.LiteralExpr("%s_%s" % (target.name, objbase))],
        expr.ANCHOR_BUILDDIR,
        pos=src.pos).change_extension(ft_to.extensions[0])

    ft_from = get_file_type(ext)
    compiler = get_compiler(toolset, ft_from, ft_to)
    if compiler is None:
        # Try to compile into source file, then into binaries. A typical use of
        # this is flex/bison parser generator.
        for ft_source in get_file_types_compilable_into(toolset, ft_to):
            if get_compiler(toolset, ft_from, ft_source) is not None:
                compilables, allnodes = _make_build_nodes_for_file(
                    toolset, target, srcfile, ft_source, files_map)
                objects = []
                for o in compilables:
                    for outf in o.outputs:
                        objn, alln = _make_build_nodes_for_file(
                            toolset, target,
                            model.SourceFile(target, outf, None), ft_to,
                            files_map)
                        objects += objn
                        allnodes += alln
                return (objects, allnodes)
        raise Error("don't know how to compile \"%s\" files into \"%s\"" %
                    (ft_from.name, ft_to.name))

    node = BuildNode(commands=compiler.commands(toolset, target, src, objname),
                     inputs=[src] + list(srcfile["dependencies"]),
                     outputs=[objname],
                     source_pos=srcfile.source_pos)
    return ([node], [node])
Пример #4
0
 def srcdir_as_path(self):
     p = os.path.relpath(self.srcdir, start=self.project.top_module.srcdir)
     return expr.PathExpr(
         [expr.LiteralExpr(x) for x in p.split(os.path.sep)],
         anchor=expr.ANCHOR_TOP_SRCDIR)
Пример #5
0
 def get_builddir_for(self, target):
     makefile = target["%s.makefile" % self.name]
     builddir = makefile.get_directory_path()
     return expr.PathExpr(builddir.components, expr.ANCHOR_TOP_BUILDDIR)