linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: [PATCH v1 0/3] Support perf -vv
  2018-03-26 16:07 [PATCH v1 0/3] Support perf -vv Jin Yao
@ 2018-03-26  9:00 ` Andi Kleen
  2018-03-26  9:07   ` Jiri Olsa
  2018-03-26 16:07 ` [PATCH v1 1/3] perf config: Add -DNO_GLIBC to CFLAGS Jin Yao
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 20+ messages in thread
From: Andi Kleen @ 2018-03-26  9:00 UTC (permalink / raw)
  To: Jin Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel,
	kan.liang, yao.jin

On Tue, Mar 27, 2018 at 12:07:01AM +0800, Jin Yao wrote:
> We keep having bug reports that when users build perf on their own,
> but they don't install some needed libraries such as libelf,
> libbfd/libibery.
> 
> The perf can build, but it is missing important functionality. And
> users may complain that perf has issue or bug. 
> 
> This patch-set support 'perf -vv' which will print the compiled-in
> status of libraries. Once users think perf missing some functionality,
> it should be very easy for them to check the libraries status.

I don't think this solves the problem. How should the user know
that they need to run perf -vv. Also normal users don't know
that libelf is needed for symbols for example.

We need a warning that is visible together with the symbols
and that clearly describes the problem.

-Andi

> 
> For example:
> 
> $ ./perf -vv
> perf version 4.13.rc5.g9b7a81b
>                  dwarf: [  on ]
>     dwarf_getlocations: [  on ]
>                  glibc: [  on ]
>                   gtk2: [  on ]
>               libaudit: [ off ]
>                 libbfd: [  on ]
>                 libelf: [  on ]
>                libnuma: [  on ]
> numa_num_possible_cpus: [  on ]
>                libperl: [  on ]
>              libpython: [  on ]
>               libslang: [  on ]
>              libcrypto: [  on ]
>              libunwind: [  on ]
>     libdw-dwarf-unwind: [  on ]
>                   zlib: [  on ]
>                   lzma: [  on ]
>              get_cpuid: [  on ]
>                    bpf: [  on ]
> 
> Jin Yao (3):
>   perf config: Add -DNO_GLIBC to CFLAGS
>   perf version: Print the status of compiled-in libraries
>   perf: Support perf -vv
> 
>  tools/perf/Makefile.config   |   2 +
>  tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
>  tools/perf/builtin.h         |   1 +
>  tools/perf/perf.c            |   6 +++
>  4 files changed, 134 insertions(+)
> 
> -- 
> 2.7.4
> 

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 0/3] Support perf -vv
  2018-03-26  9:00 ` Andi Kleen
@ 2018-03-26  9:07   ` Jiri Olsa
  2018-03-26 13:06     ` Jin, Yao
  0 siblings, 1 reply; 20+ messages in thread
From: Jiri Olsa @ 2018-03-26  9:07 UTC (permalink / raw)
  To: Andi Kleen
  Cc: Jin Yao, acme, jolsa, peterz, mingo, alexander.shishkin,
	Linux-kernel, kan.liang, yao.jin

On Mon, Mar 26, 2018 at 02:00:31AM -0700, Andi Kleen wrote:
> On Tue, Mar 27, 2018 at 12:07:01AM +0800, Jin Yao wrote:
> > We keep having bug reports that when users build perf on their own,
> > but they don't install some needed libraries such as libelf,
> > libbfd/libibery.
> > 
> > The perf can build, but it is missing important functionality. And
> > users may complain that perf has issue or bug. 
> > 
> > This patch-set support 'perf -vv' which will print the compiled-in
> > status of libraries. Once users think perf missing some functionality,
> > it should be very easy for them to check the libraries status.
> 
> I don't think this solves the problem. How should the user know
> that they need to run perf -vv. Also normal users don't know
> that libelf is needed for symbols for example.
> 
> We need a warning that is visible together with the symbols
> and that clearly describes the problem.

IIRC we decided to go *with* the message in the perf report
or other affected command that would suggest to run 'perf -vv'
for more details

jirka

> 
> -Andi
> 
> > 
> > For example:
> > 
> > $ ./perf -vv
> > perf version 4.13.rc5.g9b7a81b
> >                  dwarf: [  on ]
> >     dwarf_getlocations: [  on ]
> >                  glibc: [  on ]
> >                   gtk2: [  on ]
> >               libaudit: [ off ]
> >                 libbfd: [  on ]
> >                 libelf: [  on ]
> >                libnuma: [  on ]
> > numa_num_possible_cpus: [  on ]
> >                libperl: [  on ]
> >              libpython: [  on ]
> >               libslang: [  on ]
> >              libcrypto: [  on ]
> >              libunwind: [  on ]
> >     libdw-dwarf-unwind: [  on ]
> >                   zlib: [  on ]
> >                   lzma: [  on ]
> >              get_cpuid: [  on ]
> >                    bpf: [  on ]
> > 
> > Jin Yao (3):
> >   perf config: Add -DNO_GLIBC to CFLAGS
> >   perf version: Print the status of compiled-in libraries
> >   perf: Support perf -vv
> > 
> >  tools/perf/Makefile.config   |   2 +
> >  tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
> >  tools/perf/builtin.h         |   1 +
> >  tools/perf/perf.c            |   6 +++
> >  4 files changed, 134 insertions(+)
> > 
> > -- 
> > 2.7.4
> > 

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-26 16:07 ` [PATCH v1 2/3] perf version: Print the status of compiled-in libraries Jin Yao
@ 2018-03-26  9:39   ` Jiri Olsa
  2018-03-26 13:51     ` Jin, Yao
  2018-03-27  1:44     ` Jin, Yao
  2018-03-27  5:58   ` Ingo Molnar
  1 sibling, 2 replies; 20+ messages in thread
From: Jiri Olsa @ 2018-03-26  9:39 UTC (permalink / raw)
  To: Jin Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin

On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
> This patch checks the values passed by CFLAGS (-DXXX) and then
> print the status of libraries.
> 
> For example, if HAVE_DWARF_SUPPORT is defined, that means the
> library "dwarf" is compiled-in. The patch will print the status
> "on" for this library.
> 
> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
> ---
>  tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
>  tools/perf/builtin.h         |   1 +
>  2 files changed, 126 insertions(+)
> 
> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> index 37019c5..90a0a7f 100644
> --- a/tools/perf/builtin-version.c
> +++ b/tools/perf/builtin-version.c
> @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
>  	printf("perf version %s\n", perf_version_string);
>  	return 0;
>  }
> +
> +static void status_print(const char *name, const char *status)
> +{
> +	printf("%22s: [ %3s ]\n", name, status);
> +}
> +
> +static void library_status(void)
> +{
> +#ifdef HAVE_DWARF_SUPPORT
> +	status_print("dwarf", "on");
> +#else
> +	status_print("dwarf", "off");
> +#endif

could this and all those below be in some generic macro?

#define STATUS(__d, __m)		\
#ifdef __d 				\
	status_print(#__m, "on");	\
#else					\
	status_print(#__m, "OFF");	\
#endif

STATUS(HAVE_DWARF_SUPPORT, dwarf)


also please print the 'OFF' and use colors as in the build message

> +
> +#ifdef HAVE_DWARF_GETLOCATIONS
> +	status_print("dwarf_getlocations", "on");
> +#else
> +	status_print("dwarf_getlocations", "off");
> +#endif
> +
> +#ifdef NO_GLIBC
> +	status_print("glibc", "off");
> +#else
> +	status_print("glibc", "on");
> +#endif
> +
> +#ifdef HAVE_GTK2_SUPPORT
> +	status_print("gtk2", "on");
> +#else
> +	status_print("gtk2", "off");
> +#endif
> +

SNIP

> +}
> +
> +int cmd_version2(int argc, const char **argv)
> +{
> +	cmd_version(argc, argv);
> +	library_status();
> +	return 0;
> +}
> diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
> index 05745f3..c7508ee 100644
> --- a/tools/perf/builtin.h
> +++ b/tools/perf/builtin.h
> @@ -29,6 +29,7 @@ int cmd_timechart(int argc, const char **argv);
>  int cmd_top(int argc, const char **argv);
>  int cmd_script(int argc, const char **argv);
>  int cmd_version(int argc, const char **argv);
> +int cmd_version2(int argc, const char **argv);

please don't add new command for this, handle this in cmd_version

thanks,
jirka

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 0/3] Support perf -vv
  2018-03-26  9:07   ` Jiri Olsa
