Commit 096d3558 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Arnaldo Carvalho de Melo

perf tools: Provide subcmd configuration at runtime

Create init functions for exec_cmd.c and pager.c.  This allows their
configuration to be specified at runtime so they can be split out into a
separate library which can be used by other programs.  Their
configuration is stored in a shared subcmd_config struct.
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/21f5f6b38da72c985a8dcfa185700d03e7eecd1d.1450193761.git.jpoimboe@redhat.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 24a88bdd
...@@ -36,7 +36,10 @@ paths += -DPERF_MAN_PATH="BUILD_STR($(mandir_SQ))" ...@@ -36,7 +36,10 @@ paths += -DPERF_MAN_PATH="BUILD_STR($(mandir_SQ))"
CFLAGS_builtin-help.o += $(paths) CFLAGS_builtin-help.o += $(paths)
CFLAGS_builtin-timechart.o += $(paths) CFLAGS_builtin-timechart.o += $(paths)
CFLAGS_perf.o += -DPERF_HTML_PATH="BUILD_STR($(htmldir_SQ))" -include $(OUTPUT)PERF-VERSION-FILE CFLAGS_perf.o += -DPERF_HTML_PATH="BUILD_STR($(htmldir_SQ))" \
-DPERF_EXEC_PATH="BUILD_STR($(perfexecdir_SQ))" \
-DPREFIX="BUILD_STR($(prefix_SQ))" \
-include $(OUTPUT)PERF-VERSION-FILE
CFLAGS_builtin-trace.o += -DSTRACE_GROUPS_DIR="BUILD_STR($(STRACE_GROUPS_DIR_SQ))" CFLAGS_builtin-trace.o += -DSTRACE_GROUPS_DIR="BUILD_STR($(STRACE_GROUPS_DIR_SQ))"
libperf-y += util/ libperf-y += util/
......
...@@ -119,7 +119,7 @@ static void commit_pager_choice(void) ...@@ -119,7 +119,7 @@ static void commit_pager_choice(void)
{ {
switch (use_pager) { switch (use_pager) {
case 0: case 0:
setenv("PERF_PAGER", "cat", 1); setenv(PERF_PAGER_ENVIRONMENT, "cat", 1);
break; break;
case 1: case 1:
/* setup_pager(); */ /* setup_pager(); */
...@@ -530,6 +530,10 @@ int main(int argc, const char **argv) ...@@ -530,6 +530,10 @@ int main(int argc, const char **argv)
const char *cmd; const char *cmd;
char sbuf[STRERR_BUFSIZE]; char sbuf[STRERR_BUFSIZE];
/* libsubcmd init */
exec_cmd_init("perf", PREFIX, PERF_EXEC_PATH, EXEC_PATH_ENVIRONMENT);
pager_init(PERF_PAGER_ENVIRONMENT);
/* The page_size is placed in util object. */ /* The page_size is placed in util object. */
page_size = sysconf(_SC_PAGE_SIZE); page_size = sysconf(_SC_PAGE_SIZE);
cacheline_size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE); cacheline_size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
......
...@@ -88,6 +88,7 @@ libperf-y += parse-branch-options.o ...@@ -88,6 +88,7 @@ libperf-y += parse-branch-options.o
libperf-y += parse-regs-options.o libperf-y += parse-regs-options.o
libperf-y += term.o libperf-y += term.o
libperf-y += help-unknown-cmd.o libperf-y += help-unknown-cmd.o
libperf-y += subcmd-config.o
libperf-$(CONFIG_LIBBPF) += bpf-loader.o libperf-$(CONFIG_LIBBPF) += bpf-loader.o
libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o libperf-$(CONFIG_BPF_PROLOGUE) += bpf-prologue.o
...@@ -113,7 +114,6 @@ libperf-$(CONFIG_ZLIB) += zlib.o ...@@ -113,7 +114,6 @@ libperf-$(CONFIG_ZLIB) += zlib.o
libperf-$(CONFIG_LZMA) += lzma.o libperf-$(CONFIG_LZMA) += lzma.o
CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))" CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
CFLAGS_exec_cmd.o += -DPERF_EXEC_PATH="BUILD_STR($(perfexecdir_SQ))" -DPREFIX="BUILD_STR($(prefix_SQ))"
$(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c $(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c
$(call rule_mkdir) $(call rule_mkdir)
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#define DEFAULT_PERF_DIR_ENVIRONMENT ".perf" #define DEFAULT_PERF_DIR_ENVIRONMENT ".perf"
#define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR" #define PERF_DEBUGFS_ENVIRONMENT "PERF_DEBUGFS_DIR"
#define PERF_TRACEFS_ENVIRONMENT "PERF_TRACEFS_DIR" #define PERF_TRACEFS_ENVIRONMENT "PERF_TRACEFS_DIR"
#define PERF_PAGER_ENVIRONMENT "PERF_PAGER"
typedef int (*config_fn_t)(const char *, const char *, void *); typedef int (*config_fn_t)(const char *, const char *, void *);
extern int perf_default_config(const char *, const char *, void *); extern int perf_default_config(const char *, const char *, void *);
......
#include "cache.h" #include "cache.h"
#include "exec_cmd.h" #include "exec_cmd.h"
#include "quote.h" #include "quote.h"
#include "subcmd-config.h"
#include <string.h> #include <string.h>
...@@ -9,15 +10,23 @@ ...@@ -9,15 +10,23 @@
static const char *argv_exec_path; static const char *argv_exec_path;
static const char *argv0_path; static const char *argv0_path;
void exec_cmd_init(const char *exec_name, const char *prefix,
const char *exec_path, const char *exec_path_env)
{
subcmd_config.exec_name = exec_name;
subcmd_config.prefix = prefix;
subcmd_config.exec_path = exec_path;
subcmd_config.exec_path_env = exec_path_env;
}
char *system_path(const char *path) char *system_path(const char *path)
{ {
static const char *prefix = PREFIX;
struct strbuf d = STRBUF_INIT; struct strbuf d = STRBUF_INIT;
if (is_absolute_path(path)) if (is_absolute_path(path))
return strdup(path); return strdup(path);
strbuf_addf(&d, "%s/%s", prefix, path); strbuf_addf(&d, "%s/%s", subcmd_config.prefix, path);
path = strbuf_detach(&d, NULL); path = strbuf_detach(&d, NULL);
return (char *)path; return (char *)path;
} }
...@@ -47,7 +56,7 @@ void perf_set_argv_exec_path(const char *exec_path) ...@@ -47,7 +56,7 @@ void perf_set_argv_exec_path(const char *exec_path)
/* /*
* Propagate this setting to external programs. * Propagate this setting to external programs.
*/ */
setenv(EXEC_PATH_ENVIRONMENT, exec_path, 1); setenv(subcmd_config.exec_path_env, exec_path, 1);
} }
...@@ -59,11 +68,11 @@ char *perf_exec_path(void) ...@@ -59,11 +68,11 @@ char *perf_exec_path(void)
if (argv_exec_path) if (argv_exec_path)
return strdup(argv_exec_path); return strdup(argv_exec_path);
env = getenv(EXEC_PATH_ENVIRONMENT); env = getenv(subcmd_config.exec_path_env);
if (env && *env) if (env && *env)
return strdup(env); return strdup(env);
return system_path(PERF_EXEC_PATH); return system_path(subcmd_config.exec_path);
} }
static void add_path(struct strbuf *out, const char *path) static void add_path(struct strbuf *out, const char *path)
...@@ -107,7 +116,7 @@ static const char **prepare_perf_cmd(const char **argv) ...@@ -107,7 +116,7 @@ static const char **prepare_perf_cmd(const char **argv)
; /* just counting */ ; /* just counting */
nargv = malloc(sizeof(*nargv) * (argc + 2)); nargv = malloc(sizeof(*nargv) * (argc + 2));
nargv[0] = "perf"; nargv[0] = subcmd_config.exec_name;
for (argc = 0; argv[argc]; argc++) for (argc = 0; argv[argc]; argc++)
nargv[argc + 1] = argv[argc]; nargv[argc + 1] = argv[argc];
nargv[argc + 1] = NULL; nargv[argc + 1] = NULL;
...@@ -118,7 +127,7 @@ int execv_perf_cmd(const char **argv) { ...@@ -118,7 +127,7 @@ int execv_perf_cmd(const char **argv) {
const char **nargv = prepare_perf_cmd(argv); const char **nargv = prepare_perf_cmd(argv);
/* execvp() can only ever return if it fails */ /* execvp() can only ever return if it fails */
execvp("perf", (char **)nargv); execvp(subcmd_config.exec_name, (char **)nargv);
free(nargv); free(nargv);
return -1; return -1;
......
#ifndef __PERF_EXEC_CMD_H #ifndef __PERF_EXEC_CMD_H
#define __PERF_EXEC_CMD_H #define __PERF_EXEC_CMD_H
extern void exec_cmd_init(const char *exec_name, const char *prefix,
const char *exec_path, const char *exec_path_env);
extern void perf_set_argv_exec_path(const char *exec_path); extern void perf_set_argv_exec_path(const char *exec_path);
extern const char *perf_extract_argv0_path(const char *path); extern const char *perf_extract_argv0_path(const char *path);
extern void setup_path(void); extern void setup_path(void);
......
#include "cache.h" #include "cache.h"
#include "run-command.h" #include "run-command.h"
#include "sigchain.h" #include "sigchain.h"
#include "subcmd-config.h"
/* /*
* This is split up from the rest of git so that we can do * This is split up from the rest of git so that we can do
...@@ -9,6 +10,11 @@ ...@@ -9,6 +10,11 @@
static int spawned_pager; static int spawned_pager;
void pager_init(const char *pager_env)
{
subcmd_config.pager_env = pager_env;
}
static void pager_preexec(void) static void pager_preexec(void)
{ {
/* /*
...@@ -46,7 +52,7 @@ static void wait_for_pager_signal(int signo) ...@@ -46,7 +52,7 @@ static void wait_for_pager_signal(int signo)
void setup_pager(void) void setup_pager(void)
{ {
const char *pager = getenv("PERF_PAGER"); const char *pager = getenv(subcmd_config.pager_env);
if (!isatty(1)) if (!isatty(1))
return; return;
......
#ifndef __PERF_PAGER_H #ifndef __PERF_PAGER_H
#define __PERF_PAGER_H #define __PERF_PAGER_H
extern void pager_init(const char *pager_env);
extern void setup_pager(void); extern void setup_pager(void);
extern int pager_in_use(void); extern int pager_in_use(void);
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include "parse-options.h" #include "parse-options.h"
#include "cache.h" #include "cache.h"
#include "header.h" #include "header.h"
#include "subcmd-config.h"
#include <linux/string.h> #include <linux/string.h>
#define OPT_SHORT 1 #define OPT_SHORT 1
...@@ -577,7 +578,8 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o ...@@ -577,7 +578,8 @@ int parse_options_subcommand(int argc, const char **argv, const struct option *o
if (subcommands && !usagestr[0]) { if (subcommands && !usagestr[0]) {
struct strbuf buf = STRBUF_INIT; struct strbuf buf = STRBUF_INIT;
strbuf_addf(&buf, "perf %s [<options>] {", argv[0]); strbuf_addf(&buf, "%s %s [<options>] {",
subcmd_config.exec_name, argv[0]);
for (int i = 0; subcommands[i]; i++) { for (int i = 0; subcommands[i]; i++) {
if (i) if (i)
strbuf_addstr(&buf, "|"); strbuf_addstr(&buf, "|");
......
#include "subcmd-config.h"
#define UNDEFINED "SUBCMD_HAS_NOT_BEEN_INITIALIZED"
struct subcmd_config subcmd_config = {
.exec_name = UNDEFINED,
.prefix = UNDEFINED,
.exec_path = UNDEFINED,
.exec_path_env = UNDEFINED,
.pager_env = UNDEFINED,
};
#ifndef __PERF_SUBCMD_CONFIG_H
#define __PERF_SUBCMD_CONFIG_H
struct subcmd_config {
const char *exec_name;
const char *prefix;
const char *exec_path;
const char *exec_path_env;
const char *pager_env;
};
extern struct subcmd_config subcmd_config;
#endif /* __PERF_SUBCMD_CONFIG_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment