1*9356374aSAndroid Build Coastguard Worker // 2*9356374aSAndroid Build Coastguard Worker // Copyright 2019 The Abseil Authors. 3*9356374aSAndroid Build Coastguard Worker // 4*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 5*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 6*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 7*9356374aSAndroid Build Coastguard Worker // 8*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 9*9356374aSAndroid Build Coastguard Worker // 10*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 11*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 12*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 14*9356374aSAndroid Build Coastguard Worker // limitations under the License. 15*9356374aSAndroid Build Coastguard Worker // 16*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 17*9356374aSAndroid Build Coastguard Worker // File: usage_config.h 18*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 19*9356374aSAndroid Build Coastguard Worker // 20*9356374aSAndroid Build Coastguard Worker // This file defines the main usage reporting configuration interfaces and 21*9356374aSAndroid Build Coastguard Worker // documents Abseil's supported built-in usage flags. If these flags are found 22*9356374aSAndroid Build Coastguard Worker // when parsing a command-line, Abseil will exit the program and display 23*9356374aSAndroid Build Coastguard Worker // appropriate help messages. 24*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_FLAGS_USAGE_CONFIG_H_ 25*9356374aSAndroid Build Coastguard Worker #define ABSL_FLAGS_USAGE_CONFIG_H_ 26*9356374aSAndroid Build Coastguard Worker 27*9356374aSAndroid Build Coastguard Worker #include <functional> 28*9356374aSAndroid Build Coastguard Worker #include <string> 29*9356374aSAndroid Build Coastguard Worker 30*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h" 31*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 32*9356374aSAndroid Build Coastguard Worker 33*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 34*9356374aSAndroid Build Coastguard Worker // Built-in Usage Flags 35*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 36*9356374aSAndroid Build Coastguard Worker // 37*9356374aSAndroid Build Coastguard Worker // Abseil supports the following built-in usage flags. When passed, these flags 38*9356374aSAndroid Build Coastguard Worker // exit the program and : 39*9356374aSAndroid Build Coastguard Worker // 40*9356374aSAndroid Build Coastguard Worker // * --help 41*9356374aSAndroid Build Coastguard Worker // Shows help on important flags for this binary 42*9356374aSAndroid Build Coastguard Worker // * --helpfull 43*9356374aSAndroid Build Coastguard Worker // Shows help on all flags 44*9356374aSAndroid Build Coastguard Worker // * --helpshort 45*9356374aSAndroid Build Coastguard Worker // Shows help on only the main module for this program 46*9356374aSAndroid Build Coastguard Worker // * --helppackage 47*9356374aSAndroid Build Coastguard Worker // Shows help on all modules in the main package 48*9356374aSAndroid Build Coastguard Worker // * --version 49*9356374aSAndroid Build Coastguard Worker // Shows the version and build info for this binary and exits 50*9356374aSAndroid Build Coastguard Worker // * --only_check_args 51*9356374aSAndroid Build Coastguard Worker // Exits after checking all flags 52*9356374aSAndroid Build Coastguard Worker // * --helpon 53*9356374aSAndroid Build Coastguard Worker // Shows help on the modules named by this flag value 54*9356374aSAndroid Build Coastguard Worker // * --helpmatch 55*9356374aSAndroid Build Coastguard Worker // Shows help on modules whose name contains the specified substring 56*9356374aSAndroid Build Coastguard Worker 57*9356374aSAndroid Build Coastguard Worker namespace absl { 58*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 59*9356374aSAndroid Build Coastguard Worker 60*9356374aSAndroid Build Coastguard Worker namespace flags_internal { 61*9356374aSAndroid Build Coastguard Worker using FlagKindFilter = std::function<bool (absl::string_view)>; 62*9356374aSAndroid Build Coastguard Worker } // namespace flags_internal 63*9356374aSAndroid Build Coastguard Worker 64*9356374aSAndroid Build Coastguard Worker // FlagsUsageConfig 65*9356374aSAndroid Build Coastguard Worker // 66*9356374aSAndroid Build Coastguard Worker // This structure contains the collection of callbacks for changing the behavior 67*9356374aSAndroid Build Coastguard Worker // of the usage reporting routines in Abseil Flags. 68*9356374aSAndroid Build Coastguard Worker struct FlagsUsageConfig { 69*9356374aSAndroid Build Coastguard Worker // Returns true if flags defined in the given source code file should be 70*9356374aSAndroid Build Coastguard Worker // reported with --helpshort flag. For example, if the file 71*9356374aSAndroid Build Coastguard Worker // "path/to/my/code.cc" defines the flag "--my_flag", and 72*9356374aSAndroid Build Coastguard Worker // contains_helpshort_flags("path/to/my/code.cc") returns true, invoking the 73*9356374aSAndroid Build Coastguard Worker // program with --helpshort will include information about --my_flag in the 74*9356374aSAndroid Build Coastguard Worker // program output. 75*9356374aSAndroid Build Coastguard Worker flags_internal::FlagKindFilter contains_helpshort_flags; 76*9356374aSAndroid Build Coastguard Worker 77*9356374aSAndroid Build Coastguard Worker // Returns true if flags defined in the filename should be reported with 78*9356374aSAndroid Build Coastguard Worker // --help flag. For example, if the file 79*9356374aSAndroid Build Coastguard Worker // "path/to/my/code.cc" defines the flag "--my_flag", and 80*9356374aSAndroid Build Coastguard Worker // contains_help_flags("path/to/my/code.cc") returns true, invoking the 81*9356374aSAndroid Build Coastguard Worker // program with --help will include information about --my_flag in the 82*9356374aSAndroid Build Coastguard Worker // program output. 83*9356374aSAndroid Build Coastguard Worker flags_internal::FlagKindFilter contains_help_flags; 84*9356374aSAndroid Build Coastguard Worker 85*9356374aSAndroid Build Coastguard Worker // Returns true if flags defined in the filename should be reported with 86*9356374aSAndroid Build Coastguard Worker // --helppackage flag. For example, if the file 87*9356374aSAndroid Build Coastguard Worker // "path/to/my/code.cc" defines the flag "--my_flag", and 88*9356374aSAndroid Build Coastguard Worker // contains_helppackage_flags("path/to/my/code.cc") returns true, invoking the 89*9356374aSAndroid Build Coastguard Worker // program with --helppackage will include information about --my_flag in the 90*9356374aSAndroid Build Coastguard Worker // program output. 91*9356374aSAndroid Build Coastguard Worker flags_internal::FlagKindFilter contains_helppackage_flags; 92*9356374aSAndroid Build Coastguard Worker 93*9356374aSAndroid Build Coastguard Worker // Generates string containing program version. This is the string reported 94*9356374aSAndroid Build Coastguard Worker // when user specifies --version in a command line. 95*9356374aSAndroid Build Coastguard Worker std::function<std::string()> version_string; 96*9356374aSAndroid Build Coastguard Worker 97*9356374aSAndroid Build Coastguard Worker // Normalizes the filename specific to the build system/filesystem used. This 98*9356374aSAndroid Build Coastguard Worker // routine is used when we report the information about the flag definition 99*9356374aSAndroid Build Coastguard Worker // location. For instance, if your build resides at some location you do not 100*9356374aSAndroid Build Coastguard Worker // want to expose in the usage output, you can trim it to show only relevant 101*9356374aSAndroid Build Coastguard Worker // part. 102*9356374aSAndroid Build Coastguard Worker // For example: 103*9356374aSAndroid Build Coastguard Worker // normalize_filename("/my_company/some_long_path/src/project/file.cc") 104*9356374aSAndroid Build Coastguard Worker // might produce 105*9356374aSAndroid Build Coastguard Worker // "project/file.cc". 106*9356374aSAndroid Build Coastguard Worker std::function<std::string(absl::string_view)> normalize_filename; 107*9356374aSAndroid Build Coastguard Worker }; 108*9356374aSAndroid Build Coastguard Worker 109*9356374aSAndroid Build Coastguard Worker // SetFlagsUsageConfig() 110*9356374aSAndroid Build Coastguard Worker // 111*9356374aSAndroid Build Coastguard Worker // Sets the usage reporting configuration callbacks. If any of the callbacks are 112*9356374aSAndroid Build Coastguard Worker // not set in usage_config instance, then the default value of the callback is 113*9356374aSAndroid Build Coastguard Worker // used. 114*9356374aSAndroid Build Coastguard Worker void SetFlagsUsageConfig(FlagsUsageConfig usage_config); 115*9356374aSAndroid Build Coastguard Worker 116*9356374aSAndroid Build Coastguard Worker namespace flags_internal { 117*9356374aSAndroid Build Coastguard Worker 118*9356374aSAndroid Build Coastguard Worker FlagsUsageConfig GetUsageConfig(); 119*9356374aSAndroid Build Coastguard Worker 120*9356374aSAndroid Build Coastguard Worker void ReportUsageError(absl::string_view msg, bool is_fatal); 121*9356374aSAndroid Build Coastguard Worker 122*9356374aSAndroid Build Coastguard Worker } // namespace flags_internal 123*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 124*9356374aSAndroid Build Coastguard Worker } // namespace absl 125*9356374aSAndroid Build Coastguard Worker 126*9356374aSAndroid Build Coastguard Worker extern "C" { 127*9356374aSAndroid Build Coastguard Worker 128*9356374aSAndroid Build Coastguard Worker // Additional report of fatal usage error message before we std::exit. Error is 129*9356374aSAndroid Build Coastguard Worker // fatal if is_fatal argument to ReportUsageError is true. 130*9356374aSAndroid Build Coastguard Worker void ABSL_INTERNAL_C_SYMBOL(AbslInternalReportFatalUsageError)( 131*9356374aSAndroid Build Coastguard Worker absl::string_view); 132*9356374aSAndroid Build Coastguard Worker 133*9356374aSAndroid Build Coastguard Worker } // extern "C" 134*9356374aSAndroid Build Coastguard Worker 135*9356374aSAndroid Build Coastguard Worker #endif // ABSL_FLAGS_USAGE_CONFIG_H_ 136