@ 2018-03-26 13:06     ` Jin, Yao
  0 siblings, 0 replies; 20+ messages in thread
From: Jin, Yao @ 2018-03-26 13:06 UTC (permalink / raw)
  To: Jiri Olsa, Andi Kleen
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel,
	kan.liang, yao.jin



On 3/26/2018 5:07 PM, Jiri Olsa wrote:
> On Mon, Mar 26, 2018 at 02:00:31AM -0700, Andi Kleen wrote:
>> On Tue, Mar 27, 2018 at 12:07:01AM +0800, Jin Yao wrote:
>>> We keep having bug reports that when users build perf on their own,
>>> but they don't install some needed libraries such as libelf,
>>> libbfd/libibery.
>>>
>>> The perf can build, but it is missing important functionality. And
>>> users may complain that perf has issue or bug.
>>>
>>> This patch-set support 'perf -vv' which will print the compiled-in
>>> status of libraries. Once users think perf missing some functionality,
>>> it should be very easy for them to check the libraries status.
>>
>> I don't think this solves the problem. How should the user know
>> that they need to run perf -vv. Also normal users don't know
>> that libelf is needed for symbols for example.
>>
>> We need a warning that is visible together with the symbols
>> and that clearly describes the problem.
> 
> IIRC we decided to go *with* the message in the perf report
> or other affected command that would suggest to run 'perf -vv'
> for more details
> 
> jirka
> 

Hi Andi,

For how the users know they should run 'perf -vv', as the discussion 
with Jiri and Arnaldo, the message will be displayed if necessary when 
users perform perf report or other perf commands. That could be 
implemented in a follow-up patch (not in this patch-set).

For let user know what the library they need, maybe we can add more 
information in 'perf -vv', for example, add something like,

"Please install libelf-dev, libelf-devel or elfutils-libelf-devel before 
building perf"

Thanks
Jin Yao

>>
>> -Andi
>>
>>>
>>> For example:
>>>
>>> $ ./perf -vv
>>> perf version 4.13.rc5.g9b7a81b
>>>                   dwarf: [  on ]
>>>      dwarf_getlocations: [  on ]
>>>                   glibc: [  on ]
>>>                    gtk2: [  on ]
>>>                libaudit: [ off ]
>>>                  libbfd: [  on ]
>>>                  libelf: [  on ]
>>>                 libnuma: [  on ]
>>> numa_num_possible_cpus: [  on ]
>>>                 libperl: [  on ]
>>>               libpython: [  on ]
>>>                libslang: [  on ]
>>>               libcrypto: [  on ]
>>>               libunwind: [  on ]
>>>      libdw-dwarf-unwind: [  on ]
>>>                    zlib: [  on ]
>>>                    lzma: [  on ]
>>>               get_cpuid: [  on ]
>>>                     bpf: [  on ]
>>>
>>> Jin Yao (3):
>>>    perf config: Add -DNO_GLIBC to CFLAGS
>>>    perf version: Print the status of compiled-in libraries
>>>    perf: Support perf -vv
>>>
>>>   tools/perf/Makefile.config   |   2 +
>>>   tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
>>>   tools/perf/builtin.h         |   1 +
>>>   tools/perf/perf.c            |   6 +++
>>>   4 files changed, 134 insertions(+)
>>>
>>> -- 
>>> 2.7.4
>>>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-26  9:39   ` Jiri Olsa
@ 2018-03-26 13:51     ` Jin, Yao
  2018-03-27  3:04       ` Jin, Yao
  2018-03-27 12:38       ` Jiri Olsa
  2018-03-27  1:44     ` Jin, Yao
  1 sibling, 2 replies; 20+ messages in thread
From: Jin, Yao @ 2018-03-26 13:51 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin



On 3/26/2018 5:39 PM, Jiri Olsa wrote:
> On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
>> This patch checks the values passed by CFLAGS (-DXXX) and then
>> print the status of libraries.
>>
>> For example, if HAVE_DWARF_SUPPORT is defined, that means the
>> library "dwarf" is compiled-in. The patch will print the status
>> "on" for this library.
>>
>> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
>> ---
>>   tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
>>   tools/perf/builtin.h         |   1 +
>>   2 files changed, 126 insertions(+)
>>
>> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
>> index 37019c5..90a0a7f 100644
>> --- a/tools/perf/builtin-version.c
>> +++ b/tools/perf/builtin-version.c
>> @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
>>   	printf("perf version %s\n", perf_version_string);
>>   	return 0;
>>   }
>> +
>> +static void status_print(const char *name, const char *status)
>> +{
>> +	printf("%22s: [ %3s ]\n", name, status);
>> +}
>> +
>> +static void library_status(void)
>> +{
>> +#ifdef HAVE_DWARF_SUPPORT
>> +	status_print("dwarf", "on");
>> +#else
>> +	status_print("dwarf", "off");
>> +#endif
> 
> could this and all those below be in some generic macro?
> 
> #define STATUS(__d, __m)		\
> #ifdef __d 				\
> 	status_print(#__m, "on");	\
> #else					\
> 	status_print(#__m, "OFF");	\
> #endif
> 
> STATUS(HAVE_DWARF_SUPPORT, dwarf)
> 
> 
> also please print the 'OFF' and use colors as in the build message
> 

Fine, thanks. I will update the code.

>> +
>> +#ifdef HAVE_DWARF_GETLOCATIONS
>> +	status_print("dwarf_getlocations", "on");
>> +#else
>> +	status_print("dwarf_getlocations", "off");
>> +#endif
>> +
>> +#ifdef NO_GLIBC
>> +	status_print("glibc", "off");
>> +#else
>> +	status_print("glibc", "on");
>> +#endif
>> +
>> +#ifdef HAVE_GTK2_SUPPORT
>> +	status_print("gtk2", "on");
>> +#else
>> +	status_print("gtk2", "off");
>> +#endif
>> +
> 
> SNIP
> 
>> +}
>> +
>> +int cmd_version2(int argc, const char **argv)
>> +{
>> +	cmd_version(argc, argv);
>> +	library_status();
>> +	return 0;
>> +}
>> diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
>> index 05745f3..c7508ee 100644
>> --- a/tools/perf/builtin.h
>> +++ b/tools/perf/builtin.h
>> @@ -29,6 +29,7 @@ int cmd_timechart(int argc, const char **argv);
>>   int cmd_top(int argc, const char **argv);
>>   int cmd_script(int argc, const char **argv);
>>   int cmd_version(int argc, const char **argv);
>> +int cmd_version2(int argc, const char **argv);
> 
> please don't add new command for this, handle this in cmd_version
>

Yeah, I know that, adding a new command is not a good idea.

But how can I pass a new parameter to cmd_version to indicate it's the 
-vv case? Use argv[1]? But looks not good since argc is 1.

Any idea about that?

Thanks
Jin Yao

> thanks,
> jirka
> 

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v1 0/3] Support perf -vv
@ 2018-03-26 16:07 Jin Yao
  2018-03-26  9:00 ` Andi Kleen
                   ` (3 more replies)
  0 siblings, 4 replies; 20+ messages in thread
From: Jin Yao @ 2018-03-26 16:07 UTC (permalink / raw)
  To: acme, jolsa, peterz, mingo, alexander.shishkin
  Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao

We keep having bug reports that when users build perf on their own,
but they don't install some needed libraries such as libelf,
libbfd/libibery.

The perf can build, but it is missing important functionality. And
users may complain that perf has issue or bug. 

This patch-set support 'perf -vv' which will print the compiled-in
status of libraries. Once users think perf missing some functionality,
it should be very easy for them to check the libraries status.

For example:

$ ./perf -vv
perf version 4.13.rc5.g9b7a81b
                 dwarf: [  on ]
    dwarf_getlocations: [  on ]
                 glibc: [  on ]
                  gtk2: [  on ]
              libaudit: [ off ]
                libbfd: [  on ]
                libelf: [  on ]
               libnuma: [  on ]
numa_num_possible_cpus: [  on ]
               libperl: [  on ]
             libpython: [  on ]
              libslang: [  on ]
             libcrypto: [  on ]
             libunwind: [  on ]
    libdw-dwarf-unwind: [  on ]
                  zlib: [  on ]
                  lzma: [  on ]
             get_cpuid: [  on ]
                   bpf: [  on ]

Jin Yao (3):
  perf config: Add -DNO_GLIBC to CFLAGS
  perf version: Print the status of compiled-in libraries
  perf: Support perf -vv

 tools/perf/Makefile.config   |   2 +
 tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
 tools/perf/builtin.h         |   1 +
 tools/perf/perf.c            |   6 +++
 4 files changed, 134 insertions(+)

-- 
2.7.4

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH v1 1/3] perf config: Add -DNO_GLIBC to CFLAGS
  2018-03-26 16:07 [PATCH v1 0/3] Support perf -vv Jin Yao
  2018-03-26  9:00 ` Andi Kleen
@ 2018-03-26 16:07 ` Jin Yao
  2018-03-26 16:07 ` [PATCH v1 2/3] perf version: Print the status of compiled-in libraries Jin Yao
  2018-03-26 16:07 ` [PATCH v1 3/3] perf: Support perf -vv Jin Yao
  3 siblings, 0 replies; 20+ messages in thread
