| Index: tools/gn/command_check.cc
|
| diff --git a/tools/gn/command_check.cc b/tools/gn/command_check.cc
|
| index 467644bcfa79c884dd116cb7aac1238994ec6cd2..86caf85ce174ded739057ccb7609e49c2c86a9d5 100644
|
| --- a/tools/gn/command_check.cc
|
| +++ b/tools/gn/command_check.cc
|
| @@ -17,157 +17,153 @@
|
| namespace commands {
|
|
|
| const char kNoGnCheck_Help[] =
|
| - "nogncheck: Skip an include line from checking.\n"
|
| - "\n"
|
| - " GN's header checker helps validate that the includes match the build\n"
|
| - " dependency graph. Sometimes an include might be conditional or\n"
|
| - " otherwise problematic, but you want to specifically allow it. In this\n"
|
| - " case, it can be whitelisted.\n"
|
| - "\n"
|
| - " Include lines containing the substring \"nogncheck\" will be excluded\n"
|
| - " from header checking. The most common case is a conditional include:\n"
|
| - "\n"
|
| - " #if defined(ENABLE_DOOM_MELON)\n"
|
| - " #include \"tools/doom_melon/doom_melon.h\" // nogncheck\n"
|
| - " #endif\n"
|
| - "\n"
|
| - " If the build file has a conditional dependency on the corresponding\n"
|
| - " target that matches the conditional include, everything will always\n"
|
| - " link correctly:\n"
|
| - "\n"
|
| - " source_set(\"mytarget\") {\n"
|
| - " ...\n"
|
| - " if (enable_doom_melon) {\n"
|
| - " defines = [ \"ENABLE_DOOM_MELON\" ]\n"
|
| - " deps += [ \"//tools/doom_melon\" ]\n"
|
| - " }\n"
|
| - "\n"
|
| - " But GN's header checker does not understand preprocessor directives,\n"
|
| - " won't know it matches the build dependencies, and will flag this\n"
|
| - " include as incorrect when the condition is false.\n"
|
| - "\n"
|
| - "More information\n"
|
| - "\n"
|
| - " The topic \"gn help check\" has general information on how checking\n"
|
| - " works and advice on fixing problems. Targets can also opt-out of\n"
|
| - " checking, see \"gn help check_includes\".\n";
|
| + R"(nogncheck: Skip an include line from checking.
|
| +
|
| + GN's header checker helps validate that the includes match the build
|
| + dependency graph. Sometimes an include might be conditional or otherwise
|
| + problematic, but you want to specifically allow it. In this case, it can be
|
| + whitelisted.
|
| +
|
| + Include lines containing the substring "nogncheck" will be excluded from
|
| + header checking. The most common case is a conditional include:
|
| +
|
| + #if defined(ENABLE_DOOM_MELON)
|
| + #include "tools/doom_melon/doom_melon.h" // nogncheck
|
| + #endif
|
| +
|
| + If the build file has a conditional dependency on the corresponding target
|
| + that matches the conditional include, everything will always link correctly:
|
| +
|
| + source_set("mytarget") {
|
| + ...
|
| + if (enable_doom_melon) {
|
| + defines = [ "ENABLE_DOOM_MELON" ]
|
| + deps += [ "//tools/doom_melon" ]
|
| + }
|
| +
|
| + But GN's header checker does not understand preprocessor directives, won't
|
| + know it matches the build dependencies, and will flag this include as
|
| + incorrect when the condition is false.
|
| +
|
| +More information
|
| +
|
| + The topic "gn help check" has general information on how checking works and
|
| + advice on fixing problems. Targets can also opt-out of checking, see
|
| + "gn help check_includes".
|
| +)";
|
|
|
| const char kCheck[] = "check";
|
| const char kCheck_HelpShort[] =
|
| "check: Check header dependencies.";
|
| const char kCheck_Help[] =
|
| - "gn check <out_dir> [<label_pattern>] [--force]\n"
|
| - "\n"
|
| - " GN's include header checker validates that the includes for C-like\n"
|
| - " source files match the build dependency graph.\n"
|
| - "\n"
|
| - " \"gn check\" is the same thing as \"gn gen\" with the \"--check\" flag\n"
|
| - " except that this command does not write out any build files. It's\n"
|
| - " intended to be an easy way to manually trigger include file checking.\n"
|
| - "\n"
|
| - " The <label_pattern> can take exact labels or patterns that match more\n"
|
| - " than one (although not general regular expressions). If specified,\n"
|
| - " only those matching targets will be checked. See\n"
|
| - " \"gn help label_pattern\" for details.\n"
|
| - "\n"
|
| - "Command-specific switches\n"
|
| - "\n"
|
| - " --force\n"
|
| - " Ignores specifications of \"check_includes = false\" and checks\n"
|
| - " all target's files that match the target label.\n"
|
| - "\n"
|
| - "What gets checked\n"
|
| - "\n"
|
| - " The .gn file may specify a list of targets to be checked. Only these\n"
|
| - " targets will be checked if no label_pattern is specified on the\n"
|
| - " command line. Otherwise, the command-line list is used instead. See\n"
|
| - " \"gn help dotfile\".\n"
|
| - "\n"
|
| - " Targets can opt-out from checking with \"check_includes = false\"\n"
|
| - " (see \"gn help check_includes\").\n"
|
| - "\n"
|
| - " For targets being checked:\n"
|
| - "\n"
|
| - " - GN opens all C-like source files in the targets to be checked and\n"
|
| - " scans the top for includes.\n"
|
| - "\n"
|
| - " - Includes with a \"nogncheck\" annotation are skipped (see\n"
|
| - " \"gn help nogncheck\").\n"
|
| - "\n"
|
| - " - Only includes using \"quotes\" are checked. <brackets> are assumed\n"
|
| - " to be system includes.\n"
|
| - "\n"
|
| - " - Include paths are assumed to be relative to either the source root\n"
|
| - " or the \"root_gen_dir\" and must include all the path components.\n"
|
| - " (It might be nice in the future to incorporate GN's knowledge of\n"
|
| - " the include path to handle other include styles.)\n"
|
| - "\n"
|
| - " - GN does not run the preprocessor so will not understand\n"
|
| - " conditional includes.\n"
|
| - "\n"
|
| - " - Only includes matching known files in the build are checked:\n"
|
| - " includes matching unknown paths are ignored.\n"
|
| - "\n"
|
| - " For an include to be valid:\n"
|
| - "\n"
|
| - " - The included file must be in the current target, or there must\n"
|
| - " be a path following only public dependencies to a target with the\n"
|
| - " file in it (\"gn path\" is a good way to diagnose problems).\n"
|
| - "\n"
|
| - " - There can be multiple targets with an included file: only one\n"
|
| - " needs to be valid for the include to be allowed.\n"
|
| - "\n"
|
| - " - If there are only \"sources\" in a target, all are considered to\n"
|
| - " be public and can be included by other targets with a valid public\n"
|
| - " dependency path.\n"
|
| - "\n"
|
| - " - If a target lists files as \"public\", only those files are\n"
|
| - " able to be included by other targets. Anything in the sources\n"
|
| - " will be considered private and will not be includable regardless\n"
|
| - " of dependency paths.\n"
|
| - "\n"
|
| - " - Ouptuts from actions are treated like public sources on that\n"
|
| - " target.\n"
|
| - "\n"
|
| - " - A target can include headers from a target that depends on it\n"
|
| - " if the other target is annotated accordingly. See\n"
|
| - " \"gn help allow_circular_includes_from\".\n"
|
| - "\n"
|
| - "Advice on fixing problems\n"
|
| - "\n"
|
| - " If you have a third party project that uses relative includes,\n"
|
| - " it's generally best to exclude that target from checking altogether\n"
|
| - " via \"check_includes = false\".\n"
|
| - "\n"
|
| - " If you have conditional includes, make sure the build conditions\n"
|
| - " and the preprocessor conditions match, and annotate the line with\n"
|
| - " \"nogncheck\" (see \"gn help nogncheck\" for an example).\n"
|
| - "\n"
|
| - " If two targets are hopelessly intertwined, use the\n"
|
| - " \"allow_circular_includes_from\" annotation. Ideally each should have\n"
|
| - " identical dependencies so configs inherited from those dependencies\n"
|
| - " are consistent (see \"gn help allow_circular_includes_from\").\n"
|
| - "\n"
|
| - " If you have a standalone header file or files that need to be shared\n"
|
| - " between a few targets, you can consider making a source_set listing\n"
|
| - " only those headers as public sources. With only header files, the\n"
|
| - " source set will be a no-op from a build perspective, but will give a\n"
|
| - " central place to refer to those headers. That source set's files\n"
|
| - " will still need to pass \"gn check\" in isolation.\n"
|
| - "\n"
|
| - " In rare cases it makes sense to list a header in more than one\n"
|
| - " target if it could be considered conceptually a member of both.\n"
|
| - "\n"
|
| - "Examples\n"
|
| - "\n"
|
| - " gn check out/Debug\n"
|
| - " Check everything.\n"
|
| - "\n"
|
| - " gn check out/Default //foo:bar\n"
|
| - " Check only the files in the //foo:bar target.\n"
|
| - "\n"
|
| - " gn check out/Default \"//foo/*\n"
|
| - " Check only the files in targets in the //foo directory tree.\n";
|
| + R"(gn check <out_dir> [<label_pattern>] [--force]
|
| +
|
| + GN's include header checker validates that the includes for C-like source
|
| + files match the build dependency graph.
|
| +
|
| + "gn check" is the same thing as "gn gen" with the "--check" flag except that
|
| + this command does not write out any build files. It's intended to be an easy
|
| + way to manually trigger include file checking.
|
| +
|
| + The <label_pattern> can take exact labels or patterns that match more than
|
| + one (although not general regular expressions). If specified, only those
|
| + matching targets will be checked. See "gn help label_pattern" for details.
|
| +
|
| +Command-specific switches
|
| +
|
| + --force
|
| + Ignores specifications of "check_includes = false" and checks all
|
| + target's files that match the target label.
|
| +
|
| +What gets checked
|
| +
|
| + The .gn file may specify a list of targets to be checked. Only these targets
|
| + will be checked if no label_pattern is specified on the command line.
|
| + Otherwise, the command-line list is used instead. See "gn help dotfile".
|
| +
|
| + Targets can opt-out from checking with "check_includes = false" (see
|
| + "gn help check_includes").
|
| +
|
| + For targets being checked:
|
| +
|
| + - GN opens all C-like source files in the targets to be checked and scans
|
| + the top for includes.
|
| +
|
| + - Includes with a "nogncheck" annotation are skipped (see
|
| + "gn help nogncheck").
|
| +
|
| + - Only includes using "quotes" are checked. <brackets> are assumed to be
|
| + system includes.
|
| +
|
| + - Include paths are assumed to be relative to either the source root or the
|
| + "root_gen_dir" and must include all the path components. (It might be
|
| + nice in the future to incorporate GN's knowledge of the include path to
|
| + handle other include styles.)
|
| +
|
| + - GN does not run the preprocessor so will not understand conditional
|
| + includes.
|
| +
|
| + - Only includes matching known files in the build are checked: includes
|
| + matching unknown paths are ignored.
|
| +
|
| + For an include to be valid:
|
| +
|
| + - The included file must be in the current target, or there must be a path
|
| + following only public dependencies to a target with the file in it
|
| + ("gn path" is a good way to diagnose problems).
|
| +
|
| + - There can be multiple targets with an included file: only one needs to be
|
| + valid for the include to be allowed.
|
| +
|
| + - If there are only "sources" in a target, all are considered to be public
|
| + and can be included by other targets with a valid public dependency path.
|
| +
|
| + - If a target lists files as "public", only those files are able to be
|
| + included by other targets. Anything in the sources will be considered
|
| + private and will not be includable regardless of dependency paths.
|
| +
|
| + - Ouptuts from actions are treated like public sources on that target.
|
| +
|
| + - A target can include headers from a target that depends on it if the
|
| + other target is annotated accordingly. See "gn help
|
| + allow_circular_includes_from".
|
| +
|
| +Advice on fixing problems
|
| +
|
| + If you have a third party project that uses relative includes, it's generally
|
| + best to exclude that target from checking altogether via
|
| + "check_includes = false".
|
| +
|
| + If you have conditional includes, make sure the build conditions and the
|
| + preprocessor conditions match, and annotate the line with "nogncheck" (see
|
| + "gn help nogncheck" for an example).
|
| +
|
| + If two targets are hopelessly intertwined, use the
|
| + "allow_circular_includes_from" annotation. Ideally each should have identical
|
| + dependencies so configs inherited from those dependencies are consistent (see
|
| + "gn help allow_circular_includes_from").
|
| +
|
| + If you have a standalone header file or files that need to be shared between
|
| + a few targets, you can consider making a source_set listing only those
|
| + headers as public sources. With only header files, the source set will be a
|
| + no-op from a build perspective, but will give a central place to refer to
|
| + those headers. That source set's files will still need to pass "gn check" in
|
| + isolation.
|
| +
|
| + In rare cases it makes sense to list a header in more than one target if it
|
| + could be considered conceptually a member of both.
|
| +
|
| +Examples
|
| +
|
| + gn check out/Debug
|
| + Check everything.
|
| +
|
| + gn check out/Default //foo:bar
|
| + Check only the files in the //foo:bar target.
|
| +
|
| + gn check out/Default "//foo/*
|
| + Check only the files in targets in the //foo directory tree.
|
| +)";
|
|
|
| int RunCheck(const std::vector<std::string>& args) {
|
| if (args.size() != 1 && args.size() != 2) {
|
|
|