mirror of
https://github.com/reactos/ninja.git
synced 2025-02-21 12:10:28 +00:00
Merge pull request #1025 from nicolasdespres/resurrect-rules-tool
Resurrect the 'rules' tool.
This commit is contained in:
commit
1db07edafc
@ -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
|
||||
----------------------------
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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(); }
|
||||
|
||||
|
52
src/ninja.cc
52
src/ninja.cc
@ -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 }
|
||||
|
Loading…
x
Reference in New Issue
Block a user