From: Jin Yao @ 2018-03-26 16:07 UTC (permalink / raw)
  To: acme, jolsa, peterz, mingo, alexander.shishkin
  Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao

For most of libraries, in perf.config, they can be recorded with
-DHAVE_XXX or -DNO_XXX in CFLAGS according to if they are compiled-in.
Then C code could know if the library is compiled-in or not.

While for glibc, no existing -DHAVE_XXX or -DNO_XXX.

This patch adds -DNO_GLIBC to CFLAGS.

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
 tools/perf/Makefile.config | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
index 98ff736..5883dd6 100644
--- a/tools/perf/Makefile.config
+++ b/tools/perf/Makefile.config
@@ -324,6 +324,8 @@ else
       NO_LIBBPF := 1
       NO_JVMTI := 1
     else
+      CFLAGS += -DNO_GLIBC
+
       ifneq ($(filter s% -static%,$(LDFLAGS),),)
         msg := $(error No static glibc found, please install glibc-static);
       else
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-26 16:07 [PATCH v1 0/3] Support perf -vv Jin Yao
  2018-03-26  9:00 ` Andi Kleen
  2018-03-26 16:07 ` [PATCH v1 1/3] perf config: Add -DNO_GLIBC to CFLAGS Jin Yao
@ 2018-03-26 16:07 ` Jin Yao
  2018-03-26  9:39   ` Jiri Olsa
  2018-03-27  5:58   ` Ingo Molnar
  2018-03-26 16:07 ` [PATCH v1 3/3] perf: Support perf -vv Jin Yao
  3 siblings, 2 replies; 20+ messages in thread
From: Jin Yao @ 2018-03-26 16:07 UTC (permalink / raw)
  To: acme, jolsa, peterz, mingo, alexander.shishkin
  Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao

This patch checks the values passed by CFLAGS (-DXXX) and then
print the status of libraries.

For example, if HAVE_DWARF_SUPPORT is defined, that means the
library "dwarf" is compiled-in. The patch will print the status
"on" for this library.

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
 tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
 tools/perf/builtin.h         |   1 +
 2 files changed, 126 insertions(+)

diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
index 37019c5..90a0a7f 100644
--- a/tools/perf/builtin-version.c
+++ b/tools/perf/builtin-version.c
@@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
 	printf("perf version %s\n", perf_version_string);
 	return 0;
 }
+
+static void status_print(const char *name, const char *status)
+{
+	printf("%22s: [ %3s ]\n", name, status);
+}
+
+static void library_status(void)
+{
+#ifdef HAVE_DWARF_SUPPORT
+	status_print("dwarf", "on");
+#else
+	status_print("dwarf", "off");
+#endif
+
+#ifdef HAVE_DWARF_GETLOCATIONS
+	status_print("dwarf_getlocations", "on");
+#else
+	status_print("dwarf_getlocations", "off");
+#endif
+
+#ifdef NO_GLIBC
+	status_print("glibc", "off");
+#else
+	status_print("glibc", "on");
+#endif
+
+#ifdef HAVE_GTK2_SUPPORT
+	status_print("gtk2", "on");
+#else
+	status_print("gtk2", "off");
+#endif
+
+#ifdef HAVE_LIBAUDIT_SUPPORT
+	status_print("libaudit", "on");
+#else
+	status_print("libaudit", "off");
+#endif
+
+#ifdef HAVE_LIBBFD_SUPPORT
+	status_print("libbfd", "on");
+#else
+	status_print("libbfd", "off");
+#endif
+
+#ifdef HAVE_LIBELF_SUPPORT
+	status_print("libelf", "on");
+#else
+	status_print("libelf", "off");
+#endif
+
+#ifdef HAVE_LIBNUMA_SUPPORT
+	status_print("libnuma", "on");
+	status_print("numa_num_possible_cpus", "on");
+#else
+	status_print("libnuma", "off");
+	status_print("numa_num_possible_cpus", "off");
+#endif
+
+#ifdef NO_LIBPERL
+	status_print("libperl", "off");
+#else
+	status_print("libperl", "on");
+#endif
+
+#ifdef NO_LIBPYTHON
+	status_print("libpython", "off");
+#else
+	status_print("libpython", "on");
+#endif
+
+#ifdef HAVE_SLANG_SUPPORT
+	status_print("libslang", "on");
+#else
+	status_print("libslang", "off");
+#endif
+
+#ifdef HAVE_LIBCRYPTO_SUPPORT
+	status_print("libcrypto", "on");
+#else
+	status_print("libcrypto", "off");
+#endif
+
+#ifdef HAVE_LIBUNWIND_SUPPORT
+	status_print("libunwind", "on");
+#else
+	status_print("libunwind", "off");
+#endif
+
+#ifdef HAVE_DWARF_SUPPORT
+	status_print("libdw-dwarf-unwind", "on");
+#else
+	status_print("libdw-dwarf-unwind", "off");
+#endif
+
+#ifdef HAVE_ZLIB_SUPPORT
+	status_print("zlib", "on");
+#else
+	status_print("zlib", "off");
+#endif
+
+#ifdef HAVE_LZMA_SUPPORT
+	status_print("lzma", "on");
+#else
+	status_print("lzma", "off");
+#endif
+
+#ifdef HAVE_AUXTRACE_SUPPORT
+	status_print("get_cpuid", "on");
+#else
+	status_print("get_cpuid", "off");
+#endif
+
+#ifdef HAVE_LIBBPF_SUPPORT
+	status_print("bpf", "on");
+#else
+	status_print("bpf", "off");
+#endif
+}
+
+int cmd_version2(int argc, const char **argv)
+{
+	cmd_version(argc, argv);
+	library_status();
+	return 0;
+}
diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
index 05745f3..c7508ee 100644
--- a/tools/perf/builtin.h
+++ b/tools/perf/builtin.h
@@ -29,6 +29,7 @@ int cmd_timechart(int argc, const char **argv);
 int cmd_top(int argc, const char **argv);
 int cmd_script(int argc, const char **argv);
 int cmd_version(int argc, const char **argv);
+int cmd_version2(int argc, const char **argv);
 int cmd_probe(int argc, const char **argv);
 int cmd_kmem(int argc, const char **argv);
 int cmd_lock(int argc, const char **argv);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH v1 3/3] perf: Support perf -vv
  2018-03-26 16:07 [PATCH v1 0/3] Support perf -vv Jin Yao
                   ` (2 preceding siblings ...)
  2018-03-26 16:07 ` [PATCH v1 2/3] perf version: Print the status of compiled-in libraries Jin Yao
@ 2018-03-26 16:07 ` Jin Yao
  2018-03-27  6:03   ` Ingo Molnar
  3 siblings, 1 reply; 20+ messages in thread
From: Jin Yao @ 2018-03-26 16:07 UTC (permalink / raw)
  To: acme, jolsa, peterz, mingo, alexander.shishkin
  Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao

We keep having bug reports that when users build perf on their own,
but they don't install some needed libraries such as libelf,
libbfd/libibery.

The perf can build, but it is missing important functionality.

This patch provides a new option '-vv' which will print the
compiled-in status of libraries.

For example:

$ ./perf -vv
perf version 4.13.rc5.g9b7a81b
                 dwarf: [  on ]
    dwarf_getlocations: [  on ]
                 glibc: [  on ]
                  gtk2: [  on ]
              libaudit: [ off ]
                libbfd: [  on ]
                libelf: [  on ]
               libnuma: [  on ]
