2013-10-02 11:49:08 +02:00
i n c l u d e . . / s c r i p t s / M a k e f i l e . i n c l u d e
# The default target of this Makefile is...
all :
i n c l u d e c o n f i g / u t i l i t i e s . m a k
# Define V to have a more verbose compile.
#
2014-02-19 16:52:54 +01:00
# Define VF to have a more verbose feature check output.
#
2013-10-02 11:49:08 +02:00
# Define O to save output files in a separate directory.
#
# Define ARCH as name of target architecture if you want cross-builds.
#
# Define CROSS_COMPILE as prefix name of compiler if you want cross-builds.
#
# Define NO_LIBPERL to disable perl script extension.
#
# Define NO_LIBPYTHON to disable python script extension.
#
# Define PYTHON to point to the python binary if the default
# `python' is not correct; for example: PYTHON=python2
#
# Define PYTHON_CONFIG to point to the python-config binary if
# the default `$(PYTHON)-config' is not correct.
#
# Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
#
# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
#
# Define LDFLAGS=-static to build a static binary.
#
# Define EXTRA_CFLAGS=-m64 or EXTRA_CFLAGS=-m32 as appropriate for cross-builds.
#
# Define NO_DWARF if you do not want debug-info analysis feature at all.
#
# Define WERROR=0 to disable treating any warnings as errors.
#
# Define NO_NEWT if you do not want TUI support. (deprecated)
#
# Define NO_SLANG if you do not want TUI support.
#
# Define NO_GTK2 if you do not want GTK+ GUI support.
#
# Define NO_DEMANGLE if you do not want C++ symbol demangling.
#
# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
#
# Define NO_LIBUNWIND if you do not want libunwind dependency for dwarf
# backtrace post unwind.
#
# Define NO_BACKTRACE if you do not want stack backtrace debug feature
#
# Define NO_LIBNUMA if you do not want numa perf benchmark
#
# Define NO_LIBAUDIT if you do not want libaudit support
#
# Define NO_LIBBIONIC if you do not want bionic support
2014-02-19 16:52:57 +01:00
#
# Define NO_LIBDW_DWARF_UNWIND if you do not want libdw support
# for dwarf backtrace post unwind.
2014-10-23 18:16:03 -03:00
#
# Define NO_PERF_READ_VDSO32 if you do not want to build perf-read-vdso32
# for reading the 32-bit compatibility VDSO in 64-bit mode
#
# Define NO_PERF_READ_VDSOX32 if you do not want to build perf-read-vdsox32
# for reading the x32 mode 32-bit compatibility VDSO in 64-bit mode
perf tools: Add gzip decompression support for kernel module
Now my Archlinux box shows module symbols correctly.
Before:
$ perf report --stdio
Failed to open /tmp/perf-3477.map, continuing without symbols
no symbols found in /usr/bin/date, maybe install a debug package?
No kallsyms or vmlinux with build-id 7b4ea0a49ae2111925857099aaf05c3246ff33e0 was found
[drm] with build id 7b4ea0a49ae2111925857099aaf05c3246ff33e0 not found, continuing without symbols
No kallsyms or vmlinux with build-id edd931629094b660ca9dec09a1b635c8d87aa2ee was found
[jbd2] with build id edd931629094b660ca9dec09a1b635c8d87aa2ee not found, continuing without symbols
No kallsyms or vmlinux with build-id a7b1eada671c34933e5610bb920b2ca4945a82c3 was found
[ext4] with build id a7b1eada671c34933e5610bb920b2ca4945a82c3 not found, continuing without symbols
No kallsyms or vmlinux with build-id d69511fa3e5840e770336ef45b06c83fef8d74e3 was found
[scsi_mod] with build id d69511fa3e5840e770336ef45b06c83fef8d74e3 not found, continuing without symbols
No kallsyms or vmlinux with build-id af0430af13461af058770ee9b87afc07922c2e77 was found
[libata] with build id af0430af13461af058770ee9b87afc07922c2e77 not found, continuing without symbols
No kallsyms or vmlinux with build-id aaeedff8160ce631a5f0333591c6ff291201d29f was found
[libahci] with build id aaeedff8160ce631a5f0333591c6ff291201d29f not found, continuing without symbols
No kallsyms or vmlinux with build-id c57907712becaf662dc4981824bb372c0441d605 was found
[mac80211] with build id c57907712becaf662dc4981824bb372c0441d605 not found, continuing without symbols
No kallsyms or vmlinux with build-id e0589077cc0ec8c3e4c40eb9f2d9e69d236bee8f was found
[iwldvm] with build id e0589077cc0ec8c3e4c40eb9f2d9e69d236bee8f not found, continuing without symbols
No kallsyms or vmlinux with build-id 2d86086bf136bf374a2f029cf85a48194f9b950b was found
[cfg80211] with build id 2d86086bf136bf374a2f029cf85a48194f9b950b not found, continuing without symbols
No kallsyms or vmlinux with build-id 4493c48599bdb3d91d0f8db5150e0be33fdd9221 was found
[iwlwifi] with build id 4493c48599bdb3d91d0f8db5150e0be33fdd9221 not found, continuing without symbols
...
#
# Overhead Command Shared Object Symbol
# ........ ............... ....................... ........................................................
#
0.03% swapper [ext4] [k] 0x000000000000fe2e
0.03% swapper [kernel.kallsyms] [k] account_entity_enqueue
0.03% swapper [ext4] [k] 0x000000000000fc2b
0.03% irq/50-iwlwifi [iwlwifi] [k] 0x000000000000200b
0.03% swapper [kernel.kallsyms] [k] ktime_add_safe
0.03% swapper [kernel.kallsyms] [k] elv_completed_request
0.03% swapper [libata] [k] 0x0000000000003997
0.03% swapper [libahci] [k] 0x0000000000001f25
0.03% swapper [kernel.kallsyms] [k] rb_next
0.03% swapper [kernel.kallsyms] [k] blk_finish_request
0.03% swapper [ext4] [k] 0x0000000000010248
0.00% perf [kernel.kallsyms] [k] native_write_msr_safe
After:
$ perf report --stdio
Failed to open /tmp/perf-3477.map, continuing without symbols
no symbols found in /usr/bin/tr, maybe install a debug package?
...
#
# Overhead Command Shared Object Symbol
# ........ ............... ........................... ......................................................
#
0.04% kworker/u16:3 [ext4] [k] ext4_read_block_bitmap
0.03% kworker/u16:0 [mac80211] [k] ieee80211_sta_reset_beacon_monitor
0.02% irq/50-iwlwifi [mac80211] [k] ieee80211_get_bssid
0.02% firefox [e1000e] [k] __ew32_prepare
0.02% swapper [libahci] [k] ahci_handle_port_interrupt
0.02% emacs libglib-2.0.so.0.4000.0 [.] g_mutex_unlock
0.02% swapper [e1000e] [k] e1000_clean_tx_irq
0.02% dwm [kernel.kallsyms] [k] __schedule
0.02% gnome-terminal- [vdso] [.] __vdso_clock_gettime
0.02% swapper [e1000e] [k] e1000_alloc_rx_buffers
0.02% irq/50-iwlwifi [mac80211] [k] ieee80211_rx
0.01% firefox [vdso] [.] __vdso_gettimeofday
0.01% irq/50-iwlwifi [iwlwifi] [k] iwl_pcie_rxq_restock.part.13
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/87h9yexshi.fsf@sejong.aot.lge.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2014-10-31 16:51:38 +09:00
#
# Define NO_ZLIB if you do not want to support compressed kernel modules
2015-02-20 23:16:58 +01:00
#
2015-03-28 11:30:30 +01:00
# Define LIBBABELTRACE if you DO want libbabeltrace support
2015-02-20 23:16:58 +01:00
# for CTF data format.
2015-01-29 13:29:39 +01:00
#
# Define NO_LZMA if you do not want to support compressed (xz) kernel modules
2015-04-30 17:37:27 +03:00
#
# Define NO_AUXTRACE if you do not want AUX area tracing support
2014-02-19 16:52:57 +01:00
2015-08-13 10:14:55 +03:00
# As per kernel Makefile, avoid funny character set dependencies
u n export LC_ALL
LC_COLLATE = C
LC_NUMERIC = C
export LC_COLLATE LC_NUMERIC
2013-10-02 11:49:08 +02:00
i f e q ( $( srctree ) , )
srctree := $( patsubst %/,%,$( dir $( shell pwd ) ) )
srctree := $( patsubst %/,%,$( dir $( srctree) ) )
#$(info Determined 'srctree' to be $(srctree))
e n d i f
i f n e q ( $( objtree ) , )
#$(info Determined 'objtree' to be $(objtree))
e n d i f
i f n e q ( $( OUTPUT ) , )
#$(info Determined 'OUTPUT' to be $(OUTPUT))
2014-12-29 17:42:46 +01:00
# Adding $(OUTPUT) as a directory to look for source files,
# because use generated output files as sources dependency
# for flex/bison parsers.
VPATH += $( OUTPUT)
export VPATH
2013-10-02 11:49:08 +02:00
e n d i f
2015-01-11 23:59:55 +01:00
i f e q ( $( V ) , 1 )
Q =
e l s e
Q = @
e n d i f
2015-01-10 21:43:32 +01:00
# Do not use make's built-in rules
# (this improves performance and avoids hard-to-debug behaviour);
MAKEFLAGS += -r
2013-10-02 11:49:08 +02:00
$(OUTPUT)PERF-VERSION-FILE : ../../.git /HEAD
2015-01-11 23:59:55 +01:00
$( Q) $( SHELL_PATH) util/PERF-VERSION-GEN $( OUTPUT)
$( Q) touch $( OUTPUT) PERF-VERSION-FILE
2013-10-02 11:49:08 +02:00
2015-07-14 12:05:20 +03:00
# Makefiles suck: This macro sets a default value of $(2) for the
# variable named by $(1), unless the variable has been set by
# environment or command line. This is necessary for CC and AR
# because make sets default values, so the simpler ?= approach
# won't work as expected.
d e f i n e a l l o w - o v e r r i d e
$( if $( or $( findstring environment,$( origin $( 1) ) ) ,\
$( findstring command line,$( origin $( 1) ) ) ) ,,\
$( eval $( 1) = $( 2) ) )
e n d e f
# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix.
$( call allow -override ,CC ,$ ( CROSS_COMPILE ) gcc )
$( call allow -override ,AR ,$ ( CROSS_COMPILE ) ar )
$( call allow -override ,LD ,$ ( CROSS_COMPILE ) ld )
2014-01-15 10:44:08 +00:00
PKG_CONFIG = $( CROSS_COMPILE) pkg-config
2013-10-02 11:49:08 +02:00
RM = rm -f
perf trace: Add 'trace' alias to 'perf trace'
Make 'perf trace' more accessible by aliasing it to just 'trace':
[root@zoo linux]# trace --duration 15 -a -e futex sleep 1
110.092 (16.188 ms): libvirtd/1166 futex(uaddr: 0x185b344, op: WAIT|PRIV, val: 174293 ) = 0
110.101 (15.903 ms): libvirtd/1171 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139265 ) = 0
111.594 (15.776 ms): libvirtd/1165 futex(uaddr: 0x185b344, op: WAIT|PRIV, val: 174295 ) = 0
111.610 (15.969 ms): libvirtd/1169 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139267 ) = 0
113.556 (16.216 ms): libvirtd/1168 futex(uaddr: 0x185b3dc, op: WAIT|PRIV, val: 139269 ) = 0
291.265 (199.508 ms): chromium-brows/15830 futex(uaddr: 0x7fff2986bcb4, op: WAIT_BITSET|PRIV|CLKRT, val: 1, utime: 0x7fff2986bab0, val3: 4294967295) = -1 ETIMEDOUT Connection timed out
360.354 (69.053 ms): chromium-brows/15830 futex(uaddr: 0x7fff2986bcb4, op: WAIT_BITSET|PRIV|CLKRT, val: 1, utime: 0x7fff2986bab0, val3: 4294967295) = -1 ETIMEDOUT Connection timed out
[root@zoo linux]#
I.e. looking for futex calls that take at least 15ms, system wide, during a one
second window. Now to get callchains into 'trace' to figure out what are those
locks :-)
Requested-by: Ingo Molnar <mingo@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-ch4smqz8b5fmgrte7c5e4fuw@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2013-09-24 11:56:36 -03:00
LN = ln -f
2013-10-02 11:49:08 +02:00
MKDIR = mkdir
FIND = find
INSTALL = install
FLEX = flex
BISON = bison
STRIP = strip
2015-08-13 10:14:55 +03:00
AWK = awk
2013-10-02 11:49:08 +02:00
2013-12-09 17:14:23 +01:00
LIB_DIR = $( srctree) /tools/lib/api/
2013-10-02 11:49:08 +02:00
TRACE_EVENT_DIR = $( srctree) /tools/lib/traceevent/
# include config/Makefile by default and rule out
# non-config cases
config := 1
NON_CONFIG_TARGETS := clean TAGS tags cscope help
i f d e f M A K E C M D G O A L S
i f e q ( $( filter -out $ ( NON_CONFIG_TARGETS ) ,$ ( MAKECMDGOALS ) ) , )
config := 0
e n d i f
e n d i f
i f e q ( $( config ) , 1 )
i n c l u d e c o n f i g / M a k e f i l e
e n d i f
2013-12-03 14:09:21 +01:00
export prefix bindir sharedir sysconfdir DESTDIR
2013-10-02 11:49:08 +02:00
# sparse is architecture-neutral, which means that we need to tell it
# explicitly what architecture to check for. Fix this up for yours..
SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
# Guard against environment variables
PYRF_OBJS =
SCRIPT_SH =
SCRIPT_SH += perf-archive.sh
2014-07-31 09:01:12 +03:00
SCRIPT_SH += perf-with-kcore.sh
2013-10-02 11:49:08 +02:00
grep-libs = $( filter -l%,$( 1) )
strip-libs = $( filter-out -l%,$( 1) )
i f n e q ( $( OUTPUT ) , )
TE_PATH = $( OUTPUT)
i f n e q ( $( subdir ) , )
2013-12-09 17:14:23 +01:00
LIB_PATH = $( OUTPUT) /../lib/api/
2013-10-02 11:49:08 +02:00
e l s e
2013-12-09 17:14:23 +01:00
LIB_PATH = $( OUTPUT)
2013-10-02 11:49:08 +02:00
e n d i f
e l s e
TE_PATH = $( TRACE_EVENT_DIR)
2013-12-09 17:14:23 +01:00
LIB_PATH = $( LIB_DIR)
2013-10-02 11:49:08 +02:00
e n d i f
LIBTRACEEVENT = $( TE_PATH) libtraceevent.a
export LIBTRACEEVENT
2015-05-28 13:28:54 +00:00
LIBTRACEEVENT_DYNAMIC_LIST = $( TE_PATH) libtraceevent-dynamic-list
2015-06-17 14:46:29 +00:00
LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list= $( LIBTRACEEVENT_DYNAMIC_LIST)
2015-05-28 13:28:54 +00:00
2015-01-10 20:53:13 +01:00
LIBAPI = $( LIB_PATH) libapi.a
export LIBAPI
2013-10-02 11:49:08 +02:00
# python extension build directories
PYTHON_EXTBUILD := $( OUTPUT) python_ext_build/
PYTHON_EXTBUILD_LIB := $( PYTHON_EXTBUILD) lib/
PYTHON_EXTBUILD_TMP := $( PYTHON_EXTBUILD) tmp/
export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
2013-10-09 11:49:26 +02:00
python-clean := $( call QUIET_CLEAN, python) $( RM) -r $( PYTHON_EXTBUILD) $( OUTPUT) python/perf.so
2013-10-02 11:49:08 +02:00
PYTHON_EXT_SRCS := $( shell grep -v ^\# util/python-ext-sources)
2015-01-10 20:53:13 +01:00
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $( LIBTRACEEVENT) $( LIBAPI)
2013-10-02 11:49:08 +02:00
2015-06-12 03:17:11 +00:00
$(OUTPUT)python/perf.so : $( PYTHON_EXT_SRCS ) $( PYTHON_EXT_DEPS ) $( LIBTRACEEVENT_DYNAMIC_LIST )
2015-06-17 14:46:29 +00:00
$( QUIET_GEN) CFLAGS = '$(CFLAGS)' LDFLAGS = '$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
$( PYTHON_WORD) util/setup.py \
2013-10-02 11:49:08 +02:00
--quiet build_ext; \
mkdir -p $( OUTPUT) python && \
cp $( PYTHON_EXTBUILD_LIB) perf.so $( OUTPUT) python/
#
# No Perl scripts right now:
#
SCRIPTS = $( patsubst %.sh,%,$( SCRIPT_SH) )
PROGRAMS += $( OUTPUT) perf
2014-10-23 18:16:03 -03:00
i f n d e f N O _ P E R F _ R E A D _ V D S O 3 2
PROGRAMS += $( OUTPUT) perf-read-vdso32
e n d i f
i f n d e f N O _ P E R F _ R E A D _ V D S O X 3 2
PROGRAMS += $( OUTPUT) perf-read-vdsox32
e n d i f
2013-10-02 11:49:08 +02:00
# what 'all' will build and 'install' will install, in perfexecdir
ALL_PROGRAMS = $( PROGRAMS) $( SCRIPTS)
# what 'all' will build but not install in perfexecdir
OTHER_PROGRAMS = $( OUTPUT) perf
# Set paths to tools early so that they can be used for version tests.
i f n d e f S H E L L _ P A T H
SHELL_PATH = /bin/sh
e n d i f
i f n d e f P E R L _ P A T H
PERL_PATH = /usr/bin/perl
e n d i f
export PERL_PATH
LIB_FILE = $( OUTPUT) libperf.a
2015-01-10 20:53:13 +01:00
PERFLIBS = $( LIB_FILE) $( LIBAPI) $( LIBTRACEEVENT)
2013-10-02 11:49:08 +02:00
# We choose to avoid "if .. else if .. else .. endif endif"
# because maintaining the nesting to match is a pain. If
# we had "elif" things would have been much nicer...
- i n c l u d e a r c h / $( ARCH ) / M a k e f i l e
i f n e q ( $( OUTPUT ) , )
CFLAGS += -I$( OUTPUT)
e n d i f
i f n d e f N O _ G T K 2
2013-09-13 15:27:43 +09:00
ALL_PROGRAMS += $( OUTPUT) libperf-gtk.so
2014-12-30 00:34:23 +01:00
GTK_IN := $( OUTPUT) gtk-in.o
2013-09-13 15:27:43 +09:00
install-gtk : $( OUTPUT ) libperf -gtk .so
2013-10-09 11:49:29 +02:00
$( call QUIET_INSTALL, 'GTK UI' ) \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)' ; \
$( INSTALL) $( OUTPUT) libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)'
2013-10-02 11:49:08 +02:00
e n d i f
i f d e f A S C I I D O C 8
export ASCIIDOC8
e n d i f
LIBS = -Wl,--whole-archive $( PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $( EXTLIBS) -Wl,--end-group
export INSTALL SHELL_PATH
### Build rules
SHELL = $( SHELL_PATH)
all : shell_compatibility_test $( ALL_PROGRAMS ) $( LANG_BINDINGS ) $( OTHER_PROGRAMS )
please_set_SHELL_PATH_to_a_more_modern_shell :
2015-01-11 23:59:55 +01:00
$( Q) $$ ( :)
2013-10-02 11:49:08 +02:00
shell_compatibility_test : please_set_SHELL_PATH_to_a_more_modern_shell
strip : $( PROGRAMS ) $( OUTPUT ) perf
$( STRIP) $( STRIP_OPTS) $( PROGRAMS) $( OUTPUT) perf
2014-12-29 13:52:36 +01:00
PERF_IN := $( OUTPUT) perf-in.o
2015-08-13 10:14:55 +03:00
export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX AWK
2015-09-23 12:33:56 +02:00
i n c l u d e $( srctree ) / t o o l s / b u i l d / M a k e f i l e . i n c l u d e
2014-12-29 13:52:36 +01:00
2015-09-23 12:34:01 +02:00
$(PERF_IN) : prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) $( build) = perf
2014-12-29 13:52:36 +01:00
2015-05-28 13:28:54 +00:00
$(OUTPUT)perf : $( PERFLIBS ) $( PERF_IN ) $( LIBTRACEEVENT_DYNAMIC_LIST )
2015-06-17 14:46:29 +00:00
$( QUIET_LINK) $( CC) $( CFLAGS) $( LDFLAGS) $( LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
$( PERF_IN) $( LIBS) -o $@
2013-10-02 11:49:08 +02:00
2015-09-23 12:34:02 +02:00
$(GTK_IN) : fixdep FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) $( build) = gtk
2013-09-13 15:27:43 +09:00
2014-12-30 00:34:23 +01:00
$(OUTPUT)libperf-gtk.so : $( GTK_IN ) $( PERFLIBS )
2014-04-27 11:12:21 +02:00
$( QUIET_LINK) $( CC) -o $@ -shared $( LDFLAGS) $( filter %.o,$^) $( GTK_LIBS)
2013-09-13 15:27:43 +09:00
2013-10-02 11:49:08 +02:00
$(OUTPUT)common-cmds.h : util /generate -cmdlist .sh command -list .txt
$(OUTPUT)common-cmds.h : $( wildcard Documentation /perf -*.txt )
$( QUIET_GEN) . util/generate-cmdlist.sh > $@ + && mv $@ + $@
$(SCRIPTS) : % : %.sh
$( QUIET_GEN) $( INSTALL) '$@.sh' '$(OUTPUT)$@'
# These can record PERF_VERSION
2014-12-30 17:09:15 +01:00
p e r f . s p e c $( SCRIPTS ) \
2013-10-02 11:49:08 +02:00
: $( OUTPUT) PERF-VERSION-FILE
.SUFFIXES :
2013-10-04 12:14:59 +02:00
#
# If a target does not match any of the later rules then prefix it by $(OUTPUT)
# This makes targets like 'make O=/tmp/perf perf.o' work in a natural way.
#
i f n e q ( $( OUTPUT ) , )
%.o : $( OUTPUT ) %.o
@echo " # Redirected target $@ => $( OUTPUT) $@ "
util/%.o : $( OUTPUT ) util /%.o
2013-10-10 07:42:56 +02:00
@echo " # Redirected target $@ => $( OUTPUT) $@ "
2013-10-04 12:14:59 +02:00
bench/%.o : $( OUTPUT ) bench /%.o
2013-10-10 07:42:56 +02:00
@echo " # Redirected target $@ => $( OUTPUT) $@ "
2013-10-04 12:14:59 +02:00
tests/%.o : $( OUTPUT ) tests /%.o
2013-10-10 07:42:56 +02:00
@echo " # Redirected target $@ => $( OUTPUT) $@ "
2013-10-04 12:14:59 +02:00
e n d i f
2013-10-02 11:49:08 +02:00
# These two need to be here so that when O= is not used they take precedence
# over the general rule for .o
2014-12-30 18:44:38 +01:00
# get relative building directory (to $(OUTPUT))
# and '.' if it's $(OUTPUT) itself
__build-dir = $( subst $( OUTPUT) ,,$( dir $@ ) )
build-dir = $( if $( __build-dir) ,$( __build-dir) ,.)
2015-09-23 12:34:02 +02:00
prepare : $( OUTPUT ) PERF -VERSION -FILE $( OUTPUT ) common -cmds .h fixdep
2014-12-30 18:44:38 +01:00
2015-09-23 12:34:01 +02:00
$(OUTPUT)%.o : %.c prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -f $( srctree) /tools/build/Makefile.build dir = $( build-dir) $@
2014-12-30 18:44:38 +01:00
2015-09-23 12:34:01 +02:00
$(OUTPUT)%.i : %.c prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -f $( srctree) /tools/build/Makefile.build dir = $( build-dir) $@
2014-12-30 18:44:38 +01:00
2015-09-23 12:34:01 +02:00
$(OUTPUT)%.s : %.c prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -f $( srctree) /tools/build/Makefile.build dir = $( build-dir) $@
2014-12-30 18:44:38 +01:00
2015-09-23 12:34:01 +02:00
$(OUTPUT)%-bison.o : %.c prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -f $( srctree) /tools/build/Makefile.build dir = $( build-dir) $@
2014-12-30 18:44:38 +01:00
2015-09-23 12:34:01 +02:00
$(OUTPUT)%-flex.o : %.c prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -f $( srctree) /tools/build/Makefile.build dir = $( build-dir) $@
2014-12-30 18:44:38 +01:00
2015-09-23 12:34:01 +02:00
$(OUTPUT)%.o : %.S prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -f $( srctree) /tools/build/Makefile.build dir = $( build-dir) $@
2014-12-30 18:44:38 +01:00
2015-09-23 12:34:01 +02:00
$(OUTPUT)%.i : %.S prepare FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -f $( srctree) /tools/build/Makefile.build dir = $( build-dir) $@
2013-10-02 11:49:08 +02:00
$(OUTPUT)perf-% : %.o $( PERFLIBS )
$( QUIET_LINK) $( CC) $( CFLAGS) -o $@ $( LDFLAGS) $( filter %.o,$^) $( LIBS)
2014-10-23 18:16:03 -03:00
i f n d e f N O _ P E R F _ R E A D _ V D S O 3 2
$(OUTPUT)perf-read-vdso32 : perf -read -vdso .c util /find -vdso -map .c
$( QUIET_CC) $( CC) -m32 $( filter -static,$( LDFLAGS) ) -Wall -Werror -o $@ perf-read-vdso.c
e n d i f
i f n d e f N O _ P E R F _ R E A D _ V D S O X 3 2
$(OUTPUT)perf-read-vdsox32 : perf -read -vdso .c util /find -vdso -map .c
$( QUIET_CC) $( CC) -mx32 $( filter -static,$( LDFLAGS) ) -Wall -Werror -o $@ perf-read-vdso.c
e n d i f
2014-12-30 16:51:35 +01:00
$(patsubst perf-%,%.o,$(PROGRAMS)) : $( wildcard */*.h )
2013-10-02 11:49:08 +02:00
2014-12-29 17:42:46 +01:00
LIBPERF_IN := $( OUTPUT) libperf-in.o
2015-09-23 12:34:02 +02:00
$(LIBPERF_IN) : fixdep FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) $( build) = libperf
2014-12-29 17:42:46 +01:00
2014-12-30 16:51:35 +01:00
$(LIB_FILE) : $( LIBPERF_IN )
2014-12-29 17:42:46 +01:00
$( QUIET_AR) $( RM) $@ && $( AR) rcs $@ $( LIBPERF_IN) $( LIB_OBJS)
2013-10-02 11:49:08 +02:00
2013-12-03 14:09:21 +01:00
LIBTRACEEVENT_FLAGS += plugin_dir = $( plugindir_SQ)
2015-09-23 12:34:02 +02:00
$(LIBTRACEEVENT) : fixdep FORCE
2015-05-28 13:28:54 +00:00
$( Q) $( MAKE) -C $( TRACE_EVENT_DIR) $( LIBTRACEEVENT_FLAGS) O = $( OUTPUT) $( OUTPUT) libtraceevent.a
2015-09-23 12:34:02 +02:00
libtraceevent_plugins : fixdep FORCE
2015-05-28 13:28:54 +00:00
$( Q) $( MAKE) -C $( TRACE_EVENT_DIR) $( LIBTRACEEVENT_FLAGS) O = $( OUTPUT) plugins
$(LIBTRACEEVENT_DYNAMIC_LIST) : libtraceevent_plugins
$( Q) $( MAKE) -C $( TRACE_EVENT_DIR) $( LIBTRACEEVENT_FLAGS) O = $( OUTPUT) $( OUTPUT) libtraceevent-dynamic-list
2013-10-02 11:49:08 +02:00
$(LIBTRACEEVENT)-clean :
2013-10-09 11:49:26 +02:00
$( call QUIET_CLEAN, libtraceevent)
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -C $( TRACE_EVENT_DIR) O = $( OUTPUT) clean >/dev/null
2013-10-02 11:49:08 +02:00
2013-12-05 12:13:54 +01:00
install-traceevent-plugins : $( LIBTRACEEVENT )
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -C $( TRACE_EVENT_DIR) $( LIBTRACEEVENT_FLAGS) O = $( OUTPUT) install_plugins
2013-12-03 14:09:21 +01:00
2015-09-23 12:34:02 +02:00
$(LIBAPI) : fixdep FORCE
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -C $( LIB_DIR) O = $( OUTPUT) $( OUTPUT) libapi.a
2013-10-02 11:49:08 +02:00
2015-01-10 20:53:13 +01:00
$(LIBAPI)-clean :
$( call QUIET_CLEAN, libapi)
2015-01-11 23:59:55 +01:00
$( Q) $( MAKE) -C $( LIB_DIR) O = $( OUTPUT) clean >/dev/null
2013-10-02 11:49:08 +02:00
help :
@echo 'Perf make targets:'
@echo ' doc - make *all* documentation (see below)'
@echo ' man - make manpage documentation (access with man <foo>)'
@echo ' html - make html documentation'
@echo ' info - make GNU info documentation (access with info <foo>)'
@echo ' pdf - make pdf documentation'
@echo ' TAGS - use etags to make tag information for source browsing'
@echo ' tags - use ctags to make tag information for source browsing'
@echo ' cscope - use cscope to make interactive browsing database'
@echo ''
@echo 'Perf install targets:'
@echo ' NOTE: documentation build requires asciidoc, xmlto packages to be installed'
2014-06-03 00:44:34 +08:00
@echo ' HINT: use "prefix" or "DESTDIR" to install to a particular'
@echo ' path like "make prefix=/usr/local install install-doc"'
2013-10-02 11:49:08 +02:00
@echo ' install - install compiled binaries'
@echo ' install-doc - install *all* documentation'
@echo ' install-man - install manpage documentation'
@echo ' install-html - install html documentation'
@echo ' install-info - install GNU info documentation'
@echo ' install-pdf - install pdf documentation'
@echo ''
@echo ' quick-install-doc - alias for quick-install-man'
@echo ' quick-install-man - install the documentation quickly'
@echo ' quick-install-html - install the html documentation quickly'
@echo ''
@echo 'Perf maintainer targets:'
@echo ' clean - clean all binary objects and build output'
DOC_TARGETS := doc man html info pdf
INSTALL_DOC_TARGETS := $( patsubst %,install-%,$( DOC_TARGETS) ) try-install-man
INSTALL_DOC_TARGETS += quick-install-doc quick-install-man quick-install-html
# 'make doc' should call 'make -C Documentation all'
$(DOC_TARGETS) :
$( QUIET_SUBDIR0) Documentation $( QUIET_SUBDIR1) $( @:doc= all)
2015-09-07 10:38:04 +02:00
TAG_FOLDERS = . ../lib/traceevent ../lib/api ../lib/symbol ../include
2014-05-28 10:19:18 +02:00
TAG_FILES = ../../include/uapi/linux/perf_event.h
2013-10-02 11:49:08 +02:00
TAGS :
2014-06-04 14:43:58 +02:00
$( QUIET_GEN) $( RM) TAGS; \
2014-05-28 10:19:18 +02:00
$( FIND) $( TAG_FOLDERS) -name '*.[hcS]' -print | xargs etags -a $( TAG_FILES)
2013-10-02 11:49:08 +02:00
tags :
2014-06-04 14:43:58 +02:00
$( QUIET_GEN) $( RM) tags; \
2014-05-28 10:19:18 +02:00
$( FIND) $( TAG_FOLDERS) -name '*.[hcS]' -print | xargs ctags -a $( TAG_FILES)
2013-10-02 11:49:08 +02:00
cscope :
2014-06-04 14:43:58 +02:00
$( QUIET_GEN) $( RM) cscope*; \
2014-05-28 10:19:18 +02:00
$( FIND) $( TAG_FOLDERS) -name '*.[hcS]' -print | xargs cscope -b $( TAG_FILES)
2013-10-02 11:49:08 +02:00
### Testing rules
# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.
check : $( OUTPUT ) common -cmds .h
if sparse; \
then \
for i in *.c */*.c; \
do \
sparse $( CFLAGS) $( SPARSE_FLAGS) $$ i || exit; \
done ; \
else \
exit 1; \
fi
### Installation rules
2013-09-13 15:27:43 +09:00
install-gtk :
2015-05-18 11:37:27 -07:00
install-tools : all install -gtk
2013-10-09 11:49:29 +02:00
$( call QUIET_INSTALL, binaries) \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)' ; \
$( INSTALL) $( OUTPUT) perf '$(DESTDIR_SQ)$(bindir_SQ)' ; \
$( LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf' '$(DESTDIR_SQ)$(bindir_SQ)/trace'
2014-10-23 18:16:03 -03:00
i f n d e f N O _ P E R F _ R E A D _ V D S O 3 2
$( call QUIET_INSTALL, perf-read-vdso32) \
$( INSTALL) $( OUTPUT) perf-read-vdso32 '$(DESTDIR_SQ)$(bindir_SQ)' ;
e n d i f
i f n d e f N O _ P E R F _ R E A D _ V D S O X 3 2
$( call QUIET_INSTALL, perf-read-vdsox32) \
$( INSTALL) $( OUTPUT) perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)' ;
e n d i f
2013-10-09 11:49:29 +02:00
$( call QUIET_INSTALL, libexec) \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
$( call QUIET_INSTALL, perf-archive) \
$( INSTALL) $( OUTPUT) perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
2014-07-31 09:01:12 +03:00
$( call QUIET_INSTALL, perf-with-kcore) \
$( INSTALL) $( OUTPUT) perf-with-kcore -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
perf trace: Support 'strace' syscall event groups
I.e.:
$ cat ~/share/perf-core/strace/groups/file
access
chmod
creat
execve
faccessat
getcwd
lstat
mkdir
open
openat
quotactl
readlink
rename
rmdir
stat
statfs
symlink
unlink
$
Then, on a quiet desktop, try running this and then moving your mouse to
see the deluge of mouse related activity:
# perf probe 'vfs_getname=getname_flags:72 pathname=filename:string'
Added new event:
probe:vfs_getname (on getname_flags:72 with pathname=filename:string)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_getname -aR sleep 1
#
# trace --ev probe:vfs_getname --filter-pids 2232 -e file
0.042 (0.042 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.042 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/xterm")
0.100 (0.100 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.142 (0.018 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.142 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/index.theme")
0.192 (0.069 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
0.230 (0.017 ms): mousetweaks/2235 open(filename: 0x14c3c10, mode: 438 ) ...
0.230 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/usr/share/icons/Adwaita/cursors/xterm")
0.253 (0.041 ms): mousetweaks/2235 ... [continued]: open()) = 14
0.459 (0.008 ms): mousetweaks/2235 open(filename: 0x14e3910, mode: 438 ) ...
0.459 ( ): probe:vfs_getname:(ffffffff812230bc) pathname="/home/acme/.icons/Adwaita/cursors/left_side")
0.468 (0.017 ms): mousetweaks/2235 ... [continued]: open()) = -1 ENOENT No such file or directory
Need to combine that raw_syscalls:sys_enter(open) + probe:vfs_getname +
raw_syscalls:sys_exit(open) sequence...
Now, if you're bored, please write some more syscall groups, like the ones
in 'strace' and send it our way :-)
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Milian Wolff <mail@milianw.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-a42xklu59lcbxp7bbnic74a8@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
2015-07-20 12:02:09 -03:00
i f n d e f N O _ L I B A U D I T
$( call QUIET_INSTALL, strace/groups) \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)' ; \
$( INSTALL) trace/strace/groups/* -t '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)'
e n d i f
2013-10-02 11:49:08 +02:00
i f n d e f N O _ L I B P E R L
2013-10-09 11:49:29 +02:00
$( call QUIET_INSTALL, perl-scripts) \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace' ; \
$( INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace' ; \
$( INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl' ; \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin' ; \
$( INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
2013-10-02 11:49:08 +02:00
e n d i f
i f n d e f N O _ L I B P Y T H O N
2013-10-09 11:49:29 +02:00
$( call QUIET_INSTALL, python-scripts) \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace' ; \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin' ; \
$( INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace' ; \
$( INSTALL) scripts/python/*.py -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python' ; \
$( INSTALL) scripts/python/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
2013-10-02 11:49:08 +02:00
e n d i f
2013-11-17 21:43:27 +05:30
$( call QUIET_INSTALL, perf_completion-script) \
2013-10-09 11:49:29 +02:00
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d' ; \
2013-11-17 21:43:27 +05:30
$( INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf'
2015-05-18 11:37:27 -07:00
install-tests : all install -gtk
2013-10-09 11:49:29 +02:00
$( call QUIET_INSTALL, tests) \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests' ; \
$( INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests' ; \
$( INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr' ; \
$( INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'
2013-10-02 11:49:08 +02:00
2015-05-18 11:37:27 -07:00
install-bin : install -tools install -tests
2013-12-03 14:09:21 +01:00
install : install -bin try -install -man install -traceevent -plugins
2013-10-02 11:49:08 +02:00
install-python_ext :
$( PYTHON_WORD) util/setup.py --quiet install --root= '/$(DESTDIR_SQ)'
# 'make install-doc' should call 'make -C Documentation install'
$(INSTALL_DOC_TARGETS) :
$( QUIET_SUBDIR0) Documentation $( QUIET_SUBDIR1) $( @:-doc= )
### Cleaning rules
#
# This is here, not in config/Makefile, because config/Makefile does
# not get included for the clean target:
#
config-clean :
2013-10-09 11:49:26 +02:00
$( call QUIET_CLEAN, config)
2015-03-01 21:19:44 +01:00
$( Q) $( MAKE) -C $( srctree) /tools/build/feature/ clean >/dev/null
2013-10-02 11:49:08 +02:00
2015-01-10 20:53:13 +01:00
clean : $( LIBTRACEEVENT ) -clean $( LIBAPI ) -clean config -clean
2014-12-30 16:51:35 +01:00
$( call QUIET_CLEAN, core-objs) $( RM) $( LIB_FILE) $( OUTPUT) perf-archive $( OUTPUT) perf-with-kcore $( LANG_BINDINGS)
2015-01-11 23:59:55 +01:00
$( Q) find . -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
2015-07-01 14:54:42 +03:00
$( Q) $( RM) $( OUTPUT) .config-detected
2014-10-23 18:16:03 -03:00
$( call QUIET_CLEAN, core-progs) $( RM) $( ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32
2015-08-13 10:14:55 +03:00
$( call QUIET_CLEAN, core-gen) $( RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $( OUTPUT) common-cmds.h TAGS tags cscope* $( OUTPUT) PERF-VERSION-FILE $( OUTPUT) FEATURE-DUMP $( OUTPUT) util/*-bison* $( OUTPUT) util/*-flex* \
$( OUTPUT) util/intel-pt-decoder/inat-tables.c
2013-12-09 17:14:23 +01:00
$( QUIET_SUBDIR0) Documentation $( QUIET_SUBDIR1) clean
2013-10-02 11:49:08 +02:00
$( python-clean)
#
# Trick: if ../../.git does not exist - we are building out of tree for example,
# then force version regeneration:
#
i f e q ( $( wildcard ../../.git /HEAD ) , )
GIT-HEAD-PHONY = ../../.git/HEAD
e l s e
GIT-HEAD-PHONY =
e n d i f
2014-12-29 13:52:36 +01:00
FORCE :
2013-09-13 15:27:43 +09:00
.PHONY : all install clean config -clean strip install -gtk
2013-10-02 11:49:08 +02:00
.PHONY : shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
2015-09-23 12:34:01 +02:00
.PHONY : $( GIT -HEAD -PHONY ) TAGS tags cscope FORCE prepare
2015-05-28 13:28:54 +00:00
.PHONY : libtraceevent_plugins
2013-10-02 11:49:08 +02:00