Remake
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Functions
Rule resolution

Functions

static void substitute_pattern (std::string const &pat, string_list const &src, string_list &dst)
 
static rule_t find_generic_rule (std::string const &target)
 
static rule_t find_rule (std::string const &target)
 

Detailed Description

Function Documentation

static rule_t find_generic_rule ( std::string const &  target)
static

Find a generic rule matching target:

  • the one leading to shorter matches has priority,
  • among equivalent rules, the earliest one has priority.

Definition at line 1686 of file remake.cpp.

Referenced by find_rule().

1687 {
1688  size_t tlen = target.length(), plen = tlen + 1;
1689  rule_t rule;
1690  for (rule_list::const_iterator i = generic_rules.begin(),
1691  i_end = generic_rules.end(); i != i_end; ++i)
1692  {
1693  for (string_list::const_iterator j = i->targets.begin(),
1694  j_end = i->targets.end(); j != j_end; ++j)
1695  {
1696  size_t len = j->length();
1697  if (tlen < len) continue;
1698  if (plen <= tlen - (len - 1)) continue;
1699  size_t pos = j->find('%');
1700  if (pos == std::string::npos) continue;
1701  size_t len2 = len - (pos + 1);
1702  if (j->compare(0, pos, target, 0, pos) ||
1703  j->compare(pos + 1, len2, target, tlen - len2, len2))
1704  continue;
1705  plen = tlen - (len - 1);
1706  rule = rule_t();
1707  rule.stem = target.substr(pos, plen);
1708  rule.script = i->script;
1709  substitute_pattern(rule.stem, i->targets, rule.targets);
1710  substitute_pattern(rule.stem, i->deps, rule.deps);
1711  break;
1712  }
1713  }
1714  return rule;
1715 }
static rule_t find_rule ( std::string const &  target)
static

Find a specific rule matching target. Return a generic one otherwise. If there is both a specific rule with an empty script and a generic rule, the generic one is returned after adding the dependencies of the specific one.

Definition at line 1722 of file remake.cpp.

Referenced by start().

1723 {
1724  rule_map::const_iterator i = specific_rules.find(target),
1725  i_end = specific_rules.end();
1726  // If there is a specific rule with a script, return it.
1727  if (i != i_end && !i->second->script.empty()) return *i->second;
1728  rule_t grule = find_generic_rule(target);
1729  // If there is no generic rule, return the specific rule (no script), if any.
1730  if (grule.targets.empty())
1731  {
1732  if (i != i_end) return *i->second;
1733  return grule;
1734  }
1735  // Optimize the lookup when there is only one target (already looked up).
1736  if (grule.targets.size() == 1)
1737  {
1738  if (i == i_end) return grule;
1739  grule.deps.insert(grule.deps.end(),
1740  i->second->deps.begin(), i->second->deps.end());
1741  grule.vars.insert(grule.vars.end(),
1742  i->second->vars.begin(), i->second->vars.end());
1743  return grule;
1744  }
1745  // Add the dependencies of the specific rules of every target to the
1746  // generic rule. If any of those rules has a nonempty script, error out.
1747  for (string_list::const_iterator j = grule.targets.begin(),
1748  j_end = grule.targets.end(); j != j_end; ++j)
1749  {
1750  i = specific_rules.find(*j);
1751  if (i == i_end) continue;
1752  if (!i->second->script.empty()) return rule_t();
1753  grule.deps.insert(grule.deps.end(),
1754  i->second->deps.begin(), i->second->deps.end());
1755  grule.vars.insert(grule.vars.end(),
1756  i->second->vars.begin(), i->second->vars.end());
1757  }
1758  return grule;
1759 }
static void substitute_pattern ( std::string const &  pat,
string_list const &  src,
string_list dst 
)
static

Substitute a pattern into a list of strings.

Definition at line 1670 of file remake.cpp.

Referenced by find_generic_rule().

1671 {
1672  for (string_list::const_iterator i = src.begin(),
1673  i_end = src.end(); i != i_end; ++i)
1674  {
1675  size_t pos = i->find('%');
1676  if (pos == std::string::npos)dst.push_back(*i);
1677  else dst.push_back(i->substr(0, pos) + pat + i->substr(pos + 1));
1678  }
1679 }