| Index: tools/nixysa/third_party/gflags-1.0/doc/gflags.html
|
| ===================================================================
|
| --- tools/nixysa/third_party/gflags-1.0/doc/gflags.html (revision 0)
|
| +++ tools/nixysa/third_party/gflags-1.0/doc/gflags.html (revision 0)
|
| @@ -0,0 +1,495 @@
|
| +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
| +
|
| +<html>
|
| +<head>
|
| +<title>How To Use Google Commandline Flags</title>
|
| +
|
| +<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
| +<link href="http://www.google.com/favicon.ico" type="image/x-icon"
|
| + rel="shortcut icon">
|
| +<link href="designstyle.css" type="text/css" rel="stylesheet">
|
| +<style type="text/css">
|
| +<!--
|
| + ol.bluelist li {
|
| + color: #3366ff;
|
| + font-family: sans-serif;
|
| + }
|
| + ol.bluelist li p {
|
| + color: #000;
|
| + font-family: "Times Roman", times, serif;
|
| + }
|
| + ul.blacklist li {
|
| + color: #000;
|
| + font-family: "Times Roman", times, serif;
|
| + }
|
| +//-->
|
| +</style>
|
| +</head>
|
| +
|
| +<body>
|
| +
|
| +<h1>How To Use Google Commandline Flags (gflags)</h1>
|
| +<small>(as of
|
| +<script type=text/javascript>
|
| + var lm = new Date(document.lastModified);
|
| + document.write(lm.toDateString());
|
| +</script>)
|
| +</small>
|
| +<br>
|
| +
|
| +
|
| +<h2> <A NAME=intro>Introduction, and Comparison to Other Commandline
|
| + Flags Libraries</A> </h2>
|
| +
|
| +<p><b>Commandline flags</b> are flags that users specify on the
|
| +command line when they run an executable. In the command</p>
|
| +<pre>
|
| + fgrep -l -f /var/tmp/foo johannes brahms
|
| +</pre>
|
| +<p><code>-l</code> and <code>-f /var/tmp/foo</code> are the two
|
| +commandline flags. (<code>johannes</code> and <code>brahms</code>,
|
| +which don't start with a dash, are <b>commandline arguments</b>.)</p>
|
| +
|
| +<p>Typically, an application lists what flags the user is allowed to
|
| +pass in, and what arguments they take -- in this example,
|
| +<code>-l</code> takes no argument, and <code>-f</code> takes a
|
| +string (in particular, a filename) as an argument. Users can use a
|
| +library to help parse the commandline and store the flags in some data
|
| +structure.</p>
|
| +
|
| +<p>Google's commandline flags library differs from other libraries,
|
| +such as <code>getopt()</code>, in that flag definitions can be
|
| +scattered around the source code, and not just listed in one place
|
| +such as <code>main()</code>. In practice, this means that a single
|
| +source-code file will define and use flags that are meaningful to that
|
| +file. Any application that links in that file will get the flags, and
|
| +the google commandline flags library will automatically handle that
|
| +flag appropriately.</p>
|
| +
|
| +<p>There's significant gain in flexibility, and ease of code reuse,
|
| +due to this technique. However, there is a danger that two files will
|
| +define the same flag, and then give an error when they're linked
|
| +together.</p>
|
| +
|
| +<p>The rest of this document describes how to use the commandlineflag
|
| +library. It's a C++ library, so examples are in C++. However, there
|
| +is a Python port with the same functionality, and this discussion
|
| +translates directly to Python.</p>
|
| +
|
| +
|
| +<h2> <A name=define>DEFINE: Defining Flags In Program</A> </h2>
|
| +
|
| +<p> Defining a flag is easy: just use the appropriate macro for the
|
| +type you want the flag to be, as defined at the bottom of
|
| +<code>gflags/gflags.h</code>. Here's an example file,
|
| +<code>foo.cc</code>:</p>
|
| +
|
| +<pre>
|
| + #include <gflags/gflags.h>
|
| +
|
| + DEFINE_bool(big_menu, true, "Include 'advanced' options in the menu listing");
|
| + DEFINE_string(languages, "english,french,german",
|
| + "comma-separated list of languages to offer in the 'lang' menu");
|
| +</pre>
|
| +
|
| +<p><code>DEFINE_bool</code> defines a boolean flag. Here are the
|
| +types supported:</p>
|
| +<ul>
|
| + <li> <code>DEFINE_bool</code>: boolean
|
| + <li> <code>DEFINE_int32</code>: 32-bit integer
|
| + <li> <code>DEFINE_int64</code>: 64-bit integer
|
| + <li> <code>DEFINE_uint64</code>: unsigned 64-bit integer
|
| + <li> <code>DEFINE_double</code>: double
|
| + <li> <code>DEFINE_string</code>: C++ string
|
| +</ul>
|
| +
|
| +<p>Note that there are no 'complex' types like lists: the "languages"
|
| +flag in our example is a list of strings, but is defined of type
|
| +"string", not "list_of_string" or similar. This is by design. We'd
|
| +rather use only simple types for the flags, and allow for complex,
|
| +arbitrary parsing routines to parse them, then to try to put the logic
|
| +inside the flags library proper.</p>
|
| +
|
| +<p>All DEFINE macros take the same three arguments: the name of the
|
| +flag, its default value, and a 'help' string that describes its use.
|
| +The 'help' string is displayed when the user runs the application with
|
| +the <A HREF="#special"><code>--help</code> flag</A>.</p>
|
| +
|
| +<p>You can define a flag in any source-code file in your executable.
|
| +Only define a flag once! If you want to access a flag in more than
|
| +one source file, DEFINE it in one file, and <A
|
| +HREF="#declare">DECLARE</A> it in the others. Even better, DEFINE it
|
| +in <code>foo.cc</code> and DECLARE it in <code>foo.h</code>; then
|
| +everyone who <code>#includes foo.h</code> can use the flag.</p>
|
| +
|
| +<p>Note that while most functions in this library are defined in the
|
| +<code>google</code> namespace, <code>DEFINE_foo</code> (and
|
| +<code>DECLARE_foo</code>, <A HREF="#declare">below</A>), should always
|
| +be in the global namespace.</p>
|
| +
|
| +
|
| +<h2> <A name=using>Accessing the Flag</A> </h2>
|
| +
|
| +<p>All defined flags are available to the program as just a normal
|
| +variable, with the prefix <code>FLAGS_</code> prepended. In the above
|
| +example, the macros define two variables, <code>FLAGS_big_menu</code>
|
| +(a bool), and <code>FLAGS_languages</code> (a C++ string).</p>
|
| +
|
| +<p>You can read and write to the flag just like any other
|
| +variable:</p>
|
| +<pre>
|
| + if (FLAGS_consider_made_up_languages)
|
| + FLAGS_languages += ",klingon"; // implied by --consider_made_up_languages
|
| + if (FLAGS_languages.find("finnish") != string::npos)
|
| + HandleFinnish();
|
| +</pre>
|
| +
|
| +<p>You can also get and set flag values via special functions in
|
| +<code>gflags.h</code>. That's a rarer use case, though.</p>
|
| +
|
| +
|
| +<h2> <A name=declare>DECLARE: Using the Flag in a Different File</A> </h2>
|
| +
|
| +<p>Accessing a flag in the manner of the previous section only works
|
| +if the flag was <code>DEFINE</code>-ed at the top of the file. If it
|
| +wasn't, you'll get an 'unknown variable' error.</p>
|
| +
|
| +<p>The <code>DECLARE_type</code> macro is available when you want to
|
| +use a flag that's defined in another file. For instance, if I were
|
| +writing <code>bar.cc</code> but wanted to access the big_menu, flag, I
|
| +would put this near the top of <code>bar.cc</code>:</p>
|
| +<pre>
|
| + DECLARE_bool(big_menu);
|
| +</pre>
|
| +
|
| +<p>This is functionally equivalent to saying <code>extern
|
| +FLAGS_big_menu</code>.</p>
|
| +
|
| +<p>Note that such an extern declaration introduces a dependency
|
| +between your file and the file that defines the <code>big_menu</code>
|
| +flag: <code>foo.cc</code>, in this case. Such implicit dependencies
|
| +can be difficult to manage in large projects. For that reason we
|
| +recommend the following guideline:</p>
|
| +
|
| +<blockquote>
|
| +If you DEFINE a flag in <code>foo.cc</code>, either don't DECLARE it
|
| +at all, only DECLARE it in tightly related tests, or only DECLARE
|
| +it in <code>foo.h</code>.
|
| +</blockquote>
|
| +
|
| +<p>You should go the do-not-DECLARE route when the flag is only needed
|
| +by <code>foo.cc</code>, and not in any other file. If you want to
|
| +modify the value of the flag in the related test file to see if it is
|
| +functioning as expected, DECLARE it in the <code>foo_test.cc</code>
|
| +file.
|
| +
|
| +<p>If the flag does span multiple files, DECLARE it in the associated
|
| +<code>.h</code> file, and make others <code>#include</code> that
|
| +<code>.h</code> file if they want to access the flag. The
|
| +<code>#include</code> will make explicit the dependency between the
|
| +two files. This causes the flag to be a global variable.</p>
|
| +
|
| +
|
| +<h2> <A name=validate>RegisterFlagValidator: Sanity-checking Flag Values</A> </h2>
|
| +
|
| +<p>After DEFINE-ing a flag, you may optionally register a validator
|
| +function with the flag. If you do this, after the flag is parsed from
|
| +the commandline, and whenever its value is changes via a call to
|
| +<code>SetCommandLineOption()</code>, the validator function is called
|
| +with the new value as an argument. The validator function should
|
| +return 'true' if the flag value is valid, and false otherwise.
|
| +
|
| +<p>Here is an example use of this functionality:</p>
|
| +<pre>
|
| +static bool ValidatePort(const char* flagname, int32 value) {
|
| + if (value > 0 && value < 32768) // value is ok
|
| + return true;
|
| + printf("Invalid value for --%s: %d\n", flagname, (int)value);
|
| + return false;
|
| +}
|
| +DEFINE_int32(port, 0, "What port to listen on");
|
| +static const bool port_dummy = RegisterFlagValidator(&FLAGS_port, &ValidatePort);
|
| +</pre>
|
| +
|
| +<p>By doing the registration at global initialization time (right
|
| +after the DEFINE), we ensure that the registration happens before
|
| +the commandline is parsed at the beginning of <code>main()</code>.</p>
|
| +
|
| +<p><code>RegisterFlagValidator()</code> returns true if the
|
| +registration is successful. It return false if the registration fails
|
| +because a) the first argument does not refer to a commandline flag, or
|
| +b) a different validator has already been registered for this flag.</p>
|
| +
|
| +
|
| +<h2> <A name=together>Putting It Together: How to Set Up Flags</A> </h2>
|
| +
|
| +<p>The final piece is the one that tells the executable to process the
|
| +commandline flags, and set the <code>FLAGS_*</code> variables to the
|
| +appropriate, non-default value based on what is seen on the
|
| +commandline. This is equivalent to the <code>getopt()</code> call in
|
| +the getopt library, but has much less overhead to use. In fact, it's
|
| +just a single function call:</p>
|
| +
|
| +<pre>
|
| + google::ParseCommandLineFlags(&argc, &argv, true);
|
| +</pre>
|
| +
|
| +<p>Usually, this code is at the beginning of <code>main()</code>.
|
| +<code>argc</code> and <code>argv</code> are exactly as passed in to
|
| +<code>main()</code>. This routine might modify them, which is why
|
| +pointers to them are passed in.</p>
|
| +
|
| +<p>The last argument is called "remove_flags". If true, then
|
| +<code>ParseCommandLineFlags</code> removes the flags and their
|
| +arguments from <code>argv</code>, and modifies <code>argc</code>
|
| +appropriately. In this case, after the function call,
|
| +<code>argv</code> will hold only commandline arguments, and not
|
| +commandline flags.</p>
|
| +
|
| +<p>If, on the other hand, <code>remove_flags</code> is false, then
|
| +<code>ParseCommandLineFlags</code> will leave argc unchanged, but will
|
| +rearrange the arguments in argv so that the flags are all at the
|
| +beginning. For example, if the input is <code>"/bin/foo" "arg1" "-q"
|
| +"arg2"</code> (which is legal but weird), the function will rearrange
|
| +<code>argv</code> so it reads <code>"/bin/foo", "-q", "arg1",
|
| +"arg2"</code>. In this case, <code>ParseCommandLineFlags</code>
|
| +returns the index into argv that holds the first commandline argument:
|
| +that is, the index past the last flag. (In this example, it would
|
| +return 2, since <code>argv[2]</code> points to <code>arg1</code>.)</p>
|
| +
|
| +<p>In either case, the <code>FLAGS_*</code> variables are modified
|
| +based on what was <A HREF="#commandline">passed in on the
|
| +commandline</A>.</p>
|
| +
|
| +
|
| +<h2> <A name=commandline>Setting Flags on the Command Line</A> </h2>
|
| +
|
| +<p>The reason you make something a flag instead of a compile-time
|
| +constant, is so users can specify a non-default value on the
|
| +commandline. Here's how they might do it for an application that
|
| +links in <code>foo.cc</code>:</p>
|
| +<pre>
|
| + app_containing_foo --nobig_menu -languages="chinese,japanese,korean" ...
|
| +</pre>
|
| +
|
| +<p>This sets <code>FLAGS_big_menu = false;</code> and
|
| +<code>FLAGS_languages = "chinese,japanese,korean"</code>, when
|
| +<code>ParseCommandLineFlags</code> is run.</p>
|
| +
|
| +<p>Note the atypical syntax for setting a boolean flag to false:
|
| +putting "no" in front of its name. There's a fair bit of flexibility
|
| +to how flags may be specified. Here's an example of all the ways to
|
| +specify the "languages" flag:</p>
|
| +<ul>
|
| + <li> <code>app_containing_foo --languages="chinese,japanese,korean"</code>
|
| + <li> <code>app_containing_foo -languages="chinese,japanese,korean"</code>
|
| + <li> <code>app_containing_foo --languages "chinese,japanese,korean"</code>
|
| + <li> <code>app_containing_foo -languages "chinese,japanese,korean"</code>
|
| +</ul>
|
| +
|
| +<p>For boolean flags, the possibilities are slightly different:</p>
|
| +<ul>
|
| + <li> <code>app_containing_foo --big_menu</code>
|
| + <li> <code>app_containing_foo --nobig_menu</code>
|
| + <li> <code>app_containing_foo --big_menu=true</code>
|
| + <li> <code>app_containing_foo --big_menu=false</code>
|
| +</ul>
|
| +<p>(as well as the single-dash variant on all of these).</p>
|
| +
|
| +<p>Despite this flexibility, we recommend using only a single form:
|
| +<code>--variable=value</code> for non-boolean flags, and
|
| +<code>--variable/--novariable</code> for boolean flags. This
|
| +consistency will make your code more readable, and is also the format
|
| +required for certain special-use cases like <A
|
| +HREF="#flagfiles">flagfiles</A>.</p>
|
| +
|
| +<p>It is a fatal error to specify a flag on the commandline that has
|
| +not been DEFINED somewhere in the executable. If you need that
|
| +functionality for some reason -- say you want to use the same set of
|
| +flags for several executables, but not all of them DEFINE every flag
|
| +in your list -- you can specify <A
|
| +HREF="#special"><code>--undefok</code></A> to suppress the error.</p>
|
| +
|
| +<p>As in getopt(), <code>--</code> by itself will terminate flags
|
| +processing. So in <code>foo -f1 1 -- -f2 2</code>, <code>f1</code> is
|
| +considered a flag, but <code>-f2</code> is not.</p>
|
| +
|
| +<p>Note that flags do not have single-letter synonyms, like they do in
|
| +the getopt library, nor do we allow "combining" flags behind a
|
| +single dash, as in <code>ls -la</code>.</p>
|
| +
|
| +
|
| +<h2> <A name="special">Special Flags</code> </h2>
|
| +
|
| +<p>There are a few flags defined by the commandlineflags module
|
| +itself, and are available to all applications. These fall into three
|
| +categories. First are the 'reporting' flags that, when found, cause
|
| +the application to print some information about itself and exit.</p>
|
| +
|
| +<table><tr valign=top>
|
| + <td><code>--help</code></td>
|
| + <td>shows all flags from all files, sorted by file and then by name;
|
| + shows the flagname, its default value, and its help string</td>
|
| +</tr><tr valign=top>
|
| + <td><code>--helpfull</code></td>
|
| + <td>same as -help, but unambiguously asks for all flags
|
| + (in case -help changes in the future)</td>
|
| +</tr><tr valign=top>
|
| + <td><code>--helpshort</code></td>
|
| + <td>shows only flags for the file that includes <code>main()</code></td>
|
| +</tr><tr valign=top>
|
| + <td><code>--helpxml</code></td>
|
| + <td>like --help, but output is in xml for easier parsing</td>
|
| +</tr><tr valign=top>
|
| + <td><code>--helpon=FILE </code></td>
|
| + <td>shows only flags defined in FILE.*</td>
|
| +</tr><tr valign=top>
|
| + <td><code>--helpmatch=S</code></td>
|
| + <td>shows only flags defined in *S*.*</td>
|
| +</tr><tr valign=top>
|
| + <td><code>--helppackage</code></td>
|
| + <td>shows flags defined in files in same directory as <code>main()</code></td>
|
| +</tr><tr valign=top>
|
| + <td><code>--version</code></td>
|
| + <td>prints version info for the executable</td>
|
| +</tr></table>
|
| +
|
| +<p>Second are the flags that affect how other flags are parsed.</p>
|
| +
|
| +<table><tr valign=top>
|
| + <td><code>--undefok=flagname,flagname,...</code></td>
|
| + <td>for those names listed as the argument to <code>--undefok</code>,
|
| + suppress the normal error-exit that occurs when
|
| + <code>--name</code> is seen on the commandline, but
|
| + <code>name</code> has not been DEFINED anywhere in the
|
| + application
|
| +</table>
|
| +
|
| +<p>Third are the 'recursive' flags, that cause other flag values to be
|
| +set: <code>--fromenv</code>, <code>--tryfromenv</code>,
|
| +<code>--flagfile</code>. These are described below in more
|
| +detail.</p>
|
| +
|
| +<h3> <code>--fromenv</code> </h3>
|
| +
|
| +<p><code>--fromenv=foo,bar</code> says to read the values for the
|
| +<code>foo</code> and <code>bar</code> flags from the environment.
|
| +In concert with this flag, you must actually set the values in the
|
| +environment, via a line like one of the two below:</p>
|
| +<pre>
|
| + export FLAGS_foo=xxx; export FLAGS_bar=yyy # sh
|
| + setenv FLAGS_foo xxx; setenv FLAGS_bar yyy # tcsh
|
| +</pre>
|
| +<p>This is equivalent to specifying <code>--foo=xxx</code>,
|
| +<code>--bar=yyy</code> on the commandline.</p>
|
| +
|
| +<p>Note it is a fatal error to say <code>--fromenv=foo</code> if
|
| +<code>foo</code> is not DEFINED somewhere in the application. (Though
|
| +you can suppress this error via <code>--undefok=foo</code>, just like
|
| +for any other flag.)</p>
|
| +
|
| +<p>It is also a fatal error to say <code>--fromenv=foo</code> if
|
| +<code>FLAGS_foo</code> is not actually defined in the environment.</p>
|
| +
|
| +<h3> <code>--tryfromenv</code> </h3>
|
| +
|
| +<p><code>--tryfromenv</code> is exactly like <code>--fromenv</code>,
|
| +except it is <b>not</b> a fatal error to say
|
| +<code>--tryfromenv=foo</code> if <code>FLAGS_foo</code> is not
|
| +actually defined in the environment. Instead, in such cases,
|
| +<code>FLAGS_foo</code> just keeps its default value as specified in
|
| +the application.</p>
|
| +
|
| +<p>Note it is still an error to say <code>--tryfromenv=foo</code> if
|
| +<code>foo</code> is not DEFINED somewhere in the application.</p>
|
| +
|
| +<h3> <code>--flagfile</code> </h3>
|
| +
|
| +<p><code>--flagfile=f</code> tells the commandlineflags module to read
|
| +the file <code>f</code>, and to run all the flag-assignments found in
|
| +that file as if these flags had been specified on the commandline.</p>
|
| +
|
| +<p>In its simplest form, <code>f</code> should just be a list of flag
|
| +assignments, one per line. Unlike on the commandline, the equals sign
|
| +separating a flagname from its argument is <i>required</i> for
|
| +flagfiles. An example flagfile, <code>/tmp/myflags</code>:</p>
|
| +<pre>
|
| +--nobig_menus
|
| +--languages=english,french
|
| +</pre>
|
| +
|
| +<p>With this flagfile, the following two lines are equivalent:<p>
|
| +<pre>
|
| + ./myapp --foo --nobig_menus --languages=english,french --bar
|
| + ./myapp --foo --flagfile=/tmp/myflags --bar
|
| +</pre>
|
| +
|
| +<p>Note that many errors are silently suppressed in flagfiles. In
|
| +particular, unrecognized flagnames are silently ignored, as are flags
|
| +that are missing a required value (e.g., a flagfile that just says
|
| +<code>--languages</code>).</p>
|
| +
|
| +<p>The general format of a flagfile is a bit more complicated than the
|
| +simple, common case above. It is: a sequence of filenames, one per
|
| +line, followed by a sequence of flags, one per line, repeated as many
|
| +times as desired. Filenames in a flagfile can use wildcards
|
| +(<code>*</code> and <code>?</code>), and the sequence of flags located
|
| +after a sequence of filenames is processed only if the current
|
| +executable's name matches one of the filenames. It is possible to
|
| +start the flagfile with a sequence of flags instead of a sequence of
|
| +filenames; if such a sequence of flags is present, these flags are
|
| +applied to the current executable no matter what it is.</p>
|
| +
|
| +<p>Lines that start with a <code>#</code> are ignored as comments.
|
| +Leading whitespace is also ignored in flagfiles, as are blank
|
| +lines.</p>
|
| +
|
| +<p>It is possible for a flagfile to use the <code>--flagfile</code>
|
| +flag to include another flagfile.</p>
|
| +
|
| +<p>Flags are always processed in the expected order. That is,
|
| +processing begins by examining the flags specified directly on the
|
| +command line. If a flagfile is specified, its contents are processed,
|
| +and then processing continues with remaining flags from the command
|
| +line.</p>
|
| +
|
| +
|
| +<h2> <A name="api">The API</code> </h2>
|
| +
|
| +<p>In addition to accessing <code>FLAGS_foo</code> directly, it is
|
| +possible to access the flags programmatically, through an API. It is
|
| +also possible to access information about a flag, such as its default
|
| +value and help-string. A <code>FlagSaver</code> makes it easy to
|
| +modify flags and then automatically undo the modifications later.
|
| +Finally, there are somewhat unrelated, but useful, routines to easily
|
| +access parts of <code>argv</code> outside main, including the program
|
| +name (<code>argv[0]</code>).</p>
|
| +
|
| +<p>For more information about these routines, and other useful helper
|
| +methods such as <code>google::SetUsageMessage</code>, see
|
| +<code>gflags.h</code>.</p>
|
| +
|
| +
|
| +<h2> <A name="misc">Miscellaneous Notes</code> </h2>
|
| +
|
| +<p>If your application has code like this:</p>
|
| +<pre>
|
| + #define STRIP_FLAG_HELP 1 // this must go before the #include!
|
| + #include <gflags/gflags.h>
|
| +</pre>
|
| +<p>we will remove the help messages from the compiled source. This can
|
| +reduce the size of the resulting binary somewhat, and may also be
|
| +useful for security reasons.</p>
|
| +
|
| +
|
| +<hr>
|
| +<address>
|
| +Craig Silverstein<br>
|
| +<script type=text/javascript>
|
| + var lm = new Date(document.lastModified);
|
| + document.write(lm.toDateString());
|
| +</script>
|
| +</address>
|
| +
|
| +</body>
|
| +</html>
|
|
|
| Property changes on: tools/nixysa/third_party/gflags-1.0/doc/gflags.html
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|