diff options
-rw-r--r-- | tools/perf/Makefile | 109 | ||||
-rw-r--r-- | tools/perf/feature-tests.mak | 119 |
2 files changed, 175 insertions, 53 deletions
diff --git a/tools/perf/Makefile b/tools/perf/Makefile index 3d8f31ed771d..6aa2fe323db1 100644 --- a/tools/perf/Makefile +++ b/tools/perf/Makefile | |||
@@ -285,14 +285,10 @@ else | |||
285 | QUIET_STDERR = ">/dev/null 2>&1" | 285 | QUIET_STDERR = ">/dev/null 2>&1" |
286 | endif | 286 | endif |
287 | 287 | ||
288 | BITBUCKET = "/dev/null" | 288 | -include feature-tests.mak |
289 | 289 | ||
290 | ifneq ($(shell sh -c "(echo '\#include <stdio.h>'; echo 'int main(void) { return puts(\"hi\"); }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) "$(QUIET_STDERR)" && echo y"), y) | 290 | ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -fstack-protector-all),y) |
291 | BITBUCKET = .perf.dev.null | 291 | CFLAGS := $(CFLAGS) -fstack-protector-all |
292 | endif | ||
293 | |||
294 | ifeq ($(shell sh -c "echo 'int foo(void) {char X[2]; return 3;}' | $(CC) -x c -c -Werror -fstack-protector-all - -o $(BITBUCKET) "$(QUIET_STDERR)" && echo y"), y) | ||
295 | CFLAGS := $(CFLAGS) -fstack-protector-all | ||
296 | endif | 292 | endif |
297 | 293 | ||
298 | 294 | ||
@@ -508,7 +504,8 @@ PERFLIBS = $(LIB_FILE) | |||
508 | -include config.mak | 504 | -include config.mak |
509 | 505 | ||
510 | ifndef NO_DWARF | 506 | ifndef NO_DWARF |
511 | ifneq ($(shell sh -c "(echo '\#include <dwarf.h>'; echo '\#include <libdw.h>'; echo '\#include <version.h>'; echo '\#ifndef _ELFUTILS_PREREQ'; echo '\#error'; echo '\#endif'; echo 'int main(void) { Dwarf *dbg; dbg = dwarf_begin(0, DWARF_C_READ); return (long)dbg; }') | $(CC) -x c - $(ALL_CFLAGS) -I/usr/include/elfutils -ldw -lelf -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) "$(QUIET_STDERR)" && echo y"), y) | 507 | FLAGS_DWARF=$(ALL_CFLAGS) -I/usr/include/elfutils -ldw -lelf $(ALL_LDFLAGS) $(EXTLIBS) |
508 | ifneq ($(call try-cc,$(SOURCE_DWARF),$(FLAGS_DWARF)),y) | ||
512 | msg := $(warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev); | 509 | msg := $(warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev); |
513 | NO_DWARF := 1 | 510 | NO_DWARF := 1 |
514 | endif # Dwarf support | 511 | endif # Dwarf support |
@@ -536,16 +533,18 @@ ifneq ($(OUTPUT),) | |||
536 | BASIC_CFLAGS += -I$(OUTPUT) | 533 | BASIC_CFLAGS += -I$(OUTPUT) |
537 | endif | 534 | endif |
538 | 535 | ||
539 | ifeq ($(shell sh -c "(echo '\#include <libelf.h>'; echo 'int main(void) { Elf * elf = elf_begin(0, ELF_C_READ, 0); return (long)elf; }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) "$(QUIET_STDERR)" && echo y"), y) | 536 | FLAGS_LIBELF=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) |
540 | ifneq ($(shell sh -c "(echo '\#include <gnu/libc-version.h>'; echo 'int main(void) { const char * version = gnu_get_libc_version(); return (long)version; }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) "$(QUIET_STDERR)" && echo y"), y) | 537 | ifneq ($(call try-cc,$(SOURCE_LIBELF),$(FLAGS_LIBELF)),y) |
541 | msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static); | 538 | FLAGS_GLIBC=$(ALL_CFLAGS) $(ALL_LDFLAGS) |
539 | ifneq ($(call try-cc,$(SOURCE_GLIBC),$(FLAGS_GLIBC)),y) | ||
540 | msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static); | ||
541 | else | ||
542 | msg := $(error No libelf.h/libelf found, please install libelf-dev/elfutils-libelf-devel); | ||
543 | endif | ||
542 | endif | 544 | endif |
543 | 545 | ||
544 | ifneq ($(shell sh -c "(echo '\#include <libelf.h>'; echo 'int main(void) { Elf * elf = elf_begin(0, ELF_C_READ_MMAP, 0); return (long)elf; }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) "$(QUIET_STDERR)" && echo y"), y) | 546 | ifneq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_COMMON)),y) |
545 | BASIC_CFLAGS += -DLIBELF_NO_MMAP | 547 | BASIC_CFLAGS += -DLIBELF_NO_MMAP |
546 | endif | ||
547 | else | ||
548 | msg := $(error No libelf.h/libelf found, please install libelf-dev/elfutils-libelf-devel and glibc-dev[el]); | ||
549 | endif | 548 | endif |
550 | 549 | ||
551 | ifndef NO_DWARF | 550 | ifndef NO_DWARF |
@@ -561,41 +560,47 @@ endif # NO_DWARF | |||
561 | ifdef NO_NEWT | 560 | ifdef NO_NEWT |
562 | BASIC_CFLAGS += -DNO_NEWT_SUPPORT | 561 | BASIC_CFLAGS += -DNO_NEWT_SUPPORT |
563 | else | 562 | else |
564 | ifneq ($(shell sh -c "(echo '\#include <newt.h>'; echo 'int main(void) { newtInit(); newtCls(); return newtFinished(); }') | $(CC) -x c - $(ALL_CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -lnewt -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) "$(QUIET_STDERR)" && echo y"), y) | 563 | FLAGS_NEWT=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -lnewt |
565 | msg := $(warning newt not found, disables TUI support. Please install newt-devel or libnewt-dev); | 564 | ifneq ($(call try-cc,$(SOURCE_NEWT),$(FLAGS_NEWT)),y) |
566 | BASIC_CFLAGS += -DNO_NEWT_SUPPORT | 565 | msg := $(warning newt not found, disables TUI support. Please install newt-devel or libnewt-dev); |
567 | else | 566 | BASIC_CFLAGS += -DNO_NEWT_SUPPORT |
568 | # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h | 567 | else |
569 | BASIC_CFLAGS += -I/usr/include/slang | 568 | # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h |
570 | EXTLIBS += -lnewt -lslang | 569 | BASIC_CFLAGS += -I/usr/include/slang |
571 | LIB_OBJS += $(OUTPUT)util/newt.o | 570 | EXTLIBS += -lnewt -lslang |
572 | endif | 571 | LIB_OBJS += $(OUTPUT)util/newt.o |
573 | endif # NO_NEWT | 572 | endif |
574 | |||
575 | ifndef NO_LIBPERL | ||
576 | PERL_EMBED_LDOPTS = `perl -MExtUtils::Embed -e ldopts 2>/dev/null` | ||
577 | PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null` | ||
578 | endif | 573 | endif |
579 | 574 | ||
580 | ifneq ($(shell sh -c "(echo '\#include <EXTERN.h>'; echo '\#include <perl.h>'; echo 'int main(void) { perl_alloc(); return 0; }') | $(CC) -x c - $(PERL_EMBED_CCOPTS) -o $(BITBUCKET) $(PERL_EMBED_LDOPTS) > /dev/null 2>&1 && echo y"), y) | 575 | ifdef NO_LIBPERL |
581 | BASIC_CFLAGS += -DNO_LIBPERL | 576 | BASIC_CFLAGS += -DNO_LIBPERL |
582 | else | 577 | else |
583 | ALL_LDFLAGS += $(PERL_EMBED_LDOPTS) | 578 | PERL_EMBED_LDOPTS = `perl -MExtUtils::Embed -e ldopts 2>/dev/null` |
584 | LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-perl.o | 579 | PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null` |
585 | LIB_OBJS += $(OUTPUT)scripts/perl/Perf-Trace-Util/Context.o | 580 | PERL_EMBED_FLAGS=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS) |
586 | endif | ||
587 | 581 | ||
588 | ifndef NO_LIBPYTHON | 582 | ifneq ($(call try-cc,$(SOURCE_PERL_EMBED),$(FLAGS_PERL_EMBED)),y) |
589 | PYTHON_EMBED_LDOPTS = `python-config --ldflags 2>/dev/null` | 583 | BASIC_CFLAGS += -DNO_LIBPERL |
590 | PYTHON_EMBED_CCOPTS = `python-config --cflags 2>/dev/null` | 584 | else |
585 | ALL_LDFLAGS += $(PERL_EMBED_LDOPTS) | ||
586 | LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-perl.o | ||
587 | LIB_OBJS += $(OUTPUT)scripts/perl/Perf-Trace-Util/Context.o | ||
588 | endif | ||
591 | endif | 589 | endif |
592 | 590 | ||
593 | ifneq ($(shell sh -c "(echo '\#include <Python.h>'; echo 'int main(void) { Py_Initialize(); return 0; }') | $(CC) -x c - $(PYTHON_EMBED_CCOPTS) -o $(BITBUCKET) $(PYTHON_EMBED_LDOPTS) > /dev/null 2>&1 && echo y"), y) | 591 | ifdef NO_LIBPYTHON |
594 | BASIC_CFLAGS += -DNO_LIBPYTHON | 592 | BASIC_CFLAGS += -DNO_LIBPYTHON |
595 | else | 593 | else |
596 | ALL_LDFLAGS += $(PYTHON_EMBED_LDOPTS) | 594 | PYTHON_EMBED_LDOPTS = `python-config --ldflags 2>/dev/null` |
597 | LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-python.o | 595 | PYTHON_EMBED_CCOPTS = `python-config --cflags 2>/dev/null` |
598 | LIB_OBJS += $(OUTPUT)scripts/python/Perf-Trace-Util/Context.o | 596 | FLAGS_PYTHON_EMBED=$(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS) |
597 | ifneq ($(call try-cc,$(SOURCE_PYTHON_EMBED),$(FLAGS_PYTHON_EMBED)),y) | ||
598 | BASIC_CFLAGS += -DNO_LIBPYTHON | ||
599 | else | ||
600 | ALL_LDFLAGS += $(PYTHON_EMBED_LDOPTS) | ||
601 | LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-python.o | ||
602 | LIB_OBJS += $(OUTPUT)scripts/python/Perf-Trace-Util/Context.o | ||
603 | endif | ||
599 | endif | 604 | endif |
600 | 605 | ||
601 | ifdef NO_DEMANGLE | 606 | ifdef NO_DEMANGLE |
@@ -604,20 +609,23 @@ else ifdef HAVE_CPLUS_DEMANGLE | |||
604 | EXTLIBS += -liberty | 609 | EXTLIBS += -liberty |
605 | BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE | 610 | BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE |
606 | else | 611 | else |
607 | has_bfd := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) -lbfd "$(QUIET_STDERR)" && echo y") | 612 | FLAGS_BFD=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -lbfd |
608 | 613 | has_bfd := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD)) | |
609 | ifeq ($(has_bfd),y) | 614 | ifeq ($(has_bfd),y) |
610 | EXTLIBS += -lbfd | 615 | EXTLIBS += -lbfd |
611 | else | 616 | else |
612 | has_bfd_iberty := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) -lbfd -liberty "$(QUIET_STDERR)" && echo y") | 617 | FLAGS_BFD_IBERTY=$(FLAGS_BFD) -liberty |
618 | has_bfd_iberty := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY)) | ||
613 | ifeq ($(has_bfd_iberty),y) | 619 | ifeq ($(has_bfd_iberty),y) |
614 | EXTLIBS += -lbfd -liberty | 620 | EXTLIBS += -lbfd -liberty |
615 | else | 621 | else |
616 | has_bfd_iberty_z := $(shell sh -c "(echo '\#include <bfd.h>'; echo 'int main(void) { bfd_demangle(0, 0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) -lbfd -liberty -lz "$(QUIET_STDERR)" && echo y") | 622 | FLAGS_BFD_IBERTY_Z=$(FLAGS_BFD_IBERTY) -lz |
623 | has_bfd_iberty_z := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY_Z)) | ||
617 | ifeq ($(has_bfd_iberty_z),y) | 624 | ifeq ($(has_bfd_iberty_z),y) |
618 | EXTLIBS += -lbfd -liberty -lz | 625 | EXTLIBS += -lbfd -liberty -lz |
619 | else | 626 | else |
620 | has_cplus_demangle := $(shell sh -c "(echo 'extern char *cplus_demangle(const char *, int);'; echo 'int main(void) { cplus_demangle(0, 0); return 0; }') | $(CC) -x c - $(ALL_CFLAGS) -o $(BITBUCKET) $(ALL_LDFLAGS) $(EXTLIBS) -liberty "$(QUIET_STDERR)" && echo y") | 627 | FLAGS_CPLUS_DEMANGLE=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -liberty |
628 | has_cplus_demangle := $(call try-cc,$(SOURCE_CPLUS_DEMANGLE),$(FLAGS_CPLUS_DEMANGLE)) | ||
621 | ifeq ($(has_cplus_demangle),y) | 629 | ifeq ($(has_cplus_demangle),y) |
622 | EXTLIBS += -liberty | 630 | EXTLIBS += -liberty |
623 | BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE | 631 | BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE |
@@ -865,7 +873,7 @@ export TAR INSTALL DESTDIR SHELL_PATH | |||
865 | 873 | ||
866 | SHELL = $(SHELL_PATH) | 874 | SHELL = $(SHELL_PATH) |
867 | 875 | ||
868 | all:: .perf.dev.null shell_compatibility_test $(ALL_PROGRAMS) $(BUILT_INS) $(OTHER_PROGRAMS) $(OUTPUT)PERF-BUILD-OPTIONS | 876 | all:: shell_compatibility_test $(ALL_PROGRAMS) $(BUILT_INS) $(OTHER_PROGRAMS) $(OUTPUT)PERF-BUILD-OPTIONS |
869 | ifneq (,$X) | 877 | ifneq (,$X) |
870 | $(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) perf$X)), test '$p' -ef '$p$X' || $(RM) '$p';) | 878 | $(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) perf$X)), test '$p' -ef '$p$X' || $(RM) '$p';) |
871 | endif | 879 | endif |
@@ -1195,11 +1203,6 @@ clean: | |||
1195 | .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope .FORCE-PERF-CFLAGS | 1203 | .PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope .FORCE-PERF-CFLAGS |
1196 | .PHONY: .FORCE-PERF-BUILD-OPTIONS | 1204 | .PHONY: .FORCE-PERF-BUILD-OPTIONS |
1197 | 1205 | ||
1198 | .perf.dev.null: | ||
1199 | touch .perf.dev.null | ||
1200 | |||
1201 | .INTERMEDIATE: .perf.dev.null | ||
1202 | |||
1203 | ### Make sure built-ins do not have dups and listed in perf.c | 1206 | ### Make sure built-ins do not have dups and listed in perf.c |
1204 | # | 1207 | # |
1205 | check-builtins:: | 1208 | check-builtins:: |
diff --git a/tools/perf/feature-tests.mak b/tools/perf/feature-tests.mak new file mode 100644 index 000000000000..ddb68e601f0e --- /dev/null +++ b/tools/perf/feature-tests.mak | |||
@@ -0,0 +1,119 @@ | |||
1 | define SOURCE_HELLO | ||
2 | #include <stdio.h> | ||
3 | int main(void) | ||
4 | { | ||
5 | return puts(\"hi\"); | ||
6 | } | ||
7 | endef | ||
8 | |||
9 | ifndef NO_DWARF | ||
10 | define SOURCE_DWARF | ||
11 | #include <dwarf.h> | ||
12 | #include <libdw.h> | ||
13 | #include <version.h> | ||
14 | #ifndef _ELFUTILS_PREREQ | ||
15 | #error | ||
16 | #endif | ||
17 | |||
18 | int main(void) | ||
19 | { | ||
20 | Dwarf *dbg = dwarf_begin(0, DWARF_C_READ); | ||
21 | return (long)dbg; | ||
22 | } | ||
23 | endef | ||
24 | endif | ||
25 | |||
26 | define SOURCE_LIBELF | ||
27 | #include <libelf.h> | ||
28 | |||
29 | int main(void) | ||
30 | { | ||
31 | Elf *elf = elf_begin(0, ELF_C_READ, 0); | ||
32 | return (long)elf; | ||
33 | } | ||
34 | endef | ||
35 | |||
36 | define SOURCE_GLIBC | ||
37 | #include <gnu/libc-version.h> | ||
38 | |||
39 | int main(void) | ||
40 | { | ||
41 | const char *version = gnu_get_libc_version(); | ||
42 | return (long)version; | ||
43 | } | ||
44 | endef | ||
45 | |||
46 | define SOURCE_ELF_MMAP | ||
47 | #include <libelf.h> | ||
48 | int main(void) | ||
49 | { | ||
50 | Elf *elf = elf_begin(0, ELF_C_READ_MMAP, 0); | ||
51 | return (long)elf; | ||
52 | } | ||
53 | endef | ||
54 | |||
55 | ifndef NO_NEWT | ||
56 | define SOURCE_NEWT | ||
57 | #include <newt.h> | ||
58 | |||
59 | int main(void) | ||
60 | { | ||
61 | newtInit(); | ||
62 | newtCls(); | ||
63 | return newtFinished(); | ||
64 | } | ||
65 | endef | ||
66 | endif | ||
67 | |||
68 | ifndef NO_LIBPERL | ||
69 | define SOURCE_PERL_EMBED | ||
70 | #include <EXTERN.h> | ||
71 | #include <perl.h> | ||
72 | |||
73 | int main(void) | ||
74 | { | ||
75 | perl_alloc(); | ||
76 | return 0; | ||
77 | } | ||
78 | endef | ||
79 | endif | ||
80 | |||
81 | ifndef NO_LIBPYTHON | ||
82 | define SOURCE_PYTHON_EMBED | ||
83 | #include <Python.h> | ||
84 | |||
85 | int main(void) | ||
86 | { | ||
87 | Py_Initialize(); | ||
88 | return 0; | ||
89 | } | ||
90 | endef | ||
91 | endif | ||
92 | |||
93 | define SOURCE_BFD | ||
94 | #include <bfd.h> | ||
95 | |||
96 | int main(void) | ||
97 | { | ||
98 | bfd_demangle(0, 0, 0); | ||
99 | return 0; | ||
100 | } | ||
101 | endef | ||
102 | |||
103 | define SOURCE_CPLUS_DEMANGLE | ||
104 | extern char *cplus_demangle(const char *, int); | ||
105 | |||
106 | int main(void) | ||
107 | { | ||
108 | cplus_demangle(0, 0); | ||
109 | return 0; | ||
110 | } | ||
111 | endef | ||
112 | |||
113 | # try-cc | ||
114 | # Usage: option = $(call try-cc, source-to-build, cc-options) | ||
115 | try-cc = $(shell sh -c \ | ||
116 | 'TMP="$(TMPOUT).$$$$"; \ | ||
117 | echo "$(1)" | \ | ||
118 | $(CC) -x c - $(2) -o "$$TMP" > /dev/null 2>&1 && echo y; \ | ||
119 | rm -f "$$TMP"') | ||