numa_num_possible_cpus: [  on ]
               libperl: [  on ]
             libpython: [  on ]
              libslang: [  on ]
             libcrypto: [  on ]
             libunwind: [  on ]
    libdw-dwarf-unwind: [  on ]
                  zlib: [  on ]
                  lzma: [  on ]
             get_cpuid: [  on ]
                   bpf: [  on ]

Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
 tools/perf/perf.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 1b3fc8e..300c83d 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -64,6 +64,7 @@ static struct cmd_struct commands[] = {
 	{ "top",	cmd_top,	0 },
 	{ "annotate",	cmd_annotate,	0 },
 	{ "version",	cmd_version,	0 },
+	{ "version2",	cmd_version2,	0 },
 	{ "script",	cmd_script,	0 },
 	{ "sched",	cmd_sched,	0 },
 #ifdef HAVE_LIBELF_SUPPORT
@@ -190,6 +191,11 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 			break;
 		}
 
+		if (!strcmp(cmd, "-vv")) {
+			(*argv)[0] = "--version2";
+			break;
+		}
+
 		/*
 		 * Check remaining flags.
 		 */
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-26  9:39   ` Jiri Olsa
  2018-03-26 13:51     ` Jin, Yao
@ 2018-03-27  1:44     ` Jin, Yao
  2018-03-27 12:56       ` Jiri Olsa
  1 sibling, 1 reply; 20+ messages in thread
From: Jin, Yao @ 2018-03-27  1:44 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin



