Merge pull request #1025 from nicolasdespres/resurrect-rules-tool

Resurrect the 'rules' tool.
This commit is contained in:
Jan Niklas Hasse 2019-05-09 17:38:06 +02:00 committed by GitHub
commit 1db07edafc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 0 deletions

View File

@ -283,6 +283,9 @@ target, show just the target's dependencies. _Available since Ninja 1.4._
`recompact`:: recompact the `.ninja_deps` file. _Available since Ninja 1.4._
`rules`:: output the list of all rules (eventually with their description
if they have one). It can be used to know which rule name to pass to
+ninja -t targets rule _name_+ or +ninja -t compdb+.
Writing your own Ninja files
----------------------------

View File

@ -131,3 +131,17 @@ string EvalString::Serialize() const {
}
return result;
}
string EvalString::Unparse() const {
string result;
for (TokenList::const_iterator i = parsed_.begin();
i != parsed_.end(); ++i) {
bool special = (i->second == SPECIAL);
if (special)
result.append("${");
result.append(i->first);
if (special)
result.append("}");
}
return result;
}

View File

@ -33,8 +33,13 @@ struct Env {
/// A tokenized string that contains variable references.
/// Can be evaluated relative to an Env.
struct EvalString {
/// @return The evaluated string with variable expanded using value found in
/// environment @a env.
string Evaluate(Env* env) const;
/// @return The string with variables not expanded.
string Unparse() const;
void Clear() { parsed_.clear(); }
bool empty() const { return parsed_.empty(); }

View File

@ -126,6 +126,7 @@ struct NinjaMain : public BuildLogUser {
int ToolCompilationDatabase(const Options* options, int argc, char* argv[]);
int ToolRecompact(const Options* options, int argc, char* argv[]);
int ToolUrtle(const Options* options, int argc, char** argv);
int ToolRules(const Options* options, int argc, char* argv[]);
/// Open the build log.
/// @return false on error.
@ -561,6 +562,55 @@ int NinjaMain::ToolTargets(const Options* options, int argc, char* argv[]) {
}
}
int NinjaMain::ToolRules(const Options* options, int argc, char* argv[]) {
// Parse options.
// The rules tool uses getopt, and expects argv[0] to contain the name of
// the tool, i.e. "rules".
argc++;
argv--;
bool print_description = false;
optind = 1;
int opt;
while ((opt = getopt(argc, argv, const_cast<char*>("hd"))) != -1) {
switch (opt) {
case 'd':
print_description = true;
break;
case 'h':
default:
printf("usage: ninja -t rules [options]\n"
"\n"
"options:\n"
" -d also print the description of the rule\n"
" -h print this message\n"
);
return 1;
}
}
argv += optind;
argc -= optind;
// Print rules
typedef map<string, const Rule*> Rules;
const Rules& rules = state_.bindings_.GetRules();
for (Rules::const_iterator i = rules.begin(); i != rules.end(); ++i) {
printf("%s", i->first.c_str());
if (print_description) {
const Rule* rule = i->second;
const EvalString* description = rule->GetBinding("description");
if (description != NULL) {
printf(": %s", description->Unparse().c_str());
}
}
printf("\n");
}
return 0;
}
enum PrintCommandMode { PCM_Single, PCM_All };
void PrintCommands(Edge* edge, set<Edge*>* seen, PrintCommandMode mode) {
if (!edge)
@ -841,6 +891,8 @@ const Tool* ChooseTool(const string& tool_name) {
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolCompilationDatabase },
{ "recompact", "recompacts ninja-internal data structures",
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolRecompact },
{ "rules", "list all rules",
Tool::RUN_AFTER_LOAD, &NinjaMain::ToolRules },
{ "urtle", NULL,
Tool::RUN_AFTER_FLAGS, &NinjaMain::ToolUrtle },
{ NULL, NULL, Tool::RUN_AFTER_FLAGS, NULL }