Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Unified Diff: tools/gn/ninja_build_writer.cc

Issue 2504133003: Add more gn documentation (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « tools/gn/ninja_build_writer.h ('k') | tools/gn/target.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/gn/ninja_build_writer.cc
diff --git a/tools/gn/ninja_build_writer.cc b/tools/gn/ninja_build_writer.cc
index 74a77878c42492afba7a9902aa3128a9506a3d17..2f2336cde034b77baf63cfcc8963f195b51347b5 100644
--- a/tools/gn/ninja_build_writer.cc
+++ b/tools/gn/ninja_build_writer.cc
@@ -341,6 +341,53 @@ bool NinjaBuildWriter::WriteSubninjas(Err* err) {
return true;
}
+const char kNinjaRules_Help[] =
+ R"(Ninja build rules
+
+The "all" and "default" rules
+
+ All generated targets (see "gn help execution") will be added to an implicit
+ build rule called "all" so "ninja all" will always compile everything. The
+ default rule will be used by Ninja if no specific target is specified (just
+ typing "ninja"). If there is a target named "//:default" it will be the
+ default build rule, otherwise the implicit "all" rule will be used.
+
+Phony rules
+
+ GN generates Ninja "phony" rules for targets in the default toolchain. The
+ phony rules can collide with each other and with the names of generated files
+ so are generated with the following priority:
+
+ 1. Actual files generated by the build always take precedence.
+
+ 2. Targets in the toplevel //BUILD.gn file.
+
+ 3. Targets in toplevel directories matching the names of the directories.
+ So "ninja foo" can be used to compile "//foo:foo". This only applies to
+ the first level of directories since usually these are the most
+ important (so this won't apply to "//foo/bar:bar").
+
+ 4. The short names of executables if there is only one executable with that
+ short name. Use "ninja doom_melon" to compile the
+ "//tools/fruit:doom_melon" executable.
+
+ 5. The short names of all targets if there is only one target with that
+ short name.
+
+ 6. Full label name with no leading slashes. So you can use
+ "ninja tools/fruit:doom_melon" to build "//tools/fruit:doom_melon".
+
+ 7. Labels with an implicit name part (when the short names match the
+ directory). So you can use "ninja foo/bar" to compile "//foo/bar:bar".
+
+ These "phony" rules are provided only for running Ninja since this matches
+ people's historical expectations for building. For consistency with the rest
+ of the program, GN introspection commands accept explicit labels.
+
+ To explicitly compile a target in a non-default toolchain, you must give
+ Ninja the exact name of the output file relative to the build directory.
+)";
+
bool NinjaBuildWriter::WritePhonyAndAllRules(Err* err) {
// Track rules as we generate them so we don't accidentally write a phony
// rule that collides with something else.
@@ -363,6 +410,10 @@ bool NinjaBuildWriter::WritePhonyAndAllRules(Err* err) {
std::map<std::string, Counts> short_names;
std::map<std::string, Counts> exes;
+ // ----------------------------------------------------
+ // If you change this algorithm, update the help above!
+ // ----------------------------------------------------
+
for (const Target* target : default_toolchain_targets_) {
const Label& label = target->label();
const std::string& short_name = label.name();
@@ -471,12 +522,6 @@ bool NinjaBuildWriter::WritePhonyAndAllRules(Err* err) {
written_rules.insert(medium_name).second)
WritePhonyRule(target, medium_name);
}
-
- // Write the short name if no other target shares that short name and
- // non of the higher-priority rules above claimed it.
- if (short_names[label.name()].count == 1 &&
- written_rules.insert(label.name()).second)
- WritePhonyRule(target, label.name());
}
// Write the autogenerated "all" rule.
« no previous file with comments | « tools/gn/ninja_build_writer.h ('k') | tools/gn/target.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698