1 uname_M := $(shell uname -m 2>/dev/null || echo not)
3 ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
4 -e s/arm.*/arm/ -e s/sa110/arm/ \
5 -e s/s390x/s390/ -e s/parisc64/parisc/ \
6 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
7 -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )
9 CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
11 # Additional ARCH settings for x86
15 LIBUNWIND_LIBS = -lunwind -lunwind-x86
21 ifeq (, $(findstring m32,$(CFLAGS)))
22 IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1)
24 ifeq (${IS_X86_64}, 1)
26 CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
27 ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
28 LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
30 LIBUNWIND_LIBS = -lunwind -lunwind-x86
36 LIBUNWIND_LIBS = -lunwind -lunwind-arm
39 ifeq ($(LIBUNWIND_LIBS),)
43 # For linking with debug library, run like:
45 # make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
48 LIBUNWIND_CFLAGS = -I$(LIBUNWIND_DIR)/include
49 LIBUNWIND_LDFLAGS = -L$(LIBUNWIND_DIR)/lib
51 LIBUNWIND_LDFLAGS += $(LIBUNWIND_LIBS)
53 # Set per-feature check compilation flags
54 FEATURE_CHECK_CFLAGS-libunwind = $(LIBUNWIND_CFLAGS)
55 FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS)
56 FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS)
57 FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS)
58 # and the flags for the test-all case
59 FEATURE_CHECK_CFLAGS-all += $(LIBUNWIND_CFLAGS)
60 FEATURE_CHECK_LDFLAGS-all += $(LIBUNWIND_LDFLAGS)
63 ifeq ($(NO_PERF_REGS),0)
64 CFLAGS += -DHAVE_PERF_REGS_SUPPORT
68 src-perf := $(srctree)/tools/perf
76 obj-perf := $(abspath $(obj-perf))/
79 LIB_INCLUDE := $(srctree)/tools/lib/
81 # include ARCH specific config
82 -include $(src-perf)/arch/$(ARCH)/Makefile
84 include $(src-perf)/config/utilities.mak
86 ifeq ($(call get-executable,$(FLEX)),)
87 dummy := $(error Error: $(FLEX) is missing on this system, please install it)
90 ifeq ($(call get-executable,$(BISON)),)
91 dummy := $(error Error: $(BISON) is missing on this system, please install it)
94 # Treat warnings as errors unless directed not to
108 PARSER_DEBUG_BISON := -t
109 PARSER_DEBUG_FLEX := -d
110 CFLAGS += -DPARSER_DEBUG
113 CFLAGS += -fno-omit-frame-pointer
115 CFLAGS += -funwind-tables
120 EXTLIBS = -lelf -lpthread -lrt -lm -ldl
123 OUTPUT_FEATURES = $(OUTPUT)config/feature-checks/
124 $(shell mkdir -p $(OUTPUT_FEATURES))
127 feature_check = $(eval $(feature_check_code))
128 define feature_check_code
129 feature-$(1) := $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS) $(FEATURE_CHECK_CFLAGS-$(1))" LDFLAGS="$(LDFLAGS) $(FEATURE_CHECK_LDFLAGS-$(1))" -C config/feature-checks test-$1.bin >/dev/null 2>/dev/null && echo 1 || echo 0)
132 feature_set = $(eval $(feature_set_code))
133 define feature_set_code
138 # Build the feature check binaries in parallel, ignore errors, ignore return value and suppress output:
142 # Note that this is not a complete list of all feature tests, just
143 # those that are typically built on a fully configured system.
145 # [ Feature tests not mentioned here have to be built explicitly in
146 # the rule that uses them - an example for that is the 'bionic'
149 CORE_FEATURE_TESTS = \
172 # So here we detect whether test-all was rebuilt, to be able
173 # to skip the print-out of the long features list if the file
174 # existed before and after it was built:
176 ifeq ($(wildcard $(OUTPUT)config/feature-checks/test-all.bin),)
183 # Special fast-path for the 'all features are available' case:
185 $(call feature_check,all,$(MSG))
188 # Just in case the build freshly failed, make sure we print the
191 ifeq ($(feature-all), 0)
195 ifeq ($(test-all-failed),1)
197 $(info Auto-detecting system features:)
200 ifeq ($(feature-all), 1)
202 # test-all.c passed - just set all the core feature flags to 1:
204 $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_set,$(feat)))
206 $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS)" LDFLAGS=$(LDFLAGS) -i -j -C config/feature-checks $(addsuffix .bin,$(CORE_FEATURE_TESTS)) >/dev/null 2>&1)
207 $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_check,$(feat)))
211 # Print the result of the feature test:
213 feature_print = $(eval $(feature_print_code)) $(info $(MSG))
215 define feature_print_code
216 ifeq ($(feature-$(1)), 1)
217 MSG = $(shell printf '...%30s: [ \033[32mon\033[m ]' $(1))
219 MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(1))
224 # Only print out our features if we rebuilt the testcases or if a test failed:
226 ifeq ($(test-all-failed), 1)
227 $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_print,$(feat)))
231 ifeq ($(feature-stackprotector-all), 1)
232 CFLAGS += -fstack-protector-all
236 ifeq ($(feature-fortify-source), 1)
237 CFLAGS += -D_FORTIFY_SOURCE=2
241 CFLAGS += -I$(src-perf)/util/include
242 CFLAGS += -I$(src-perf)/arch/$(ARCH)/include
243 CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi
244 CFLAGS += -I$(srctree)/arch/$(ARCH)/include
245 CFLAGS += -I$(srctree)/include/uapi
246 CFLAGS += -I$(srctree)/include
248 # $(obj-perf) for generated common-cmds.h
249 # $(obj-perf)/util for generated bison/flex headers
251 CFLAGS += -I$(obj-perf)/util
252 CFLAGS += -I$(obj-perf)
255 CFLAGS += -I$(src-perf)/util
256 CFLAGS += -I$(src-perf)
257 CFLAGS += -I$(LIB_INCLUDE)
259 CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
262 $(call feature_check,bionic)
263 ifeq ($(feature-bionic), 1)
265 EXTLIBS := $(filter-out -lrt,$(EXTLIBS))
266 EXTLIBS := $(filter-out -lpthread,$(EXTLIBS))
275 ifeq ($(feature-libelf), 0)
276 ifeq ($(feature-glibc), 1)
282 ifeq ($(LIBC_SUPPORT),1)
283 msg := $(warning No libelf found, disables 'probe' tool, please install elfutils-libelf-devel/libelf-dev);
289 msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
292 # for linking with debug library, run like:
293 # make DEBUG=1 LIBDW_DIR=/opt/libdw/
295 LIBDW_CFLAGS := -I$(LIBDW_DIR)/include
296 LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib
299 ifneq ($(feature-dwarf), 1)
300 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);
302 endif # Dwarf support
303 endif # libelf support
307 CFLAGS += -DHAVE_LIBELF_SUPPORT
309 ifeq ($(feature-libelf-mmap), 1)
310 CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
313 ifeq ($(feature-libelf-getphdrnum), 1)
314 CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
317 # include ARCH specific config
318 -include $(src-perf)/arch/$(ARCH)/Makefile
321 ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
322 msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled);
325 CFLAGS += -DHAVE_DWARF_SUPPORT $(LIBDW_CFLAGS)
326 LDFLAGS += $(LIBDW_LDFLAGS)
327 EXTLIBS += -lelf -ldw
328 endif # PERF_HAVE_DWARF_REGS
333 ifneq ($(feature-libunwind), 1)
334 msg := $(warning No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 1.1);
338 $(call feature_check,libunwind-debug-frame)
339 ifneq ($(feature-libunwind-debug-frame), 1)
340 msg := $(warning No debug_frame support found in libunwind);
341 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
344 # non-ARM has no dwarf_find_debug_frame() function:
345 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
348 CFLAGS += -DHAVE_LIBUNWIND_SUPPORT
349 EXTLIBS += $(LIBUNWIND_LIBS)
350 CFLAGS += $(LIBUNWIND_CFLAGS)
351 LDFLAGS += $(LIBUNWIND_LDFLAGS)
352 endif # ifneq ($(feature-libunwind), 1)
356 ifneq ($(feature-libaudit), 1)
357 msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
360 CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
370 ifneq ($(feature-libslang), 1)
371 msg := $(warning slang not found, disables TUI support. Please install slang-devel or libslang-dev);
374 # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
375 CFLAGS += -I/usr/include/slang
376 CFLAGS += -DHAVE_SLANG_SUPPORT
382 FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
383 ifneq ($(feature-gtk2), 1)
384 msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
387 ifeq ($(feature-gtk2-infobar), 1)
388 GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
390 CFLAGS += -DHAVE_GTK2_SUPPORT
391 GTK_CFLAGS += $(shell pkg-config --cflags gtk+-2.0 2>/dev/null)
392 GTK_LIBS := $(shell pkg-config --libs gtk+-2.0 2>/dev/null)
397 grep-libs = $(filter -l%,$(1))
398 strip-libs = $(filter-out -l%,$(1))
401 CFLAGS += -DNO_LIBPERL
403 PERL_EMBED_LDOPTS = $(shell perl -MExtUtils::Embed -e ldopts 2>/dev/null)
404 PERL_EMBED_LDFLAGS = $(call strip-libs,$(PERL_EMBED_LDOPTS))
405 PERL_EMBED_LIBADD = $(call grep-libs,$(PERL_EMBED_LDOPTS))
406 PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null`
407 FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS)
409 ifneq ($(feature-libperl), 1)
410 CFLAGS += -DNO_LIBPERL
413 LDFLAGS += $(PERL_EMBED_LDFLAGS)
414 EXTLIBS += $(PERL_EMBED_LIBADD)
418 ifeq ($(feature-timerfd), 1)
419 CFLAGS += -DHAVE_TIMERFD_SUPPORT
421 msg := $(warning No timerfd support. Disables 'perf kvm stat live');
424 disable-python = $(eval $(disable-python_code))
425 define disable-python_code
426 CFLAGS += -DNO_LIBPYTHON
427 $(if $(1),$(warning No $(1) was found))
428 $(warning Python support will not be built)
433 $(call get-executable-or-default,PYTHON,python)
436 $(call disable-python,python interpreter)
439 PYTHON_WORD := $(call shell-wordify,$(PYTHON))
442 $(call disable-python)
445 override PYTHON_CONFIG := \
446 $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON)-config)
449 $(call disable-python,python-config tool)
452 PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG))
454 PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
455 PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
456 PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS))
457 PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
458 FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
460 ifneq ($(feature-libpython), 1)
461 $(call disable-python,Python.h (for Python 2.x))
464 ifneq ($(feature-libpython-version), 1)
465 $(warning Python 3 is not yet supported; please set)
466 $(warning PYTHON and/or PYTHON_CONFIG appropriately.)
467 $(warning If you also have Python 2 installed, then)
468 $(warning try something like:)
470 $(warning $(and ,) make PYTHON=python2)
472 $(warning Otherwise, disable Python support entirely:)
474 $(warning $(and ,) make NO_LIBPYTHON=1)
478 LDFLAGS += $(PYTHON_EMBED_LDFLAGS)
479 EXTLIBS += $(PYTHON_EMBED_LIBADD)
480 LANG_BINDINGS += $(obj-perf)python/perf.so
487 ifeq ($(feature-libbfd), 1)
492 CFLAGS += -DNO_DEMANGLE
494 ifdef HAVE_CPLUS_DEMANGLE_SUPPORT
496 CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
498 ifneq ($(feature-libbfd), 1)
499 $(call feature_check,liberty)
500 ifeq ($(feature-liberty), 1)
501 EXTLIBS += -lbfd -liberty
503 $(call feature_check,liberty-z)
504 ifeq ($(feature-liberty-z), 1)
505 EXTLIBS += -lbfd -liberty -lz
507 $(call feature_check,cplus-demangle)
508 ifeq ($(feature-cplus-demangle), 1)
510 CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
512 msg := $(warning No bfd.h/libbfd found, install binutils-dev[el]/zlib-static to gain symbol demangling)
513 CFLAGS += -DNO_DEMANGLE
521 ifneq ($(filter -lbfd,$(EXTLIBS)),)
522 CFLAGS += -DHAVE_LIBBFD_SUPPORT
526 ifeq ($(feature-on-exit), 1)
527 CFLAGS += -DHAVE_ON_EXIT_SUPPORT
532 ifeq ($(feature-backtrace), 1)
533 CFLAGS += -DHAVE_BACKTRACE_SUPPORT
538 ifeq ($(feature-libnuma), 0)
539 msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev);
542 CFLAGS += -DHAVE_LIBNUMA_SUPPORT
547 # Among the variables below, these:
553 # ETC_PERFCONFIG (but not sysconfdir)
554 # can be specified as a relative path some/where/else;
555 # this is interpreted as relative to $(prefix) and "perf" at
556 # runtime figures out where they are based on the path to the executable.
557 # This can help installing the suite in a relocatable way.
559 # Make the path relative to DESTDIR, not to prefix
563 bindir_relative = bin
564 bindir = $(prefix)/$(bindir_relative)
567 perfexecdir = libexec/perf-core
568 sharedir = $(prefix)/share
569 template_dir = share/perf-core/templates
570 htmldir = share/doc/perf-doc
571 ifeq ($(prefix),/usr)
573 ETC_PERFCONFIG = $(sysconfdir)/perfconfig
575 sysconfdir = $(prefix)/etc
576 ETC_PERFCONFIG = etc/perfconfig
578 ifeq ($(IS_X86_64),1)
583 libdir = $(prefix)/$(lib)
585 # Shell quote (do not use $(call) to accommodate ancient setups);
586 ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG))
587 DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
588 bindir_SQ = $(subst ','\'',$(bindir))
589 mandir_SQ = $(subst ','\'',$(mandir))
590 infodir_SQ = $(subst ','\'',$(infodir))
591 perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
592 template_dir_SQ = $(subst ','\'',$(template_dir))
593 htmldir_SQ = $(subst ','\'',$(htmldir))
594 prefix_SQ = $(subst ','\'',$(prefix))
595 sysconfdir_SQ = $(subst ','\'',$(sysconfdir))
596 libdir_SQ = $(subst ','\'',$(libdir))
598 ifneq ($(filter /%,$(firstword $(perfexecdir))),)
599 perfexec_instdir = $(perfexecdir)
601 perfexec_instdir = $(prefix)/$(perfexecdir)
603 perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
605 # If we install to $(HOME) we keep the traceevent default:
606 # $(HOME)/.traceevent/plugins
607 # Otherwise we install plugins into the global $(libdir).
609 plugindir=$(libdir)/traceevent/plugins
610 plugindir_SQ= $(subst ','\'',$(prefix)/$(plugindir))