def basenames(words): for w in words: dir, file = pathsplit(w, '') base, dot, suffix = util.strrpartition(file, '.') if dot == '': base = suffix yield dir + base
def pathsplit(path, default='./'): """ Splits a path into dirpart, filepart on the last slash. If there is no slash, dirpart is ./ """ dir, slash, file = util.strrpartition(path, '/') if dir == '': return default, file return dir + slash, file
def suffixes(words): for w in words: dir, file = pathsplit(w) base, dot, suffix = util.strrpartition(file, '.') if base != '': yield dot + suffix
def resolveimplicitrule(self, makefile, targetstack, rulestack): """ Try to resolve an implicit rule to build this target. """ # The steps in the GNU make manual Implicit-Rule-Search.html are very detailed. I hope they can be trusted. indent = getindent(targetstack) _log.info("%sSearching for implicit rule to make '%s'", indent, self.target) dir, s, file = util.strrpartition(self.target, '/') dir = dir + s candidates = [] # list of PatternRuleInstance hasmatch = util.any((r.hasspecificmatch(file) for r in makefile.implicitrules)) for r in makefile.implicitrules: if r in rulestack: _log.info("%s %s: Avoiding implicit rule recursion", indent, r.loc) continue if not len(r.commands): continue for ri in r.matchesfor(dir, file, hasmatch): candidates.append(ri) newcandidates = [] for r in candidates: depfailed = None for p in r.prerequisites: t = makefile.gettarget(p) t.resolvevpath(makefile) if not t.explicit and t.mtime is None: depfailed = p break if depfailed is not None: if r.doublecolon: _log.info("%s Terminal rule at %s doesn't match: prerequisite '%s' not mentioned and doesn't exist.", indent, r.loc, depfailed) else: newcandidates.append(r) continue _log.info("%sFound implicit rule at %s for target '%s'", indent, r.loc, self.target) self.rules.append(r) return # Try again, but this time with chaining and without terminal (double-colon) rules for r in newcandidates: newrulestack = rulestack + [r.prule] depfailed = None for p in r.prerequisites: t = makefile.gettarget(p) try: t.resolvedeps(makefile, targetstack, newrulestack, True) except ResolutionError: depfailed = p break if depfailed is not None: _log.info("%s Rule at %s doesn't match: prerequisite '%s' could not be made.", indent, r.loc, depfailed) continue _log.info("%sFound implicit rule at %s for target '%s'", indent, r.loc, self.target) self.rules.append(r) return _log.info("%sCouldn't find implicit rule to remake '%s'", indent, self.target)
def filepart(p): d, s, f = util.strrpartition(p, '/') return f
def dirpart(p): d, s, f = util.strrpartition(p, '/') if d == '': return '.' return d