[PATCH v2 1/3] perf help: Add options description to 'perf -h'

From: Yunlong Song
Date: Thu Oct 15 2015 - 03:36:08 EST


Add options description to 'perf -h' to make it consistent with other builtins
(e.g., 'perf stat -h').

Example:

Before this patch:

# perf -h

usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]

The most commonly used perf commands are:
annotate Read perf.data (created by perf record) and display annotated code
archive Create archive with object files with build-ids found in perf.data file
bench General framework for benchmark suites
buildid-cache Manage build-id cache.
buildid-list List the buildids in a perf.data file
<SNIP>
test Runs sanity tests.
timechart Tool to visualize total system behavior during a workload
top System profiling tool.
trace strace inspired tool
probe Define new dynamic tracepoints

See 'perf help COMMAND' for more information on a specific command.

After this patch:

# perf -h

usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]

--help help
--version version
--exec-path exec-path
--html-path html-path
--paginate paginate
--no-pager no-pager
--perf-dir perf-dir
--work-tree work-tree
--debugfs-dir debugfs-dir
--buildid-dir buildid-dir
--list-cmds list-cmds
--list-opts list-opts
--debug debug

The most commonly used perf commands are:
annotate Read perf.data (created by perf record) and display annotated code
archive Create archive with object files with build-ids found in perf.data file
bench General framework for benchmark suites
buildid-cache Manage build-id cache.
buildid-list List the buildids in a perf.data file
<SNIP>
test Runs sanity tests.
timechart Tool to visualize total system behavior during a workload
top System profiling tool.
trace strace inspired tool
probe Define new dynamic tracepoints

See 'perf help COMMAND' for more information on a specific command.

As shown above, the options description really appears now.

Signed-off-by: Yunlong Song <yunlong.song@xxxxxxxxxx>
---
tools/perf/builtin-help.c | 2 +-
tools/perf/builtin.h | 3 +++
tools/perf/perf.c | 12 ++++++++----
tools/perf/util/parse-options.c | 7 +++++++
tools/perf/util/parse-options.h | 3 +++
5 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/tools/perf/builtin-help.c b/tools/perf/builtin-help.c
index 36486ea..5cb29fe 100644
--- a/tools/perf/builtin-help.c
+++ b/tools/perf/builtin-help.c
@@ -470,7 +470,7 @@ int cmd_help(int argc, const char **argv, const char *prefix __maybe_unused)
}

if (!argv[0]) {
- printf("\n usage: %s\n\n", perf_usage_string);
+ usage_with_options_return(perf_usage, perf_options);
list_common_cmds_help();
printf("\n %s\n\n", perf_more_info_string);
return 0;
diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
index 3688ad2..4439db0 100644
--- a/tools/perf/builtin.h
+++ b/tools/perf/builtin.h
@@ -3,9 +3,12 @@

#include "util/util.h"
#include "util/strbuf.h"
+#include "util/parse-options.h"

extern const char perf_usage_string[];
extern const char perf_more_info_string[];
+extern const char * const perf_usage[];
+extern struct option perf_options[];

extern void list_common_cmds_help(void);
extern const char *help_unknown_cmd(const char *cmd);
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 5437134..3bcaa10d 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -21,6 +21,10 @@

const char perf_usage_string[] =
"perf [--version] [--help] [OPTIONS] COMMAND [ARGS]";
+const char * const perf_usage[] = {
+ perf_usage_string,
+ NULL
+};

const char perf_more_info_string[] =
"See 'perf help COMMAND' for more information on a specific command.";
@@ -127,7 +131,7 @@ static void commit_pager_choice(void)
}
}

-struct option options[] = {
+struct option perf_options[] = {
OPT_ARGUMENT("help", "help"),
OPT_ARGUMENT("version", "version"),
OPT_ARGUMENT("exec-path", "exec-path"),
@@ -261,8 +265,8 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
} else if (!strcmp(cmd, "--list-opts")) {
unsigned int i;

- for (i = 0; i < ARRAY_SIZE(options)-1; i++) {
- struct option *p = options+i;
+ for (i = 0; i < ARRAY_SIZE(perf_options)-1; i++) {
+ struct option *p = perf_options+i;
printf("--%s ", p->long_name);
}
putchar('\n');
@@ -578,7 +582,7 @@ int main(int argc, const char **argv)
argv[0] += 2;
} else {
/* The user didn't specify a command; give them help */
- printf("\n usage: %s\n\n", perf_usage_string);
+ usage_with_options_return(perf_usage, perf_options);
list_common_cmds_help();
printf("\n %s\n\n", perf_more_info_string);
goto out;
diff --git a/tools/perf/util/parse-options.c b/tools/perf/util/parse-options.c
index 9a38b05..494089b 100644
--- a/tools/perf/util/parse-options.c
+++ b/tools/perf/util/parse-options.c
@@ -677,6 +677,13 @@ void usage_with_options(const char * const *usagestr,
exit(129);
}

+void usage_with_options_return(const char * const *usagestr,
+ const struct option *opts)
+{
+ exit_browser(false);
+ usage_with_options_internal(usagestr, opts, 0);
+}
+
int parse_options_usage(const char * const *usagestr,
const struct option *opts,
const char *optstr, bool short_opt)
diff --git a/tools/perf/util/parse-options.h b/tools/perf/util/parse-options.h
index 367d8b8..8130f83 100644
--- a/tools/perf/util/parse-options.h
+++ b/tools/perf/util/parse-options.h
@@ -161,6 +161,9 @@ extern int parse_options_subcommand(int argc, const char **argv,
extern NORETURN void usage_with_options(const char * const *usagestr,
const struct option *options);

+extern void usage_with_options_return(const char * const *usagestr,
+ const struct option *options);
+
/*----- incremantal advanced APIs -----*/

enum {
--
1.8.5.2

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/