On 3/26/2018 5:39 PM, Jiri Olsa wrote:
> On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
>> This patch checks the values passed by CFLAGS (-DXXX) and then
>> print the status of libraries.
>>
>> For example, if HAVE_DWARF_SUPPORT is defined, that means the
>> library "dwarf" is compiled-in. The patch will print the status
>> "on" for this library.
>>
>> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
>> ---
>>   tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
>>   tools/perf/builtin.h         |   1 +
>>   2 files changed, 126 insertions(+)
>>
>> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
>> index 37019c5..90a0a7f 100644
>> --- a/tools/perf/builtin-version.c
>> +++ b/tools/perf/builtin-version.c
>> @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
>>   	printf("perf version %s\n", perf_version_string);
>>   	return 0;
>>   }
>> +
>> +static void status_print(const char *name, const char *status)
>> +{
>> +	printf("%22s: [ %3s ]\n", name, status);
>> +}
>> +
>> +static void library_status(void)
>> +{
>> +#ifdef HAVE_DWARF_SUPPORT
>> +	status_print("dwarf", "on");
>> +#else
>> +	status_print("dwarf", "off");
>> +#endif
> 
> could this and all those below be in some generic macro?
> 
> #define STATUS(__d, __m)		\
> #ifdef __d 				\
> 	status_print(#__m, "on");	\
> #else					\
> 	status_print(#__m, "OFF");	\
> #endif
> 
> STATUS(HAVE_DWARF_SUPPORT, dwarf)
> 
> 

Hi Jiri,

I have tried this macro definition, but unfortunately the compilation is 
failed.

error: '#' is not followed by a macro parameter
  #define STATUS(__d, __m)  \

I just guess the '#' in #ifdef confuses the gcc. Looks we can't define 
#ifdef/#endif block in a macro.

Thanks
Jin Yao

> also please print the 'OFF' and use colors as in the build message
> 
>> +
>> +#ifdef HAVE_DWARF_GETLOCATIONS
>> +	status_print("dwarf_getlocations", "on");
>> +#else
>> +	status_print("dwarf_getlocations", "off");
>> +#endif
>> +
>> +#ifdef NO_GLIBC
>> +	status_print("glibc", "off");
>> +#else
>> +	status_print("glibc", "on");
>> +#endif
>> +
>> +#ifdef HAVE_GTK2_SUPPORT
>> +	status_print("gtk2", "on");
>> +#else
>> +	status_print("gtk2", "off");
>> +#endif
>> +
> 
> SNIP
> 
>> +}
>> +
>> +int cmd_version2(int argc, const char **argv)
>> +{
>> +	cmd_version(argc, argv);
>> +	library_status();
>> +	return 0;
>> +}
>> diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
>> index 05745f3..c7508ee 100644
>> --- a/tools/perf/builtin.h
>> +++ b/tools/perf/builtin.h
>> @@ -29,6 +29,7 @@ int cmd_timechart(int argc, const char **argv);
>>   int cmd_top(int argc, const char **argv);
>>   int cmd_script(int argc, const char **argv);
>>   int cmd_version(int argc, const char **argv);
>> +int cmd_version2(int argc, const char **argv);
> 
> please don't add new command for this, handle this in cmd_version
> 
> thanks,
> jirka
> 

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-26 13:51     ` Jin, Yao
@ 2018-03-27  3:04       ` Jin, Yao
  2018-03-27 12:38       ` Jiri Olsa
  1 sibling, 0 replies; 20+ messages in thread
From: Jin, Yao @ 2018-03-27  3:04 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin



On 3/26/2018 9:51 PM, Jin, Yao wrote:
> 
> 
> On 3/26/2018 5:39 PM, Jiri Olsa wrote:
>> On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
>>> This patch checks the values passed by CFLAGS (-DXXX) and then
>>> print the status of libraries.
>>>
>>> For example, if HAVE_DWARF_SUPPORT is defined, that means the
>>> library "dwarf" is compiled-in. The patch will print the status
>>> "on" for this library.
>>>
>>> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
>>> ---
>>>   tools/perf/builtin-version.c | 125 
>>> +++++++++++++++++++++++++++++++++++++++++++
>>>   tools/perf/builtin.h         |   1 +
>>>   2 files changed, 126 insertions(+)
>>>
>>> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
>>> index 37019c5..90a0a7f 100644
>>> --- a/tools/perf/builtin-version.c
>>> +++ b/tools/perf/builtin-version.c
>>> @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char 
>>> **argv __maybe_unused)
>>>       printf("perf version %s\n", perf_version_string);
>>>       return 0;
>>>   }
>>> +
>>> +static void status_print(const char *name, const char *status)
>>> +{
>>> +    printf("%22s: [ %3s ]\n", name, status);
>>> +}
>>> +
>>> +static void library_status(void)
>>> +{
>>> +#ifdef HAVE_DWARF_SUPPORT
>>> +    status_print("dwarf", "on");
>>> +#else
>>> +    status_print("dwarf", "off");
>>> +#endif
>>
>> could this and all those below be in some generic macro?
>>
>> #define STATUS(__d, __m)        \
>> #ifdef __d                 \
>>     status_print(#__m, "on");    \
>> #else                    \
>>     status_print(#__m, "OFF");    \
>> #endif
>>
>> STATUS(HAVE_DWARF_SUPPORT, dwarf)
>>
>>
>> also please print the 'OFF' and use colors as in the build message
>>
> 
> Fine, thanks. I will update the code.
> 
>>> +
>>> +#ifdef HAVE_DWARF_GETLOCATIONS
>>> +    status_print("dwarf_getlocations", "on");
>>> +#else
>>> +    status_print("dwarf_getlocations", "off");
>>> +#endif
>>> +
>>> +#ifdef NO_GLIBC
>>> +    status_print("glibc", "off");
>>> +#else
>>> +    status_print("glibc", "on");
>>> +#endif
>>> +
>>> +#ifdef HAVE_GTK2_SUPPORT
>>> +    status_print("gtk2", "on");
>>> +#else
>>> +    status_print("gtk2", "off");
>>> +#endif
>>> +
>>
>> SNIP
>>
>>> +}
>>> +
>>> +int cmd_version2(int argc, const char **argv)
>>> +{
>>> +    cmd_version(argc, argv);
>>> +    library_status();
>>> +    return 0;
>>> +}
>>> diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
>>> index 05745f3..c7508ee 100644
>>> --- a/tools/perf/builtin.h
>>> +++ b/tools/perf/builtin.h
>>> @@ -29,6 +29,7 @@ int cmd_timechart(int argc, const char **argv);
>>>   int cmd_top(int argc, const char **argv);
>>>   int cmd_script(int argc, const char **argv);
>>>   int cmd_version(int argc, const char **argv);
>>> +int cmd_version2(int argc, const char **argv);
>>
>> please don't add new command for this, handle this in cmd_version
>>
> 
> Yeah, I know that, adding a new command is not a good idea.
> 
> But how can I pass a new parameter to cmd_version to indicate it's the 
> -vv case? Use argv[1]? But looks not good since argc is 1.
> 
> Any idea about that?
> 
> Thanks
> Jin Yao
> 

Hi Jiri,

Maybe could we just add the information to 'perf -v'? I mean we don't 
need the 'perf -vv', directly add the information to 'perf -v'. Is it OK?

Thanks
Jin Yao

>> thanks,
>> jirka
>>

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-26 16:07 ` [PATCH v1 2/3] perf version: Print the status of compiled-in libraries Jin Yao
  2018-03-26  9:39   ` Jiri Olsa
@ 2018-03-27  5:58   ` Ingo Molnar
  2018-03-27  6:04     ` Jin, Yao
  1 sibling, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2018-03-27  5:58 UTC (permalink / raw)
  To: Jin Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin


* Jin Yao <yao.jin@linux.intel.com> wrote:

> +#ifdef HAVE_DWARF_SUPPORT
> +#ifdef HAVE_DWARF_GETLOCATIONS
> +#ifdef NO_GLIBC
> +#ifdef HAVE_GTK2_SUPPORT
> +#ifdef HAVE_LIBAUDIT_SUPPORT
> +#ifdef HAVE_LIBBFD_SUPPORT
> +#ifdef HAVE_LIBELF_SUPPORT
> +#ifdef HAVE_LIBNUMA_SUPPORT
> +#ifdef NO_LIBPERL
> +#ifdef NO_LIBPYTHON
> +#ifdef HAVE_SLANG_SUPPORT
> +#ifdef HAVE_LIBCRYPTO_SUPPORT
> +#ifdef HAVE_LIBUNWIND_SUPPORT
> +#ifdef HAVE_DWARF_SUPPORT
> +#ifdef HAVE_ZLIB_SUPPORT
> +#ifdef HAVE_LZMA_SUPPORT
> +#ifdef HAVE_AUXTRACE_SUPPORT
> +#ifdef HAVE_LIBBPF_SUPPORT

BTW., it would be nice at this point to fix those 3 outliers that have a negation 
in their library support status macro:

> +#ifdef NO_GLIBC
> +#ifdef NO_LIBPERL
> +#ifdef NO_LIBPYTHON

... and invert them back to the HAVE_* side of the logic:

> +#ifdef HAVE_GLIBC
> +#ifdef HAVE_LIBPERL
> +#ifdef HAVE_LIBPYTHON

That should make all related code more consistent and more readable.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 3/3] perf: Support perf -vv
  2018-03-26 16:07 ` [PATCH v1 3/3] perf: Support perf -vv Jin Yao
@ 2018-03-27  6:03   ` Ingo Molnar
  2018-03-27  6:12     ` Jin, Yao
  0 siblings, 1 reply; 20+ messages in thread
From: Ingo Molnar @ 2018-03-27  6:03 UTC (permalink / raw)
  To: Jin Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin


* Jin Yao <yao.jin@linux.intel.com> wrote:

> +++ b/tools/perf/perf.c
> @@ -64,6 +64,7 @@ static struct cmd_struct commands[] = {
>  	{ "top",	cmd_top,	0 },
>  	{ "annotate",	cmd_annotate,	0 },
>  	{ "version",	cmd_version,	0 },
> +	{ "version2",	cmd_version2,	0 },
>  	{ "script",	cmd_script,	0 },
>  	{ "sched",	cmd_sched,	0 },
>  #ifdef HAVE_LIBELF_SUPPORT
> @@ -190,6 +191,11 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
>  			break;
>  		}
>  
> +		if (!strcmp(cmd, "-vv")) {
> +			(*argv)[0] = "--version2";
> +			break;
> +		}

That is just lazy hackery, please use the regular option library to add options 
and document them!

Also, '--version2' is a sloppy name, the right solution is to do what Git does, it 
has a --build-options sub-option to 'perf version':

  triton:~/tip> git version -h
  usage: git version [<options>]

      --build-options       also print build options


  triton:~/tip> git version --build-options
  git version 2.14.1
  sizeof-long: 8

This should be done for perf as well, and _then_ maybe can we add a helper alias 
that maps '-vv' to 'version --build-options'.

Thanks,

	Ingo

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-27  5:58   ` Ingo Molnar
@ 2018-03-27  6:04     ` Jin, Yao
  0 siblings, 0 replies; 20+ messages in thread
From: Jin, Yao @ 2018-03-27  6:04 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin



On 3/27/2018 1:58 PM, Ingo Molnar wrote:
> 
> * Jin Yao <yao.jin@linux.intel.com> wrote:
> 
>> +#ifdef HAVE_DWARF_SUPPORT
>> +#ifdef HAVE_DWARF_GETLOCATIONS
>> +#ifdef NO_GLIBC
>> +#ifdef HAVE_GTK2_SUPPORT
>> +#ifdef HAVE_LIBAUDIT_SUPPORT
>> +#ifdef HAVE_LIBBFD_SUPPORT
>> +#ifdef HAVE_LIBELF_SUPPORT
>> +#ifdef HAVE_LIBNUMA_SUPPORT
>> +#ifdef NO_LIBPERL
>> +#ifdef NO_LIBPYTHON
>> +#ifdef HAVE_SLANG_SUPPORT
>> +#ifdef HAVE_LIBCRYPTO_SUPPORT
>> +#ifdef HAVE_LIBUNWIND_SUPPORT
>> +#ifdef HAVE_DWARF_SUPPORT
>> +#ifdef HAVE_ZLIB_SUPPORT
>> +#ifdef HAVE_LZMA_SUPPORT
>> +#ifdef HAVE_AUXTRACE_SUPPORT
>> +#ifdef HAVE_LIBBPF_SUPPORT
> 
> BTW., it would be nice at this point to fix those 3 outliers that have a negation
> in their library support status macro:
> 
>> +#ifdef NO_GLIBC
>> +#ifdef NO_LIBPERL
>> +#ifdef NO_LIBPYTHON
> 
> ... and invert them back to the HAVE_* side of the logic:
> 
>> +#ifdef HAVE_GLIBC
>> +#ifdef HAVE_LIBPERL
>> +#ifdef HAVE_LIBPYTHON
> 
> That should make all related code more consistent and more readable.
> 
> Thanks,
> 
> 	Ingo
> 

Yes, it's better, thanks!
I will try to convert them to the HAVE_*.

Thanks
Jin Yao

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 3/3] perf: Support perf -vv
  2018-03-27  6:03   ` Ingo Molnar
@ 2018-03-27  6:12     ` Jin, Yao
  0 siblings, 0 replies; 20+ messages in thread
From: Jin, Yao @ 2018-03-27  6:12 UTC (permalink / raw)
  To: Ingo Molnar
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin



On 3/27/2018 2:03 PM, Ingo Molnar wrote:
> 
> * Jin Yao <yao.jin@linux.intel.com> wrote:
> 
>> +++ b/tools/perf/perf.c
>> @@ -64,6 +64,7 @@ static struct cmd_struct commands[] = {
>>   	{ "top",	cmd_top,	0 },
>>   	{ "annotate",	cmd_annotate,	0 },
>>   	{ "version",	cmd_version,	0 },
>> +	{ "version2",	cmd_version2,	0 },
>>   	{ "script",	cmd_script,	0 },
>>   	{ "sched",	cmd_sched,	0 },
>>   #ifdef HAVE_LIBELF_SUPPORT
>> @@ -190,6 +191,11 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
>>   			break;
>>   		}
>>   
>> +		if (!strcmp(cmd, "-vv")) {
>> +			(*argv)[0] = "--version2";
>> +			break;
>> +		}
> 
> That is just lazy hackery, please use the regular option library to add options
> and document them!
> 
> Also, '--version2' is a sloppy name, the right solution is to do what Git does, it
> has a --build-options sub-option to 'perf version':
> 
>    triton:~/tip> git version -h
>    usage: git version [<options>]
> 
>        --build-options       also print build options
> 
> 
>    triton:~/tip> git version --build-options
>    git version 2.14.1
>    sizeof-long: 8
> 
> This should be done for perf as well, and _then_ maybe can we add a helper alias
> that maps '-vv' to 'version --build-options'.
> 
> Thanks,
> 
> 	Ingo
> 

Something like 'perf version --build-options' and that will be mapped to 
'-vv'.

It's a good idea, thanks!

Thanks
Jin Yao

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-26 13:51     ` Jin, Yao
  2018-03-27  3:04       ` Jin, Yao
@ 2018-03-27 12:38       ` Jiri Olsa
  2018-03-27 13:26         ` Jin, Yao
  1 sibling, 1 reply; 20+ messages in thread
From: Jiri Olsa @ 2018-03-27 12:38 UTC (permalink / raw)
  To: Jin, Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin

On Mon, Mar 26, 2018 at 09:51:03PM +0800, Jin, Yao wrote:
> 
> 
> On 3/26/2018 5:39 PM, Jiri Olsa wrote:
> > On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
> > > This patch checks the values passed by CFLAGS (-DXXX) and then
> > > print the status of libraries.
> > > 
> > > For example, if HAVE_DWARF_SUPPORT is defined, that means the
> > > library "dwarf" is compiled-in. The patch will print the status
> > > "on" for this library.
> > > 
> > > Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
> > > ---
> > >   tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
> > >   tools/perf/builtin.h         |   1 +
> > >   2 files changed, 126 insertions(+)
> > > 
> > > diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> > > index 37019c5..90a0a7f 100644
> > > --- a/tools/perf/builtin-version.c
> > > +++ b/tools/perf/builtin-version.c
> > > @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
> > >   	printf("perf version %s\n", perf_version_string);
> > >   	return 0;
> > >   }
> > > +
> > > +static void status_print(const char *name, const char *status)
> > > +{
> > > +	printf("%22s: [ %3s ]\n", name, status);
> > > +}
> > > +
> > > +static void library_status(void)
> > > +{
> > > +#ifdef HAVE_DWARF_SUPPORT
> > > +	status_print("dwarf", "on");
> > > +#else
> > > +	status_print("dwarf", "off");
> > > +#endif
> > 
> > could this and all those below be in some generic macro?
> > 
> > #define STATUS(__d, __m)		\
> > #ifdef __d 				\
> > 	status_print(#__m, "on");	\
> > #else					\
> > 	status_print(#__m, "OFF");	\
> > #endif
> > 
> > STATUS(HAVE_DWARF_SUPPORT, dwarf)
> > 
> > 
> > also please print the 'OFF' and use colors as in the build message
> > 
> 
> Fine, thanks. I will update the code.
> 
> > > +
> > > +#ifdef HAVE_DWARF_GETLOCATIONS
> > > +	status_print("dwarf_getlocations", "on");
> > > +#else
> > > +	status_print("dwarf_getlocations", "off");
> > > +#endif
> > > +
> > > +#ifdef NO_GLIBC
> > > +	status_print("glibc", "off");
> > > +#else
> > > +	status_print("glibc", "on");
> > > +#endif
> > > +
> > > +#ifdef HAVE_GTK2_SUPPORT
> > > +	status_print("gtk2", "on");
> > > +#else
> > > +	status_print("gtk2", "off");
> > > +#endif
> > > +
> > 
> > SNIP
> > 
> > > +}
> > > +
> > > +int cmd_version2(int argc, const char **argv)
> > > +{
> > > +	cmd_version(argc, argv);
> > > +	library_status();
> > > +	return 0;
> > > +}
> > > diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
> > > index 05745f3..c7508ee 100644
> > > --- a/tools/perf/builtin.h
> > > +++ b/tools/perf/builtin.h
> > > @@ -29,6 +29,7 @@ int cmd_timechart(int argc, const char **argv);
> > >   int cmd_top(int argc, const char **argv);
> > >   int cmd_script(int argc, const char **argv);
> > >   int cmd_version(int argc, const char **argv);
> > > +int cmd_version2(int argc, const char **argv);
> > 
> > please don't add new command for this, handle this in cmd_version
> > 
> 
> Yeah, I know that, adding a new command is not a good idea.
> 
> But how can I pass a new parameter to cmd_version to indicate it's the -vv
> case? Use argv[1]? But looks not good since argc is 1.
> 
> Any idea about that?

I guess the based would be to have 'perf version -v', where
in cmd_version you'd call standard option processing..

the 'perf -vv' shortcut could for example be done through
some global var like in attached patch... untested

jirka


---
diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
index 37019c5d675f..1fe458792cc1 100644
--- a/tools/perf/builtin-version.c
+++ b/tools/perf/builtin-version.c
@@ -4,6 +4,8 @@
 #include <linux/compiler.h>
 #include <stdio.h>
 
+int version_verbose;
+
 int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
 {
 	printf("perf version %s\n", perf_version_string);
diff --git a/tools/perf/perf.c b/tools/perf/perf.c
index 1b3fc8ec0fa2..a5c95c6c0de7 100644
--- a/tools/perf/perf.c
+++ b/tools/perf/perf.c
@@ -185,7 +185,14 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
 			break;
 		}
 
-		if (!strcmp(cmd, "-v")) {
+		if (strstarts(cmd, "-v")) {
+			int i;
+
+			for (i = 2; cmd[i]; i++) {
+				if (cmd[i] == 'v')
+					version_verbose++;
+			}
+
 			(*argv)[0] = "--version";
 			break;
 		}
diff --git a/tools/perf/perf.h b/tools/perf/perf.h
index 8fec1abd0f1f..9c45ba179635 100644
--- a/tools/perf/perf.h
+++ b/tools/perf/perf.h
@@ -13,6 +13,8 @@ void test_attr__init(void);
 void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
 		     int fd, int group_fd, unsigned long flags);
 
+extern int version_verbose;
+
 #define HAVE_ATTR_TEST
 #include "perf-sys.h"
 

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-27  1:44     ` Jin, Yao
@ 2018-03-27 12:56       ` Jiri Olsa
  2018-03-27 13:17         ` Jin, Yao
  0 siblings, 1 reply; 20+ messages in thread
From: Jiri Olsa @ 2018-03-27 12:56 UTC (permalink / raw)
  To: Jin, Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin

On Tue, Mar 27, 2018 at 09:44:23AM +0800, Jin, Yao wrote:
> 
> 
> On 3/26/2018 5:39 PM, Jiri Olsa wrote:
> > On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
> > > This patch checks the values passed by CFLAGS (-DXXX) and then
> > > print the status of libraries.
> > > 
> > > For example, if HAVE_DWARF_SUPPORT is defined, that means the
> > > library "dwarf" is compiled-in. The patch will print the status
> > > "on" for this library.
> > > 
> > > Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
> > > ---
> > >   tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
> > >   tools/perf/builtin.h         |   1 +
> > >   2 files changed, 126 insertions(+)
> > > 
> > > diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> > > index 37019c5..90a0a7f 100644
> > > --- a/tools/perf/builtin-version.c
> > > +++ b/tools/perf/builtin-version.c
> > > @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
> > >   	printf("perf version %s\n", perf_version_string);
> > >   	return 0;
> > >   }
> > > +
> > > +static void status_print(const char *name, const char *status)
> > > +{
> > > +	printf("%22s: [ %3s ]\n", name, status);
> > > +}
> > > +
> > > +static void library_status(void)
> > > +{
> > > +#ifdef HAVE_DWARF_SUPPORT
> > > +	status_print("dwarf", "on");
> > > +#else
> > > +	status_print("dwarf", "off");
> > > +#endif
> > 
> > could this and all those below be in some generic macro?
> > 
> > #define STATUS(__d, __m)		\
> > #ifdef __d 				\
> > 	status_print(#__m, "on");	\
> > #else					\
> > 	status_print(#__m, "OFF");	\
> > #endif
> > 
> > STATUS(HAVE_DWARF_SUPPORT, dwarf)
> > 
> > 
> 
> Hi Jiri,
> 
> I have tried this macro definition, but unfortunately the compilation is
> failed.
> 
> error: '#' is not followed by a macro parameter
>  #define STATUS(__d, __m)  \
> 
> I just guess the '#' in #ifdef confuses the gcc. Looks we can't define
> #ifdef/#endif block in a macro.
> 

ah crap.. right ;-) how about we take the IS_BUILTIN thingie
from include/linux/kconfig.h and use it as in attached test
change.. it gives me:

	[jolsa@krava perf]$ ./perf version
	perf version 4.16.rc6.g1ee9a60
			 dwarf: [  on ]
			 krava: [ OFF ]

we could put those macros into tools/include/tools/config.h, Arnaldo?
together with the comments from kconfig.h that I cut out..

thanks,
jirka


---
diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
index 1fe458792cc1..b392f9e80fd0 100644
--- a/tools/perf/builtin-version.c
+++ b/tools/perf/builtin-version.c
@@ -6,8 +6,33 @@
 
 int version_verbose;
 
+
+#define __ARG_PLACEHOLDER_1 0,
+#define __take_second_arg(__ignored, val, ...) val
+
+#define __is_defined(x)                 ___is_defined(x)
+#define ___is_defined(val)              ____is_defined(__ARG_PLACEHOLDER_##val) 
+#define ____is_defined(arg1_or_junk)    __take_second_arg(arg1_or_junk 1, 0)
+
+#define IS_BUILTIN(option) __is_defined(option)
+
+
+static void status_print(const char *name, const char *status)
+{
+	printf("%22s: [ %3s ]\n", name, status);
+}
+
 int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
 {
 	printf("perf version %s\n", perf_version_string);
+
+#define STATUS(__d, __m)			\
+	if (IS_BUILTIN(__d))			\
+		status_print(#__m, "on");	\
+	else					\
+		status_print(#__m, "OFF");
+
+	STATUS(HAVE_DWARF_SUPPORT, dwarf)
+	STATUS(HAVE_KRAVA_SUPPORT, krava)
 	return 0;
 }

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-27 12:56       ` Jiri Olsa
@ 2018-03-27 13:17         ` Jin, Yao
  2018-03-27 13:35           ` Jiri Olsa
  0 siblings, 1 reply; 20+ messages in thread
From: Jin, Yao @ 2018-03-27 13:17 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin



On 3/27/2018 8:56 PM, Jiri Olsa wrote:
> On Tue, Mar 27, 2018 at 09:44:23AM +0800, Jin, Yao wrote:
>>
>>
>> On 3/26/2018 5:39 PM, Jiri Olsa wrote:
>>> On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
>>>> This patch checks the values passed by CFLAGS (-DXXX) and then
>>>> print the status of libraries.
>>>>
>>>> For example, if HAVE_DWARF_SUPPORT is defined, that means the
>>>> library "dwarf" is compiled-in. The patch will print the status
>>>> "on" for this library.
>>>>
>>>> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
>>>> ---
>>>>    tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
>>>>    tools/perf/builtin.h         |   1 +
>>>>    2 files changed, 126 insertions(+)
>>>>
>>>> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
>>>> index 37019c5..90a0a7f 100644
>>>> --- a/tools/perf/builtin-version.c
>>>> +++ b/tools/perf/builtin-version.c
>>>> @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
>>>>    	printf("perf version %s\n", perf_version_string);
>>>>    	return 0;
>>>>    }
>>>> +
>>>> +static void status_print(const char *name, const char *status)
>>>> +{
>>>> +	printf("%22s: [ %3s ]\n", name, status);
>>>> +}
>>>> +
>>>> +static void library_status(void)
>>>> +{
>>>> +#ifdef HAVE_DWARF_SUPPORT
>>>> +	status_print("dwarf", "on");
>>>> +#else
>>>> +	status_print("dwarf", "off");
>>>> +#endif
>>>
>>> could this and all those below be in some generic macro?
>>>
>>> #define STATUS(__d, __m)		\
>>> #ifdef __d 				\
>>> 	status_print(#__m, "on");	\
>>> #else					\
>>> 	status_print(#__m, "OFF");	\
>>> #endif
>>>
>>> STATUS(HAVE_DWARF_SUPPORT, dwarf)
>>>
>>>
>>
>> Hi Jiri,
>>
>> I have tried this macro definition, but unfortunately the compilation is
>> failed.
>>
>> error: '#' is not followed by a macro parameter
>>   #define STATUS(__d, __m)  \
>>
>> I just guess the '#' in #ifdef confuses the gcc. Looks we can't define
>> #ifdef/#endif block in a macro.
>>
> 
> ah crap.. right ;-) how about we take the IS_BUILTIN thingie
> from include/linux/kconfig.h and use it as in attached test
> change.. it gives me:
> 
> 	[jolsa@krava perf]$ ./perf version
> 	perf version 4.16.rc6.g1ee9a60
> 			 dwarf: [  on ]
> 			 krava: [ OFF ]
> 
> we could put those macros into tools/include/tools/config.h, Arnaldo?
> together with the comments from kconfig.h that I cut out..
> 
> thanks,
> jirka
> 
> 
> ---
> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> index 1fe458792cc1..b392f9e80fd0 100644
> --- a/tools/perf/builtin-version.c
> +++ b/tools/perf/builtin-version.c
> @@ -6,8 +6,33 @@
>   
>   int version_verbose;
>   
> +
> +#define __ARG_PLACEHOLDER_1 0,
> +#define __take_second_arg(__ignored, val, ...) val
> +
> +#define __is_defined(x)                 ___is_defined(x)
> +#define ___is_defined(val)              ____is_defined(__ARG_PLACEHOLDER_##val)
> +#define ____is_defined(arg1_or_junk)    __take_second_arg(arg1_or_junk 1, 0)
> +
> +#define IS_BUILTIN(option) __is_defined(option)
> +
> +
> +static void status_print(const char *name, const char *status)
> +{
> +	printf("%22s: [ %3s ]\n", name, status);
> +}
> +
>   int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
>   {
>   	printf("perf version %s\n", perf_version_string);
> +
> +#define STATUS(__d, __m)			\
> +	if (IS_BUILTIN(__d))			\
> +		status_print(#__m, "on");	\
> +	else					\
> +		status_print(#__m, "OFF");
> +
> +	STATUS(HAVE_DWARF_SUPPORT, dwarf)
> +	STATUS(HAVE_KRAVA_SUPPORT, krava)
>   	return 0;
>   }
> 

Hi Jiri,

It looks we need to copy the IS_BUILTIN and associated macro definitions 
to a common header file.

I guess you will post this patch if Arnaldo agree with this idea, right?

I plan to post v2 of this patch series after this 'IS_BUILTIN' patch 
gets merged.

Thanks
Jin Yao

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-27 12:38       ` Jiri Olsa
@ 2018-03-27 13:26         ` Jin, Yao
  0 siblings, 0 replies; 20+ messages in thread
From: Jin, Yao @ 2018-03-27 13:26 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin



On 3/27/2018 8:38 PM, Jiri Olsa wrote:
> On Mon, Mar 26, 2018 at 09:51:03PM +0800, Jin, Yao wrote:
>>
>>
>> On 3/26/2018 5:39 PM, Jiri Olsa wrote:
>>> On Tue, Mar 27, 2018 at 12:07:03AM +0800, Jin Yao wrote:
>>>> This patch checks the values passed by CFLAGS (-DXXX) and then
>>>> print the status of libraries.
>>>>
>>>> For example, if HAVE_DWARF_SUPPORT is defined, that means the
>>>> library "dwarf" is compiled-in. The patch will print the status
>>>> "on" for this library.
>>>>
>>>> Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
>>>> ---
>>>>    tools/perf/builtin-version.c | 125 +++++++++++++++++++++++++++++++++++++++++++
>>>>    tools/perf/builtin.h         |   1 +
>>>>    2 files changed, 126 insertions(+)
>>>>
>>>> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
>>>> index 37019c5..90a0a7f 100644
>>>> --- a/tools/perf/builtin-version.c
>>>> +++ b/tools/perf/builtin-version.c
>>>> @@ -9,3 +9,128 @@ int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
>>>>    	printf("perf version %s\n", perf_version_string);
>>>>    	return 0;
>>>>    }
>>>> +
>>>> +static void status_print(const char *name, const char *status)
>>>> +{
>>>> +	printf("%22s: [ %3s ]\n", name, status);
>>>> +}
>>>> +
>>>> +static void library_status(void)
>>>> +{
>>>> +#ifdef HAVE_DWARF_SUPPORT
>>>> +	status_print("dwarf", "on");
>>>> +#else
>>>> +	status_print("dwarf", "off");
>>>> +#endif
>>>
>>> could this and all those below be in some generic macro?
>>>
>>> #define STATUS(__d, __m)		\
>>> #ifdef __d 				\
>>> 	status_print(#__m, "on");	\
>>> #else					\
>>> 	status_print(#__m, "OFF");	\
>>> #endif
>>>
>>> STATUS(HAVE_DWARF_SUPPORT, dwarf)
>>>
>>>
>>> also please print the 'OFF' and use colors as in the build message
>>>
>>
>> Fine, thanks. I will update the code.
>>
>>>> +
>>>> +#ifdef HAVE_DWARF_GETLOCATIONS
>>>> +	status_print("dwarf_getlocations", "on");
>>>> +#else
>>>> +	status_print("dwarf_getlocations", "off");
>>>> +#endif
>>>> +
>>>> +#ifdef NO_GLIBC
>>>> +	status_print("glibc", "off");
>>>> +#else
>>>> +	status_print("glibc", "on");
>>>> +#endif
>>>> +
>>>> +#ifdef HAVE_GTK2_SUPPORT
>>>> +	status_print("gtk2", "on");
>>>> +#else
>>>> +	status_print("gtk2", "off");
>>>> +#endif
>>>> +
>>>
>>> SNIP
>>>
>>>> +}
>>>> +
>>>> +int cmd_version2(int argc, const char **argv)
>>>> +{
>>>> +	cmd_version(argc, argv);
>>>> +	library_status();
>>>> +	return 0;
>>>> +}
>>>> diff --git a/tools/perf/builtin.h b/tools/perf/builtin.h
>>>> index 05745f3..c7508ee 100644
>>>> --- a/tools/perf/builtin.h
>>>> +++ b/tools/perf/builtin.h
>>>> @@ -29,6 +29,7 @@ int cmd_timechart(int argc, const char **argv);
>>>>    int cmd_top(int argc, const char **argv);
>>>>    int cmd_script(int argc, const char **argv);
>>>>    int cmd_version(int argc, const char **argv);
>>>> +int cmd_version2(int argc, const char **argv);
>>>
>>> please don't add new command for this, handle this in cmd_version
>>>
>>
>> Yeah, I know that, adding a new command is not a good idea.
>>
>> But how can I pass a new parameter to cmd_version to indicate it's the -vv
>> case? Use argv[1]? But looks not good since argc is 1.
>>
>> Any idea about that?
> 
> I guess the based would be to have 'perf version -v', where
> in cmd_version you'd call standard option processing..
> 
> the 'perf -vv' shortcut could for example be done through
> some global var like in attached patch... untested
> 
> jirka
> 
> 
> ---
> diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c
> index 37019c5d675f..1fe458792cc1 100644
> --- a/tools/perf/builtin-version.c
> +++ b/tools/perf/builtin-version.c
> @@ -4,6 +4,8 @@
>   #include <linux/compiler.h>
>   #include <stdio.h>
>   
> +int version_verbose;
> +
>   int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
>   {
>   	printf("perf version %s\n", perf_version_string);
> diff --git a/tools/perf/perf.c b/tools/perf/perf.c
> index 1b3fc8ec0fa2..a5c95c6c0de7 100644
> --- a/tools/perf/perf.c
> +++ b/tools/perf/perf.c
> @@ -185,7 +185,14 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
>   			break;
>   		}
>   
> -		if (!strcmp(cmd, "-v")) {
> +		if (strstarts(cmd, "-v")) {
> +			int i;
> +
> +			for (i = 2; cmd[i]; i++) {
> +				if (cmd[i] == 'v')
> +					version_verbose++;
> +			}
> +
>   			(*argv)[0] = "--version";
>   			break;
>   		}
> diff --git a/tools/perf/perf.h b/tools/perf/perf.h
> index 8fec1abd0f1f..9c45ba179635 100644
> --- a/tools/perf/perf.h
> +++ b/tools/perf/perf.h
> @@ -13,6 +13,8 @@ void test_attr__init(void);
>   void test_attr__open(struct perf_event_attr *attr, pid_t pid, int cpu,
>   		     int fd, int group_fd, unsigned long flags);
>   
> +extern int version_verbose;
> +
>   #define HAVE_ATTR_TEST
>   #include "perf-sys.h"
>   
> 

Using global variable, hmm, that's fine, looks no better way. :)

I will follow Ingo's suggestion. Use 'perf -v --build-options' and map 
it to 'perf -vv'.

Thanks
Jin Yao

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH v1 2/3] perf version: Print the status of compiled-in libraries
  2018-03-27 13:17         ` Jin, Yao
@ 2018-03-27 13:35           ` Jiri Olsa
  0 siblings, 0 replies; 20+ messages in thread
From: Jiri Olsa @ 2018-03-27 13:35 UTC (permalink / raw)
  To: Jin, Yao
  Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
	kan.liang, yao.jin

On Tue, Mar 27, 2018 at 09:17:57PM +0800, Jin, Yao wrote:

SNIP

> > +#define IS_BUILTIN(option) __is_defined(option)
> > +
> > +
> > +static void status_print(const char *name, const char *status)
> > +{
> > +	printf("%22s: [ %3s ]\n", name, status);
> > +}
> > +
> >   int cmd_version(int argc __maybe_unused, const char **argv __maybe_unused)
> >   {
> >   	printf("perf version %s\n", perf_version_string);
> > +
> > +#define STATUS(__d, __m)			\
> > +	if (IS_BUILTIN(__d))			\
> > +		status_print(#__m, "on");	\
> > +	else					\
> > +		status_print(#__m, "OFF");
> > +
> > +	STATUS(HAVE_DWARF_SUPPORT, dwarf)
> > +	STATUS(HAVE_KRAVA_SUPPORT, krava)
> >   	return 0;
> >   }
> > 
> 
> Hi Jiri,
> 
> It looks we need to copy the IS_BUILTIN and associated macro definitions to
> a common header file.
> 
> I guess you will post this patch if Arnaldo agree with this idea, right?
> 
> I plan to post v2 of this patch series after this 'IS_BUILTIN' patch gets
> merged.


please post patch below with your patchset
and feel free to change it if needed

thanks,
jirka


---
>From bdd36e208bde1576bba54679734174c9a2064822 Mon Sep 17 00:00:00 2001
From: Jiri Olsa <jolsa@kernel.org>
Date: Tue, 27 Mar 2018 15:30:26 +0200
Subject: [PATCH] tools include: Add config.h header file

Adding IS_BUILTIN macro and its dependencies into
tools world.

It's taken from kernel's include/linux/kconfig.h,
which can't be taken completely due to its kconfig
dependencies.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/include/tools/config.h | 34 ++++++++++++++++++++++++++++++++++
 1 file changed, 34 insertions(+)
 create mode 100644 tools/include/tools/config.h

diff --git a/tools/include/tools/config.h b/tools/include/tools/config.h
new file mode 100644
index 000000000000..08ade7df8132
--- /dev/null
+++ b/tools/include/tools/config.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _TOOLS_CONFIG_H
+#define _TOOLS_CONFIG_H
+
+/* Subset of include/linux/kconfig.h */
+
+#define __ARG_PLACEHOLDER_1 0,
+#define __take_second_arg(__ignored, val, ...) val
+
+/*
+ * Helper macros to use CONFIG_ options in C/CPP expressions. Note that
+ * these only work with boolean and tristate options.
+ */
+
+/*
+ * Getting something that works in C and CPP for an arg that may or may
+ * not be defined is tricky.  Here, if we have "#define CONFIG_BOOGER 1"
+ * we match on the placeholder define, insert the "0," for arg1 and generate
+ * the triplet (0, 1, 0).  Then the last step cherry picks the 2nd arg (a one).
+ * When CONFIG_BOOGER is not defined, we generate a (... 1, 0) pair, and when
+ * the last step cherry picks the 2nd arg, we get a zero.
+ */
+#define __is_defined(x)			___is_defined(x)
+#define ___is_defined(val)		____is_defined(__ARG_PLACEHOLDER_##val)
+#define ____is_defined(arg1_or_junk)	__take_second_arg(arg1_or_junk 1, 0)
+
+/*
+ * IS_BUILTIN(CONFIG_FOO) evaluates to 1 if CONFIG_FOO is set to 'y', 0
+ * otherwise. For boolean options, this is equivalent to
+ * IS_ENABLED(CONFIG_FOO).
+ */
+#define IS_BUILTIN(option) __is_defined(option)
+
+#endif /* _TOOLS_CONFIG_H */
-- 
2.13.6

^ permalink raw reply related	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2018-03-27 13:35 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-26 16:07 [PATCH v1 0/3] Support perf -vv Jin Yao
2018-03-26  9:00 ` Andi Kleen
2018-03-26  9:07   ` Jiri Olsa
2018-03-26 13:06     ` Jin, Yao
2018-03-26 16:07 ` [PATCH v1 1/3] perf config: Add -DNO_GLIBC to CFLAGS Jin Yao
2018-03-26 16:07 ` [PATCH v1 2/3] perf version: Print the status of compiled-in libraries Jin Yao
2018-03-26  9:39   ` Jiri Olsa
2018-03-26 13:51     ` Jin, Yao
2018-03-27  3:04       ` Jin, Yao
2018-03-27 12:38       ` Jiri Olsa
2018-03-27 13:26         ` Jin, Yao
2018-03-27  1:44     ` Jin, Yao
2018-03-27 12:56       ` Jiri Olsa
2018-03-27 13:17         ` Jin, Yao
2018-03-27 13:35           ` Jiri Olsa
2018-03-27  5:58   ` Ingo Molnar
2018-03-27  6:04     ` Jin, Yao
2018-03-26 16:07 ` [PATCH v1 3/3] perf: Support perf -vv Jin Yao
2018-03-27  6:03   ` Ingo Molnar
2018-03-27  6:12     ` Jin, Yao

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).