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)
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")
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])
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)
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)