Linux Audio

Check our new training course

Loading...
v4.6
 
  1include ../scripts/Makefile.include
 
  2
  3# The default target of this Makefile is...
  4all:
  5
  6include ../scripts/utilities.mak
  7
  8# Define V to have a more verbose compile.
  9#
 10# Define VF to have a more verbose feature check output.
 11#
 12# Define O to save output files in a separate directory.
 13#
 14# Define ARCH as name of target architecture if you want cross-builds.
 15#
 16# Define CROSS_COMPILE as prefix name of compiler if you want cross-builds.
 17#
 18# Define NO_LIBPERL to disable perl script extension.
 19#
 20# Define NO_LIBPYTHON to disable python script extension.
 21#
 22# Define PYTHON to point to the python binary if the default
 23# `python' is not correct; for example: PYTHON=python2
 24#
 25# Define PYTHON_CONFIG to point to the python-config binary if
 26# the default `$(PYTHON)-config' is not correct.
 27#
 28# Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
 29#
 30# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
 31#
 32# Define LDFLAGS=-static to build a static binary.
 33#
 34# Define EXTRA_CFLAGS=-m64 or EXTRA_CFLAGS=-m32 as appropriate for cross-builds.
 35#
 
 
 
 
 
 36# Define NO_DWARF if you do not want debug-info analysis feature at all.
 37#
 38# Define WERROR=0 to disable treating any warnings as errors.
 39#
 40# Define NO_NEWT if you do not want TUI support. (deprecated)
 41#
 42# Define NO_SLANG if you do not want TUI support.
 43#
 44# Define NO_GTK2 if you do not want GTK+ GUI support.
 45#
 46# Define NO_DEMANGLE if you do not want C++ symbol demangling.
 47#
 48# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
 49#
 50# Define NO_LIBUNWIND if you do not want libunwind dependency for dwarf
 51# backtrace post unwind.
 52#
 53# Define NO_BACKTRACE if you do not want stack backtrace debug feature
 54#
 55# Define NO_LIBNUMA if you do not want numa perf benchmark
 56#
 57# Define NO_LIBAUDIT if you do not want libaudit support
 58#
 59# Define NO_LIBBIONIC if you do not want bionic support
 60#
 61# Define NO_LIBCRYPTO if you do not want libcrypto (openssl) support
 62# used for generating build-ids for ELFs generated by jitdump.
 63#
 64# Define NO_LIBDW_DWARF_UNWIND if you do not want libdw support
 65# for dwarf backtrace post unwind.
 66#
 67# Define NO_PERF_READ_VDSO32 if you do not want to build perf-read-vdso32
 68# for reading the 32-bit compatibility VDSO in 64-bit mode
 69#
 70# Define NO_PERF_READ_VDSOX32 if you do not want to build perf-read-vdsox32
 71# for reading the x32 mode 32-bit compatibility VDSO in 64-bit mode
 72#
 73# Define NO_ZLIB if you do not want to support compressed kernel modules
 74#
 75# Define LIBBABELTRACE if you DO want libbabeltrace support
 76# for CTF data format.
 77#
 78# Define NO_LZMA if you do not want to support compressed (xz) kernel modules
 79#
 80# Define NO_AUXTRACE if you do not want AUX area tracing support
 81#
 82# Define NO_LIBBPF if you do not want BPF support
 83#
 
 
 
 
 
 84# Define FEATURES_DUMP to provide features detection dump file
 85# and bypass the feature detection
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 86
 87# As per kernel Makefile, avoid funny character set dependencies
 88unexport LC_ALL
 89LC_COLLATE=C
 90LC_NUMERIC=C
 91export LC_COLLATE LC_NUMERIC
 92
 93ifeq ($(srctree),)
 94srctree := $(patsubst %/,%,$(dir $(shell pwd)))
 95srctree := $(patsubst %/,%,$(dir $(srctree)))
 96#$(info Determined 'srctree' to be $(srctree))
 97endif
 98
 99ifneq ($(objtree),)
100#$(info Determined 'objtree' to be $(objtree))
101endif
102
103ifneq ($(OUTPUT),)
104#$(info Determined 'OUTPUT' to be $(OUTPUT))
105# Adding $(OUTPUT) as a directory to look for source files,
106# because use generated output files as sources dependency
107# for flex/bison parsers.
108VPATH += $(OUTPUT)
109export VPATH
110endif
111
112ifeq ($(V),1)
113  Q =
114else
115  Q = @
116endif
117
118# Do not use make's built-in rules
119# (this improves performance and avoids hard-to-debug behaviour);
120MAKEFLAGS += -r
121
122$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
123	$(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
124	$(Q)touch $(OUTPUT)PERF-VERSION-FILE
125
126# Makefiles suck: This macro sets a default value of $(2) for the
127# variable named by $(1), unless the variable has been set by
128# environment or command line. This is necessary for CC and AR
129# because make sets default values, so the simpler ?= approach
130# won't work as expected.
131define allow-override
132  $(if $(or $(findstring environment,$(origin $(1))),\
133            $(findstring command line,$(origin $(1)))),,\
134    $(eval $(1) = $(2)))
135endef
136
137# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix.
138$(call allow-override,CC,$(CROSS_COMPILE)gcc)
139$(call allow-override,AR,$(CROSS_COMPILE)ar)
140$(call allow-override,LD,$(CROSS_COMPILE)ld)
141
142LD += $(EXTRA_LDFLAGS)
143
 
 
 
 
144PKG_CONFIG = $(CROSS_COMPILE)pkg-config
 
145
146RM      = rm -f
147LN      = ln -f
148MKDIR   = mkdir
149FIND    = find
150INSTALL = install
151FLEX    = flex
152BISON   = bison
153STRIP   = strip
154AWK     = awk
155
156LIB_DIR		= $(srctree)/tools/lib/api/
157TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
158BPF_DIR		= $(srctree)/tools/lib/bpf/
159SUBCMD_DIR	= $(srctree)/tools/lib/subcmd/
160
161# include config/Makefile by default and rule out
162# non-config cases
163config := 1
164
165NON_CONFIG_TARGETS := clean TAGS tags cscope help
166
167ifdef MAKECMDGOALS
168ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
169  config := 0
170endif
171endif
172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173# Set FEATURE_TESTS to 'all' so all possible feature checkers are executed.
174# Without this setting the output feature dump file misses some features, for
175# example, liberty. Select all checkers so we won't get an incomplete feature
176# dump file.
177ifeq ($(config),1)
178ifdef MAKECMDGOALS
179ifeq ($(filter feature-dump,$(MAKECMDGOALS)),feature-dump)
180FEATURE_TESTS := all
181endif
182endif
183include config/Makefile
 
 
 
 
 
184endif
185
186# The FEATURE_DUMP_EXPORT holds location of the actual
187# FEATURE_DUMP file to be used to bypass feature detection
188# (for bpf or any other subproject)
189ifeq ($(FEATURES_DUMP),)
190FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP)
191else
192FEATURE_DUMP_EXPORT := $(FEATURES_DUMP)
193endif
194
195export prefix bindir sharedir sysconfdir DESTDIR
196
197# sparse is architecture-neutral, which means that we need to tell it
198# explicitly what architecture to check for. Fix this up for yours..
199SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
200
201# Guard against environment variables
202PYRF_OBJS =
203SCRIPT_SH =
204
205SCRIPT_SH += perf-archive.sh
206SCRIPT_SH += perf-with-kcore.sh
207
208grep-libs = $(filter -l%,$(1))
209strip-libs = $(filter-out -l%,$(1))
210
211ifneq ($(OUTPUT),)
212  TE_PATH=$(OUTPUT)
 
213  BPF_PATH=$(OUTPUT)
214  SUBCMD_PATH=$(OUTPUT)
 
215ifneq ($(subdir),)
216  API_PATH=$(OUTPUT)/../lib/api/
217else
218  API_PATH=$(OUTPUT)
219endif
220else
221  TE_PATH=$(TRACE_EVENT_DIR)
 
222  API_PATH=$(LIB_DIR)
223  BPF_PATH=$(BPF_DIR)
224  SUBCMD_PATH=$(SUBCMD_DIR)
 
225endif
226
227LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
228export LIBTRACEEVENT
229
230LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list
231LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
 
 
 
 
 
 
232
233LIBAPI = $(API_PATH)libapi.a
234export LIBAPI
235
236LIBBPF = $(BPF_PATH)libbpf.a
237
238LIBSUBCMD = $(SUBCMD_PATH)libsubcmd.a
239
 
 
 
240# python extension build directories
241PYTHON_EXTBUILD     := $(OUTPUT)python_ext_build/
242PYTHON_EXTBUILD_LIB := $(PYTHON_EXTBUILD)lib/
243PYTHON_EXTBUILD_TMP := $(PYTHON_EXTBUILD)tmp/
244export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
245
246python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf.so
247
248PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
249PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
250
251$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST)
252	$(QUIET_GEN)CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
253	  $(PYTHON_WORD) util/setup.py \
254	  --quiet build_ext; \
255	mkdir -p $(OUTPUT)python && \
256	cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/
257#
258# No Perl scripts right now:
259#
260
261SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
262
263PROGRAMS += $(OUTPUT)perf
264
265ifndef NO_PERF_READ_VDSO32
266PROGRAMS += $(OUTPUT)perf-read-vdso32
267endif
268
269ifndef NO_PERF_READ_VDSOX32
270PROGRAMS += $(OUTPUT)perf-read-vdsox32
271endif
272
 
 
 
 
 
 
273# what 'all' will build and 'install' will install, in perfexecdir
274ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
275
276# what 'all' will build but not install in perfexecdir
277OTHER_PROGRAMS = $(OUTPUT)perf
278
279# Set paths to tools early so that they can be used for version tests.
280ifndef SHELL_PATH
281  SHELL_PATH = /bin/sh
282endif
283ifndef PERL_PATH
284  PERL_PATH = /usr/bin/perl
285endif
286
287export PERL_PATH
288
289LIB_FILE=$(OUTPUT)libperf.a
290
291PERFLIBS = $(LIB_FILE) $(LIBAPI) $(LIBTRACEEVENT) $(LIBSUBCMD)
292ifndef NO_LIBBPF
293  PERFLIBS += $(LIBBPF)
 
 
294endif
295
296# We choose to avoid "if .. else if .. else .. endif endif"
297# because maintaining the nesting to match is a pain.  If
298# we had "elif" things would have been much nicer...
299
300-include arch/$(ARCH)/Makefile
301
302ifneq ($(OUTPUT),)
303  CFLAGS += -I$(OUTPUT)
304endif
305
306ifndef NO_GTK2
307  ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so
308  GTK_IN := $(OUTPUT)gtk-in.o
309
310install-gtk: $(OUTPUT)libperf-gtk.so
311	$(call QUIET_INSTALL, 'GTK UI') \
312		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
313		$(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)'
314endif
315
316ifdef ASCIIDOC8
317  export ASCIIDOC8
318endif
319
320LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
321
322export INSTALL SHELL_PATH
323
324### Build rules
325
326SHELL = $(SHELL_PATH)
327
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
328all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
329
 
 
 
 
 
 
 
 
 
 
330please_set_SHELL_PATH_to_a_more_modern_shell:
331	$(Q)$$(:)
332
333shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell
334
335strip: $(PROGRAMS) $(OUTPUT)perf
336	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) $(OUTPUT)perf
337
338PERF_IN := $(OUTPUT)perf-in.o
339
340export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX AWK
341include $(srctree)/tools/build/Makefile.include
 
 
 
 
 
 
342
343$(PERF_IN): prepare FORCE
344	$(Q)$(MAKE) $(build)=perf
345
346$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
 
 
 
 
 
 
 
 
 
347	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
348		$(PERF_IN) $(LIBS) -o $@
349
350$(GTK_IN): fixdep FORCE
351	$(Q)$(MAKE) $(build)=gtk
352
353$(OUTPUT)libperf-gtk.so: $(GTK_IN) $(PERFLIBS)
354	$(QUIET_LINK)$(CC) -o $@ -shared $(LDFLAGS) $(filter %.o,$^) $(GTK_LIBS)
355
356$(OUTPUT)common-cmds.h: util/generate-cmdlist.sh command-list.txt
357
358$(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt)
359	$(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@
360
361$(SCRIPTS) : % : %.sh
362	$(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
363
 
 
 
 
364# These can record PERF_VERSION
365perf.spec $(SCRIPTS) \
366	: $(OUTPUT)PERF-VERSION-FILE
367
368.SUFFIXES:
369
370#
371# If a target does not match any of the later rules then prefix it by $(OUTPUT)
372# This makes targets like 'make O=/tmp/perf perf.o' work in a natural way.
373#
374ifneq ($(OUTPUT),)
375%.o: $(OUTPUT)%.o
376	@echo "    # Redirected target $@ => $(OUTPUT)$@"
 
 
377util/%.o: $(OUTPUT)util/%.o
378	@echo "    # Redirected target $@ => $(OUTPUT)$@"
379bench/%.o: $(OUTPUT)bench/%.o
380	@echo "    # Redirected target $@ => $(OUTPUT)$@"
381tests/%.o: $(OUTPUT)tests/%.o
382	@echo "    # Redirected target $@ => $(OUTPUT)$@"
383endif
384
385# These two need to be here so that when O= is not used they take precedence
386# over the general rule for .o
387
388# get relative building directory (to $(OUTPUT))
389# and '.' if it's $(OUTPUT) itself
390__build-dir = $(subst $(OUTPUT),,$(dir $@))
391build-dir   = $(if $(__build-dir),$(__build-dir),.)
392
393prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h fixdep
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
394
395$(OUTPUT)%.o: %.c prepare FORCE
396	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
397
398$(OUTPUT)%.i: %.c prepare FORCE
399	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
400
401$(OUTPUT)%.s: %.c prepare FORCE
402	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
403
404$(OUTPUT)%-bison.o: %.c prepare FORCE
405	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
406
407$(OUTPUT)%-flex.o: %.c prepare FORCE
408	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
409
410$(OUTPUT)%.o: %.S prepare FORCE
411	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
412
413$(OUTPUT)%.i: %.S prepare FORCE
414	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
415
416$(OUTPUT)perf-%: %.o $(PERFLIBS)
417	$(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(filter %.o,$^) $(LIBS)
418
419ifndef NO_PERF_READ_VDSO32
420$(OUTPUT)perf-read-vdso32: perf-read-vdso.c util/find-vdso-map.c
421	$(QUIET_CC)$(CC) -m32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
422endif
423
424ifndef NO_PERF_READ_VDSOX32
425$(OUTPUT)perf-read-vdsox32: perf-read-vdso.c util/find-vdso-map.c
426	$(QUIET_CC)$(CC) -mx32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
427endif
428
429$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
 
430
431LIBPERF_IN := $(OUTPUT)libperf-in.o
 
432
433$(LIBPERF_IN): fixdep FORCE
434	$(Q)$(MAKE) $(build)=libperf
 
435
436$(LIB_FILE): $(LIBPERF_IN)
437	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIBPERF_IN) $(LIB_OBJS)
438
439LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ)
440
441$(LIBTRACEEVENT): fixdep FORCE
442	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a
443
444libtraceevent_plugins: fixdep FORCE
445	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) plugins
446
447$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
448	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent-dynamic-list
449
450$(LIBTRACEEVENT)-clean:
451	$(call QUIET_CLEAN, libtraceevent)
452	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) O=$(OUTPUT) clean >/dev/null
453
454install-traceevent-plugins: libtraceevent_plugins
455	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) install_plugins
456
457$(LIBAPI): fixdep FORCE
458	$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a
459
460$(LIBAPI)-clean:
461	$(call QUIET_CLEAN, libapi)
462	$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null
463
464$(LIBBPF): fixdep FORCE
465	$(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) $(OUTPUT)libbpf.a FEATURES_DUMP=$(FEATURE_DUMP_EXPORT)
466
467$(LIBBPF)-clean:
468	$(call QUIET_CLEAN, libbpf)
469	$(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) clean >/dev/null
470
471$(LIBSUBCMD): fixdep FORCE
 
 
 
 
 
 
 
472	$(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) $(OUTPUT)libsubcmd.a
473
474$(LIBSUBCMD)-clean:
475	$(call QUIET_CLEAN, libsubcmd)
476	$(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) clean
477
478help:
479	@echo 'Perf make targets:'
480	@echo '  doc		- make *all* documentation (see below)'
481	@echo '  man		- make manpage documentation (access with man <foo>)'
482	@echo '  html		- make html documentation'
483	@echo '  info		- make GNU info documentation (access with info <foo>)'
484	@echo '  pdf		- make pdf documentation'
485	@echo '  TAGS		- use etags to make tag information for source browsing'
486	@echo '  tags		- use ctags to make tag information for source browsing'
487	@echo '  cscope	- use cscope to make interactive browsing database'
488	@echo ''
489	@echo 'Perf install targets:'
490	@echo '  NOTE: documentation build requires asciidoc, xmlto packages to be installed'
491	@echo '  HINT: use "prefix" or "DESTDIR" to install to a particular'
492	@echo '        path like "make prefix=/usr/local install install-doc"'
493	@echo '  install	- install compiled binaries'
494	@echo '  install-doc	- install *all* documentation'
495	@echo '  install-man	- install manpage documentation'
496	@echo '  install-html	- install html documentation'
497	@echo '  install-info	- install GNU info documentation'
498	@echo '  install-pdf	- install pdf documentation'
499	@echo ''
500	@echo '  quick-install-doc	- alias for quick-install-man'
501	@echo '  quick-install-man	- install the documentation quickly'
502	@echo '  quick-install-html	- install the html documentation quickly'
503	@echo ''
504	@echo 'Perf maintainer targets:'
505	@echo '  clean			- clean all binary objects and build output'
506
507
508DOC_TARGETS := doc man html info pdf
509
510INSTALL_DOC_TARGETS := $(patsubst %,install-%,$(DOC_TARGETS)) try-install-man
511INSTALL_DOC_TARGETS += quick-install-doc quick-install-man quick-install-html
512
513# 'make doc' should call 'make -C Documentation all'
514$(DOC_TARGETS):
515	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:doc=all)
516
517TAG_FOLDERS= . ../lib ../include
518TAG_FILES= ../../include/uapi/linux/perf_event.h
519
520TAGS:
521	$(QUIET_GEN)$(RM) TAGS; \
522	$(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs etags -a $(TAG_FILES)
523
524tags:
525	$(QUIET_GEN)$(RM) tags; \
526	$(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs ctags -a $(TAG_FILES)
527
528cscope:
529	$(QUIET_GEN)$(RM) cscope*; \
530	$(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs cscope -b $(TAG_FILES)
531
532### Testing rules
533
534# GNU make supports exporting all variables by "export" without parameters.
535# However, the environment gets quite big, and some programs have problems
536# with that.
537
538check: $(OUTPUT)common-cmds.h
539	if sparse; \
540	then \
541		for i in *.c */*.c; \
542		do \
543			sparse $(CFLAGS) $(SPARSE_FLAGS) $$i || exit; \
544		done; \
545	else \
546		exit 1; \
547	fi
548
549### Installation rules
550
 
 
 
 
 
 
551install-gtk:
 
552
553install-tools: all install-gtk
554	$(call QUIET_INSTALL, binaries) \
555		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'; \
556		$(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'; \
557		$(LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf' '$(DESTDIR_SQ)$(bindir_SQ)/trace'
558ifndef NO_PERF_READ_VDSO32
559	$(call QUIET_INSTALL, perf-read-vdso32) \
560		$(INSTALL) $(OUTPUT)perf-read-vdso32 '$(DESTDIR_SQ)$(bindir_SQ)';
561endif
562ifndef NO_PERF_READ_VDSOX32
563	$(call QUIET_INSTALL, perf-read-vdsox32) \
564		$(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)';
565endif
 
 
 
 
 
566	$(call QUIET_INSTALL, libexec) \
567		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
 
 
 
 
 
 
 
 
 
 
568	$(call QUIET_INSTALL, perf-archive) \
569		$(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
570	$(call QUIET_INSTALL, perf-with-kcore) \
571		$(INSTALL) $(OUTPUT)perf-with-kcore -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
572ifndef NO_LIBAUDIT
573	$(call QUIET_INSTALL, strace/groups) \
574		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)'; \
575		$(INSTALL) trace/strace/groups/* -t '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)'
576endif
577ifndef NO_LIBPERL
578	$(call QUIET_INSTALL, perl-scripts) \
579		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \
580		$(INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \
581		$(INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'; \
582		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'; \
583		$(INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
584endif
585ifndef NO_LIBPYTHON
586	$(call QUIET_INSTALL, python-scripts) \
587		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \
588		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'; \
589		$(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \
590		$(INSTALL) scripts/python/*.py -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python'; \
591		$(INSTALL) scripts/python/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
592endif
593	$(call QUIET_INSTALL, perf_completion-script) \
594		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'; \
595		$(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf'
596	$(call QUIET_INSTALL, perf-tip) \
597		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(tip_instdir_SQ)'; \
598		$(INSTALL) Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)'
599
600install-tests: all install-gtk
601	$(call QUIET_INSTALL, tests) \
602		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
603		$(INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
604		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
605		$(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'
 
 
 
 
606
607install-bin: install-tools install-tests
608
609install: install-bin try-install-man install-traceevent-plugins
610
611install-python_ext:
612	$(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)'
613
614# 'make install-doc' should call 'make -C Documentation install'
615$(INSTALL_DOC_TARGETS):
616	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:-doc=)
617
618### Cleaning rules
619
620#
621# This is here, not in config/Makefile, because config/Makefile does
622# not get included for the clean target:
623#
624config-clean:
625	$(call QUIET_CLEAN, config)
626	$(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null
627
628clean: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean
629	$(call QUIET_CLEAN, core-objs)  $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
 
 
 
630	$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
631	$(Q)$(RM) $(OUTPUT).config-detected
632	$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32
633	$(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* \
634		$(OUTPUT)util/intel-pt-decoder/inat-tables.c $(OUTPUT)fixdep \
635		$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c
636	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
637	$(python-clean)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
638
639#
640# To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
641# file if defined, with no further action.
642feature-dump:
643ifdef FEATURE_DUMP_COPY
644	@cp $(OUTPUT)FEATURE-DUMP $(FEATURE_DUMP_COPY)
645	@echo "FEATURE-DUMP file copied into $(FEATURE_DUMP_COPY)"
646else
647	@echo "FEATURE-DUMP file available in $(OUTPUT)FEATURE-DUMP"
648endif
649
650#
651# Trick: if ../../.git does not exist - we are building out of tree for example,
652# then force version regeneration:
653#
654ifeq ($(wildcard ../../.git/HEAD),)
655    GIT-HEAD-PHONY = ../../.git/HEAD
656else
657    GIT-HEAD-PHONY =
658endif
659
660FORCE:
661
662.PHONY: all install clean config-clean strip install-gtk
663.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
664.PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE prepare
665.PHONY: libtraceevent_plugins
666
v5.9
   1# SPDX-License-Identifier: GPL-2.0-only
   2include ../scripts/Makefile.include
   3include ../scripts/Makefile.arch
   4
   5# The default target of this Makefile is...
   6all:
   7
   8include ../scripts/utilities.mak
   9
  10# Define V to have a more verbose compile.
  11#
  12# Define VF to have a more verbose feature check output.
  13#
  14# Define O to save output files in a separate directory.
  15#
  16# Define ARCH as name of target architecture if you want cross-builds.
  17#
  18# Define CROSS_COMPILE as prefix name of compiler if you want cross-builds.
  19#
  20# Define NO_LIBPERL to disable perl script extension.
  21#
  22# Define NO_LIBPYTHON to disable python script extension.
  23#
  24# Define PYTHON to point to the python binary if the default
  25# `python' is not correct; for example: PYTHON=python2
  26#
  27# Define PYTHON_CONFIG to point to the python-config binary if
  28# the default `$(PYTHON)-config' is not correct.
  29#
  30# Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
  31#
  32# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
  33#
  34# Define LDFLAGS=-static to build a static binary.
  35#
  36# Define EXTRA_CFLAGS=-m64 or EXTRA_CFLAGS=-m32 as appropriate for cross-builds.
  37#
  38# Define EXCLUDE_EXTLIBS=-lmylib to exclude libmylib from the auto-generated
  39# EXTLIBS.
  40#
  41# Define EXTRA_PERFLIBS to pass extra libraries to PERFLIBS.
  42#
  43# Define NO_DWARF if you do not want debug-info analysis feature at all.
  44#
  45# Define WERROR=0 to disable treating any warnings as errors.
  46#
  47# Define NO_NEWT if you do not want TUI support. (deprecated)
  48#
  49# Define NO_SLANG if you do not want TUI support.
  50#
  51# Define NO_GTK2 if you do not want GTK+ GUI support.
  52#
  53# Define NO_DEMANGLE if you do not want C++ symbol demangling.
  54#
  55# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
  56#
  57# Define NO_LIBUNWIND if you do not want libunwind dependency for dwarf
  58# backtrace post unwind.
  59#
  60# Define NO_BACKTRACE if you do not want stack backtrace debug feature
  61#
  62# Define NO_LIBNUMA if you do not want numa perf benchmark
  63#
  64# Define NO_LIBAUDIT if you do not want libaudit support
  65#
  66# Define NO_LIBBIONIC if you do not want bionic support
  67#
  68# Define NO_LIBCRYPTO if you do not want libcrypto (openssl) support
  69# used for generating build-ids for ELFs generated by jitdump.
  70#
  71# Define NO_LIBDW_DWARF_UNWIND if you do not want libdw support
  72# for dwarf backtrace post unwind.
  73#
  74# Define NO_PERF_READ_VDSO32 if you do not want to build perf-read-vdso32
  75# for reading the 32-bit compatibility VDSO in 64-bit mode
  76#
  77# Define NO_PERF_READ_VDSOX32 if you do not want to build perf-read-vdsox32
  78# for reading the x32 mode 32-bit compatibility VDSO in 64-bit mode
  79#
  80# Define NO_ZLIB if you do not want to support compressed kernel modules
  81#
  82# Define NO_LIBBABELTRACE if you do not want libbabeltrace support
  83# for CTF data format.
  84#
  85# Define NO_LZMA if you do not want to support compressed (xz) kernel modules
  86#
  87# Define NO_AUXTRACE if you do not want AUX area tracing support
  88#
  89# Define NO_LIBBPF if you do not want BPF support
  90#
  91# Define NO_LIBCAP if you do not want process capabilities considered by perf
  92#
  93# Define NO_SDT if you do not want to define SDT event in perf tools,
  94# note that it doesn't disable SDT scanning support.
  95#
  96# Define FEATURES_DUMP to provide features detection dump file
  97# and bypass the feature detection
  98#
  99# Define NO_JVMTI if you do not want jvmti agent built
 100#
 101# Define NO_JVMTI_CMLR (debug only) if you do not want to process CMLR
 102# data for java source lines.
 103#
 104# Define LIBCLANGLLVM if you DO want builtin clang and llvm support.
 105# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if
 106# llvm-config is not in $PATH.
 107#
 108# Define CORESIGHT if you DO WANT support for CoreSight trace decoding.
 109#
 110# Define NO_AIO if you do not want support of Posix AIO based trace
 111# streaming for record mode. Currently Posix AIO trace streaming is
 112# supported only when linking with glibc.
 113#
 114# Define NO_LIBZSTD if you do not want support of Zstandard based runtime
 115# trace compression in record mode.
 116#
 117# Define TCMALLOC to enable tcmalloc heap profiling.
 118#
 119# Define LIBBPF_DYNAMIC to enable libbpf dynamic linking.
 120#
 121# Define NO_SYSCALL_TABLE=1 to disable the use of syscall id to/from name tables
 122# generated from the kernel .tbl or unistd.h files and use, if available, libaudit
 123# for doing the conversions to/from strings/id.
 124#
 125# Define LIBPFM4 to enable libpfm4 events extension.
 126#
 127# Define NO_LIBDEBUGINFOD if you do not want support debuginfod
 128#
 129
 130# As per kernel Makefile, avoid funny character set dependencies
 131unexport LC_ALL
 132LC_COLLATE=C
 133LC_NUMERIC=C
 134export LC_COLLATE LC_NUMERIC
 135
 136ifeq ($(srctree),)
 137srctree := $(patsubst %/,%,$(dir $(CURDIR)))
 138srctree := $(patsubst %/,%,$(dir $(srctree)))
 139#$(info Determined 'srctree' to be $(srctree))
 140endif
 141
 142ifneq ($(objtree),)
 143#$(info Determined 'objtree' to be $(objtree))
 144endif
 145
 146ifneq ($(OUTPUT),)
 147#$(info Determined 'OUTPUT' to be $(OUTPUT))
 148# Adding $(OUTPUT) as a directory to look for source files,
 149# because use generated output files as sources dependency
 150# for flex/bison parsers.
 151VPATH += $(OUTPUT)
 152export VPATH
 153endif
 154
 155ifeq ($(V),1)
 156  Q =
 157else
 158  Q = @
 159endif
 160
 161# Do not use make's built-in rules
 162# (this improves performance and avoids hard-to-debug behaviour);
 163MAKEFLAGS += -r
 164
 
 
 
 
 165# Makefiles suck: This macro sets a default value of $(2) for the
 166# variable named by $(1), unless the variable has been set by
 167# environment or command line. This is necessary for CC and AR
 168# because make sets default values, so the simpler ?= approach
 169# won't work as expected.
 170define allow-override
 171  $(if $(or $(findstring environment,$(origin $(1))),\
 172            $(findstring command line,$(origin $(1)))),,\
 173    $(eval $(1) = $(2)))
 174endef
 175
 
 
 
 
 
 176LD += $(EXTRA_LDFLAGS)
 177
 178HOSTCC  ?= gcc
 179HOSTLD  ?= ld
 180HOSTAR  ?= ar
 181
 182PKG_CONFIG = $(CROSS_COMPILE)pkg-config
 183LLVM_CONFIG ?= llvm-config
 184
 185RM      = rm -f
 186LN      = ln -f
 187MKDIR   = mkdir
 188FIND    = find
 189INSTALL = install
 190FLEX    ?= flex
 191BISON   ?= bison
 192STRIP   = strip
 193AWK     = awk
 194
 195# include Makefile.config by default and rule out
 
 
 
 
 
 196# non-config cases
 197config := 1
 198
 199NON_CONFIG_TARGETS := clean python-clean TAGS tags cscope help
 200
 201ifdef MAKECMDGOALS
 202ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),)
 203  config := 0
 204endif
 205endif
 206
 207# The fixdep build - we force fixdep tool to be built as
 208# the first target in the separate make session not to be
 209# disturbed by any parallel make jobs. Once fixdep is done
 210# we issue the requested build with FIXDEP=1 variable.
 211#
 212# The fixdep build is disabled for $(NON_CONFIG_TARGETS)
 213# targets, because it's not necessary.
 214
 215ifdef FIXDEP
 216  force_fixdep := 0
 217else
 218  force_fixdep := $(config)
 219endif
 220
 221export srctree OUTPUT RM CC CXX LD AR CFLAGS CXXFLAGS V BISON FLEX AWK
 222export HOSTCC HOSTLD HOSTAR
 223
 224include $(srctree)/tools/build/Makefile.include
 225
 226ifeq ($(force_fixdep),1)
 227goals := $(filter-out all sub-make, $(MAKECMDGOALS))
 228
 229$(goals) all: sub-make
 230
 231sub-make: fixdep
 232	@./check-headers.sh
 233	$(Q)$(MAKE) FIXDEP=1 -f Makefile.perf $(goals)
 234
 235else # force_fixdep
 236
 237LIB_DIR         = $(srctree)/tools/lib/api/
 238TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/
 239BPF_DIR         = $(srctree)/tools/lib/bpf/
 240SUBCMD_DIR      = $(srctree)/tools/lib/subcmd/
 241LIBPERF_DIR     = $(srctree)/tools/lib/perf/
 242DOC_DIR         = $(srctree)/tools/perf/Documentation/
 243
 244# Set FEATURE_TESTS to 'all' so all possible feature checkers are executed.
 245# Without this setting the output feature dump file misses some features, for
 246# example, liberty. Select all checkers so we won't get an incomplete feature
 247# dump file.
 248ifeq ($(config),1)
 249ifdef MAKECMDGOALS
 250ifeq ($(filter feature-dump,$(MAKECMDGOALS)),feature-dump)
 251FEATURE_TESTS := all
 252endif
 253endif
 254include Makefile.config
 255endif
 256
 257ifeq ($(config),0)
 258include $(srctree)/tools/scripts/Makefile.arch
 259-include arch/$(SRCARCH)/Makefile
 260endif
 261
 262# The FEATURE_DUMP_EXPORT holds location of the actual
 263# FEATURE_DUMP file to be used to bypass feature detection
 264# (for bpf or any other subproject)
 265ifeq ($(FEATURES_DUMP),)
 266FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP)
 267else
 268FEATURE_DUMP_EXPORT := $(realpath $(FEATURES_DUMP))
 269endif
 270
 271export prefix bindir sharedir sysconfdir DESTDIR
 272
 273# sparse is architecture-neutral, which means that we need to tell it
 274# explicitly what architecture to check for. Fix this up for yours..
 275SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__
 276
 277# Guard against environment variables
 278PYRF_OBJS =
 279SCRIPT_SH =
 280
 281SCRIPT_SH += perf-archive.sh
 282SCRIPT_SH += perf-with-kcore.sh
 283
 284grep-libs = $(filter -l%,$(1))
 285strip-libs = $(filter-out -l%,$(1))
 286
 287ifneq ($(OUTPUT),)
 288  TE_PATH=$(OUTPUT)
 289  PLUGINS_PATH=$(OUTPUT)
 290  BPF_PATH=$(OUTPUT)
 291  SUBCMD_PATH=$(OUTPUT)
 292  LIBPERF_PATH=$(OUTPUT)
 293ifneq ($(subdir),)
 294  API_PATH=$(OUTPUT)/../lib/api/
 295else
 296  API_PATH=$(OUTPUT)
 297endif
 298else
 299  TE_PATH=$(TRACE_EVENT_DIR)
 300  PLUGINS_PATH=$(TRACE_EVENT_DIR)plugins/
 301  API_PATH=$(LIB_DIR)
 302  BPF_PATH=$(BPF_DIR)
 303  SUBCMD_PATH=$(SUBCMD_DIR)
 304  LIBPERF_PATH=$(LIBPERF_DIR)
 305endif
 306
 307LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
 308export LIBTRACEEVENT
 309
 310LIBTRACEEVENT_DYNAMIC_LIST = $(PLUGINS_PATH)libtraceevent-dynamic-list
 311
 312#
 313# The static build has no dynsym table, so this does not work for
 314# static build. Looks like linker starts to scream about that now
 315# (in Fedora 26) so we need to switch it off for static build.
 316DYNAMIC_LIST_LDFLAGS               = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST)
 317LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = $(if $(findstring -static,$(LDFLAGS)),,$(DYNAMIC_LIST_LDFLAGS))
 318
 319LIBAPI = $(API_PATH)libapi.a
 320export LIBAPI
 321
 322LIBBPF = $(BPF_PATH)libbpf.a
 323
 324LIBSUBCMD = $(SUBCMD_PATH)libsubcmd.a
 325
 326LIBPERF = $(LIBPERF_PATH)libperf.a
 327export LIBPERF
 328
 329# python extension build directories
 330PYTHON_EXTBUILD     := $(OUTPUT)python_ext_build/
 331PYTHON_EXTBUILD_LIB := $(PYTHON_EXTBUILD)lib/
 332PYTHON_EXTBUILD_TMP := $(PYTHON_EXTBUILD)tmp/
 333export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP
 334
 335python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf*.so
 336
 337PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
 338PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI)
 339
 
 
 
 
 
 
 
 
 
 
 340SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
 341
 342PROGRAMS += $(OUTPUT)perf
 343
 344ifndef NO_PERF_READ_VDSO32
 345PROGRAMS += $(OUTPUT)perf-read-vdso32
 346endif
 347
 348ifndef NO_PERF_READ_VDSOX32
 349PROGRAMS += $(OUTPUT)perf-read-vdsox32
 350endif
 351
 352LIBJVMTI = libperf-jvmti.so
 353
 354ifndef NO_JVMTI
 355PROGRAMS += $(OUTPUT)$(LIBJVMTI)
 356endif
 357
 358# what 'all' will build and 'install' will install, in perfexecdir
 359ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
 360
 361# what 'all' will build but not install in perfexecdir
 362OTHER_PROGRAMS = $(OUTPUT)perf
 363
 364# Set paths to tools early so that they can be used for version tests.
 365ifndef SHELL_PATH
 366  SHELL_PATH = /bin/sh
 367endif
 368ifndef PERL_PATH
 369  PERL_PATH = /usr/bin/perl
 370endif
 371
 372export PERL_PATH
 373
 374PERFLIBS = $(LIBAPI) $(LIBTRACEEVENT) $(LIBSUBCMD) $(LIBPERF)
 
 
 375ifndef NO_LIBBPF
 376  ifndef LIBBPF_DYNAMIC
 377    PERFLIBS += $(LIBBPF)
 378  endif
 379endif
 380
 381# We choose to avoid "if .. else if .. else .. endif endif"
 382# because maintaining the nesting to match is a pain.  If
 383# we had "elif" things would have been much nicer...
 384
 
 
 385ifneq ($(OUTPUT),)
 386  CFLAGS += -I$(OUTPUT)
 387endif
 388
 389ifndef NO_GTK2
 390  ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so
 391  GTK_IN := $(OUTPUT)gtk-in.o
 
 
 
 
 
 392endif
 393
 394ifdef ASCIIDOC8
 395  export ASCIIDOC8
 396endif
 397
 398EXTLIBS := $(call filter-out,$(EXCLUDE_EXTLIBS),$(EXTLIBS))
 399LIBS = -Wl,--whole-archive $(PERFLIBS) $(EXTRA_PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
 400
 401ifeq ($(USE_CLANG), 1)
 402  CLANGLIBS_LIST = AST Basic CodeGen Driver Frontend Lex Tooling Edit Sema Analysis Parse Serialization
 403  CLANGLIBS_NOEXT_LIST = $(foreach l,$(CLANGLIBS_LIST),$(shell $(LLVM_CONFIG) --libdir)/libclang$(l))
 404  LIBCLANG = $(foreach l,$(CLANGLIBS_NOEXT_LIST),$(wildcard $(l).a $(l).so))
 405  LIBS += -Wl,--start-group $(LIBCLANG) -Wl,--end-group
 406endif
 407
 408ifeq ($(USE_LLVM), 1)
 409  LIBLLVM = $(shell $(LLVM_CONFIG) --libs all) $(shell $(LLVM_CONFIG) --system-libs)
 410  LIBS += -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM)
 411endif
 412
 413ifeq ($(USE_CXX), 1)
 414  LIBS += -lstdc++
 415endif
 416
 417export INSTALL SHELL_PATH
 418
 419### Build rules
 420
 421SHELL = $(SHELL_PATH)
 422
 423beauty_linux_dir := $(srctree)/tools/perf/trace/beauty/include/linux/
 424linux_uapi_dir := $(srctree)/tools/include/uapi/linux
 425asm_generic_uapi_dir := $(srctree)/tools/include/uapi/asm-generic
 426arch_asm_uapi_dir := $(srctree)/tools/arch/$(SRCARCH)/include/uapi/asm/
 427x86_arch_asm_uapi_dir := $(srctree)/tools/arch/x86/include/uapi/asm/
 428x86_arch_asm_dir := $(srctree)/tools/arch/x86/include/asm/
 429
 430beauty_outdir := $(OUTPUT)trace/beauty/generated
 431beauty_ioctl_outdir := $(beauty_outdir)/ioctl
 432drm_ioctl_array := $(beauty_ioctl_outdir)/drm_ioctl_array.c
 433drm_hdr_dir := $(srctree)/tools/include/uapi/drm
 434drm_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/drm_ioctl.sh
 435
 436# Create output directory if not already present
 437_dummy := $(shell [ -d '$(beauty_ioctl_outdir)' ] || mkdir -p '$(beauty_ioctl_outdir)')
 438
 439$(drm_ioctl_array): $(drm_hdr_dir)/drm.h $(drm_hdr_dir)/i915_drm.h $(drm_ioctl_tbl)
 440	$(Q)$(SHELL) '$(drm_ioctl_tbl)' $(drm_hdr_dir) > $@
 441
 442fadvise_advice_array := $(beauty_outdir)/fadvise_advice_array.c
 443fadvise_advice_tbl := $(srctree)/tools/perf/trace/beauty/fadvise.sh
 444
 445$(fadvise_advice_array): $(linux_uapi_dir)/in.h $(fadvise_advice_tbl)
 446	$(Q)$(SHELL) '$(fadvise_advice_tbl)' $(linux_uapi_dir) > $@
 447
 448fsmount_arrays := $(beauty_outdir)/fsmount_arrays.c
 449fsmount_tbls := $(srctree)/tools/perf/trace/beauty/fsmount.sh
 450
 451$(fsmount_arrays): $(linux_uapi_dir)/fs.h $(fsmount_tbls)
 452	$(Q)$(SHELL) '$(fsmount_tbls)' $(linux_uapi_dir) > $@
 453
 454fspick_arrays := $(beauty_outdir)/fspick_arrays.c
 455fspick_tbls := $(srctree)/tools/perf/trace/beauty/fspick.sh
 456
 457$(fspick_arrays): $(linux_uapi_dir)/fs.h $(fspick_tbls)
 458	$(Q)$(SHELL) '$(fspick_tbls)' $(linux_uapi_dir) > $@
 459
 460fsconfig_arrays := $(beauty_outdir)/fsconfig_arrays.c
 461fsconfig_tbls := $(srctree)/tools/perf/trace/beauty/fsconfig.sh
 462
 463$(fsconfig_arrays): $(linux_uapi_dir)/fs.h $(fsconfig_tbls)
 464	$(Q)$(SHELL) '$(fsconfig_tbls)' $(linux_uapi_dir) > $@
 465
 466pkey_alloc_access_rights_array := $(beauty_outdir)/pkey_alloc_access_rights_array.c
 467asm_generic_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/
 468pkey_alloc_access_rights_tbl := $(srctree)/tools/perf/trace/beauty/pkey_alloc_access_rights.sh
 469
 470$(pkey_alloc_access_rights_array): $(asm_generic_hdr_dir)/mman-common.h $(pkey_alloc_access_rights_tbl)
 471	$(Q)$(SHELL) '$(pkey_alloc_access_rights_tbl)' $(asm_generic_hdr_dir) > $@
 472
 473sndrv_ctl_ioctl_array := $(beauty_ioctl_outdir)/sndrv_ctl_ioctl_array.c
 474sndrv_ctl_hdr_dir := $(srctree)/tools/include/uapi/sound
 475sndrv_ctl_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/sndrv_ctl_ioctl.sh
 476
 477$(sndrv_ctl_ioctl_array): $(sndrv_ctl_hdr_dir)/asound.h $(sndrv_ctl_ioctl_tbl)
 478	$(Q)$(SHELL) '$(sndrv_ctl_ioctl_tbl)' $(sndrv_ctl_hdr_dir) > $@
 479
 480sndrv_pcm_ioctl_array := $(beauty_ioctl_outdir)/sndrv_pcm_ioctl_array.c
 481sndrv_pcm_hdr_dir := $(srctree)/tools/include/uapi/sound
 482sndrv_pcm_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/sndrv_pcm_ioctl.sh
 483
 484$(sndrv_pcm_ioctl_array): $(sndrv_pcm_hdr_dir)/asound.h $(sndrv_pcm_ioctl_tbl)
 485	$(Q)$(SHELL) '$(sndrv_pcm_ioctl_tbl)' $(sndrv_pcm_hdr_dir) > $@
 486
 487kcmp_type_array := $(beauty_outdir)/kcmp_type_array.c
 488kcmp_hdr_dir := $(srctree)/tools/include/uapi/linux/
 489kcmp_type_tbl := $(srctree)/tools/perf/trace/beauty/kcmp_type.sh
 490
 491$(kcmp_type_array): $(kcmp_hdr_dir)/kcmp.h $(kcmp_type_tbl)
 492	$(Q)$(SHELL) '$(kcmp_type_tbl)' $(kcmp_hdr_dir) > $@
 493
 494kvm_ioctl_array := $(beauty_ioctl_outdir)/kvm_ioctl_array.c
 495kvm_hdr_dir := $(srctree)/tools/include/uapi/linux
 496kvm_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/kvm_ioctl.sh
 497
 498$(kvm_ioctl_array): $(kvm_hdr_dir)/kvm.h $(kvm_ioctl_tbl)
 499	$(Q)$(SHELL) '$(kvm_ioctl_tbl)' $(kvm_hdr_dir) > $@
 500
 501socket_ipproto_array := $(beauty_outdir)/socket_ipproto_array.c
 502socket_ipproto_tbl := $(srctree)/tools/perf/trace/beauty/socket_ipproto.sh
 503
 504$(socket_ipproto_array): $(linux_uapi_dir)/in.h $(socket_ipproto_tbl)
 505	$(Q)$(SHELL) '$(socket_ipproto_tbl)' $(linux_uapi_dir) > $@
 506
 507socket_arrays := $(beauty_outdir)/socket_arrays.c
 508socket_tbl := $(srctree)/tools/perf/trace/beauty/socket.sh
 509
 510$(socket_arrays): $(beauty_linux_dir)/socket.h $(socket_tbl)
 511	$(Q)$(SHELL) '$(socket_tbl)' $(beauty_linux_dir) > $@
 512
 513vhost_virtio_ioctl_array := $(beauty_ioctl_outdir)/vhost_virtio_ioctl_array.c
 514vhost_virtio_hdr_dir := $(srctree)/tools/include/uapi/linux
 515vhost_virtio_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/vhost_virtio_ioctl.sh
 516
 517$(vhost_virtio_ioctl_array): $(vhost_virtio_hdr_dir)/vhost.h $(vhost_virtio_ioctl_tbl)
 518	$(Q)$(SHELL) '$(vhost_virtio_ioctl_tbl)' $(vhost_virtio_hdr_dir) > $@
 519
 520perf_ioctl_array := $(beauty_ioctl_outdir)/perf_ioctl_array.c
 521perf_hdr_dir := $(srctree)/tools/include/uapi/linux
 522perf_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/perf_ioctl.sh
 523
 524$(perf_ioctl_array): $(perf_hdr_dir)/perf_event.h $(perf_ioctl_tbl)
 525	$(Q)$(SHELL) '$(perf_ioctl_tbl)' $(perf_hdr_dir) > $@
 526
 527madvise_behavior_array := $(beauty_outdir)/madvise_behavior_array.c
 528madvise_hdr_dir := $(srctree)/tools/include/uapi/asm-generic/
 529madvise_behavior_tbl := $(srctree)/tools/perf/trace/beauty/madvise_behavior.sh
 530
 531$(madvise_behavior_array): $(madvise_hdr_dir)/mman-common.h $(madvise_behavior_tbl)
 532	$(Q)$(SHELL) '$(madvise_behavior_tbl)' $(madvise_hdr_dir) > $@
 533
 534mmap_flags_array := $(beauty_outdir)/mmap_flags_array.c
 535mmap_flags_tbl := $(srctree)/tools/perf/trace/beauty/mmap_flags.sh
 536
 537$(mmap_flags_array): $(linux_uapi_dir)/mman.h $(asm_generic_uapi_dir)/mman.h $(asm_generic_uapi_dir)/mman-common.h $(mmap_flags_tbl)
 538	$(Q)$(SHELL) '$(mmap_flags_tbl)' $(linux_uapi_dir) $(asm_generic_uapi_dir) $(arch_asm_uapi_dir) > $@
 539
 540mount_flags_array := $(beauty_outdir)/mount_flags_array.c
 541mount_flags_tbl := $(srctree)/tools/perf/trace/beauty/mount_flags.sh
 542
 543$(mount_flags_array): $(linux_uapi_dir)/fs.h $(mount_flags_tbl)
 544	$(Q)$(SHELL) '$(mount_flags_tbl)' $(linux_uapi_dir) > $@
 545
 546move_mount_flags_array := $(beauty_outdir)/move_mount_flags_array.c
 547move_mount_flags_tbl := $(srctree)/tools/perf/trace/beauty/move_mount_flags.sh
 548
 549$(move_mount_flags_array): $(linux_uapi_dir)/fs.h $(move_mount_flags_tbl)
 550	$(Q)$(SHELL) '$(move_mount_flags_tbl)' $(linux_uapi_dir) > $@
 551
 552prctl_option_array := $(beauty_outdir)/prctl_option_array.c
 553prctl_hdr_dir := $(srctree)/tools/include/uapi/linux/
 554prctl_option_tbl := $(srctree)/tools/perf/trace/beauty/prctl_option.sh
 555
 556$(prctl_option_array): $(prctl_hdr_dir)/prctl.h $(prctl_option_tbl)
 557	$(Q)$(SHELL) '$(prctl_option_tbl)' $(prctl_hdr_dir) > $@
 558
 559usbdevfs_ioctl_array := $(beauty_ioctl_outdir)/usbdevfs_ioctl_array.c
 560usbdevfs_ioctl_tbl := $(srctree)/tools/perf/trace/beauty/usbdevfs_ioctl.sh
 561
 562$(usbdevfs_ioctl_array): $(linux_uapi_dir)/usbdevice_fs.h $(usbdevfs_ioctl_tbl)
 563	$(Q)$(SHELL) '$(usbdevfs_ioctl_tbl)' $(linux_uapi_dir) > $@
 564
 565x86_arch_prctl_code_array := $(beauty_outdir)/x86_arch_prctl_code_array.c
 566x86_arch_prctl_code_tbl := $(srctree)/tools/perf/trace/beauty/x86_arch_prctl.sh
 567
 568$(x86_arch_prctl_code_array): $(x86_arch_asm_uapi_dir)/prctl.h $(x86_arch_prctl_code_tbl)
 569	$(Q)$(SHELL) '$(x86_arch_prctl_code_tbl)' $(x86_arch_asm_uapi_dir) > $@
 570
 571x86_arch_irq_vectors_array := $(beauty_outdir)/x86_arch_irq_vectors_array.c
 572x86_arch_irq_vectors_tbl := $(srctree)/tools/perf/trace/beauty/tracepoints/x86_irq_vectors.sh
 573
 574$(x86_arch_irq_vectors_array): $(x86_arch_asm_dir)/irq_vectors.h $(x86_arch_irq_vectors_tbl)
 575	$(Q)$(SHELL) '$(x86_arch_irq_vectors_tbl)' $(x86_arch_asm_dir) > $@
 576
 577x86_arch_MSRs_array := $(beauty_outdir)/x86_arch_MSRs_array.c
 578x86_arch_MSRs_tbl := $(srctree)/tools/perf/trace/beauty/tracepoints/x86_msr.sh
 579
 580$(x86_arch_MSRs_array): $(x86_arch_asm_dir)/msr-index.h $(x86_arch_MSRs_tbl)
 581	$(Q)$(SHELL) '$(x86_arch_MSRs_tbl)' $(x86_arch_asm_dir) > $@
 582
 583rename_flags_array := $(beauty_outdir)/rename_flags_array.c
 584rename_flags_tbl := $(srctree)/tools/perf/trace/beauty/rename_flags.sh
 585
 586$(rename_flags_array): $(linux_uapi_dir)/fs.h $(rename_flags_tbl)
 587	$(Q)$(SHELL) '$(rename_flags_tbl)' $(linux_uapi_dir) > $@
 588
 589arch_errno_name_array := $(beauty_outdir)/arch_errno_name_array.c
 590arch_errno_hdr_dir := $(srctree)/tools
 591arch_errno_tbl := $(srctree)/tools/perf/trace/beauty/arch_errno_names.sh
 592
 593$(arch_errno_name_array): $(arch_errno_tbl)
 594	$(Q)$(SHELL) '$(arch_errno_tbl)' $(firstword $(CC)) $(arch_errno_hdr_dir) > $@
 595
 596sync_file_range_arrays := $(beauty_outdir)/sync_file_range_arrays.c
 597sync_file_range_tbls := $(srctree)/tools/perf/trace/beauty/sync_file_range.sh
 598
 599$(sync_file_range_arrays): $(linux_uapi_dir)/fs.h $(sync_file_range_tbls)
 600	$(Q)$(SHELL) '$(sync_file_range_tbls)' $(linux_uapi_dir) > $@
 601
 602all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
 603
 604# Create python binding output directory if not already present
 605_dummy := $(shell [ -d '$(OUTPUT)python' ] || mkdir -p '$(OUTPUT)python')
 606
 607$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) $(LIBPERF)
 608	$(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \
 609        CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \
 610	  $(PYTHON_WORD) util/setup.py \
 611	  --quiet build_ext; \
 612	cp $(PYTHON_EXTBUILD_LIB)perf*.so $(OUTPUT)python/
 613
 614please_set_SHELL_PATH_to_a_more_modern_shell:
 615	$(Q)$$(:)
 616
 617shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell
 618
 619strip: $(PROGRAMS) $(OUTPUT)perf
 620	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) $(OUTPUT)perf
 621
 622PERF_IN := $(OUTPUT)perf-in.o
 623
 624JEVENTS       := $(OUTPUT)pmu-events/jevents
 625JEVENTS_IN    := $(OUTPUT)pmu-events/jevents-in.o
 626
 627PMU_EVENTS_IN := $(OUTPUT)pmu-events/pmu-events-in.o
 628
 629export JEVENTS
 630
 631build := -f $(srctree)/tools/build/Makefile.build dir=. obj
 632
 633$(PERF_IN): prepare FORCE
 634	$(Q)$(MAKE) $(build)=perf
 635
 636$(JEVENTS_IN): FORCE
 637	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=jevents
 638
 639$(JEVENTS): $(JEVENTS_IN)
 640	$(QUIET_LINK)$(HOSTCC) $(JEVENTS_IN) -o $@
 641
 642$(PMU_EVENTS_IN): $(JEVENTS) FORCE
 643	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events
 644
 645$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST)
 646	$(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \
 647		$(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@
 648
 649$(GTK_IN): FORCE
 650	$(Q)$(MAKE) $(build)=gtk
 651
 652$(OUTPUT)libperf-gtk.so: $(GTK_IN) $(PERFLIBS)
 653	$(QUIET_LINK)$(CC) -o $@ -shared $(LDFLAGS) $(filter %.o,$^) $(GTK_LIBS)
 654
 655$(OUTPUT)common-cmds.h: util/generate-cmdlist.sh command-list.txt
 656
 657$(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt)
 658	$(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@
 659
 660$(SCRIPTS) : % : %.sh
 661	$(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
 662
 663$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD
 664	$(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
 665	$(Q)touch $(OUTPUT)PERF-VERSION-FILE
 666
 667# These can record PERF_VERSION
 668perf.spec $(SCRIPTS) \
 669	: $(OUTPUT)PERF-VERSION-FILE
 670
 671.SUFFIXES:
 672
 673#
 674# If a target does not match any of the later rules then prefix it by $(OUTPUT)
 675# This makes targets like 'make O=/tmp/perf perf.o' work in a natural way.
 676#
 677ifneq ($(OUTPUT),)
 678%.o: $(OUTPUT)%.o
 679	@echo "    # Redirected target $@ => $(OUTPUT)$@"
 680pmu-events/%.o: $(OUTPUT)pmu-events/%.o
 681	@echo "    # Redirected target $@ => $(OUTPUT)$@"
 682util/%.o: $(OUTPUT)util/%.o
 683	@echo "    # Redirected target $@ => $(OUTPUT)$@"
 684bench/%.o: $(OUTPUT)bench/%.o
 685	@echo "    # Redirected target $@ => $(OUTPUT)$@"
 686tests/%.o: $(OUTPUT)tests/%.o
 687	@echo "    # Redirected target $@ => $(OUTPUT)$@"
 688endif
 689
 690# These two need to be here so that when O= is not used they take precedence
 691# over the general rule for .o
 692
 693# get relative building directory (to $(OUTPUT))
 694# and '.' if it's $(OUTPUT) itself
 695__build-dir = $(subst $(OUTPUT),,$(dir $@))
 696build-dir   = $(if $(__build-dir),$(__build-dir),.)
 697
 698prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders $(drm_ioctl_array) \
 699	$(fadvise_advice_array) \
 700	$(fsconfig_arrays) \
 701	$(fsmount_arrays) \
 702	$(fspick_arrays) \
 703	$(pkey_alloc_access_rights_array) \
 704	$(sndrv_pcm_ioctl_array) \
 705	$(sndrv_ctl_ioctl_array) \
 706	$(kcmp_type_array) \
 707	$(kvm_ioctl_array) \
 708	$(socket_ipproto_array) \
 709	$(socket_arrays) \
 710	$(vhost_virtio_ioctl_array) \
 711	$(madvise_behavior_array) \
 712	$(mmap_flags_array) \
 713	$(mount_flags_array) \
 714	$(move_mount_flags_array) \
 715	$(perf_ioctl_array) \
 716	$(prctl_option_array) \
 717	$(usbdevfs_ioctl_array) \
 718	$(x86_arch_irq_vectors_array) \
 719	$(x86_arch_MSRs_array) \
 720	$(x86_arch_prctl_code_array) \
 721	$(rename_flags_array) \
 722	$(arch_errno_name_array) \
 723	$(sync_file_range_arrays)
 724
 725$(OUTPUT)%.o: %.c prepare FORCE
 726	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 727
 728$(OUTPUT)%.i: %.c prepare FORCE
 729	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 730
 731$(OUTPUT)%.s: %.c prepare FORCE
 732	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 733
 734$(OUTPUT)%-bison.o: %.c prepare FORCE
 735	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 736
 737$(OUTPUT)%-flex.o: %.c prepare FORCE
 738	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 739
 740$(OUTPUT)%.o: %.S prepare FORCE
 741	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 742
 743$(OUTPUT)%.i: %.S prepare FORCE
 744	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@
 745
 746$(OUTPUT)perf-%: %.o $(PERFLIBS)
 747	$(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(filter %.o,$^) $(LIBS)
 748
 749ifndef NO_PERF_READ_VDSO32
 750$(OUTPUT)perf-read-vdso32: perf-read-vdso.c util/find-map.c
 751	$(QUIET_CC)$(CC) -m32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
 752endif
 753
 754ifndef NO_PERF_READ_VDSOX32
 755$(OUTPUT)perf-read-vdsox32: perf-read-vdso.c util/find-map.c
 756	$(QUIET_CC)$(CC) -mx32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c
 757endif
 758
 759ifndef NO_JVMTI
 760LIBJVMTI_IN := $(OUTPUT)jvmti/jvmti-in.o
 761
 762$(LIBJVMTI_IN): FORCE
 763	$(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=jvmti obj=jvmti
 764
 765$(OUTPUT)$(LIBJVMTI): $(LIBJVMTI_IN)
 766	$(QUIET_LINK)$(CC) $(LDFLAGS) -shared -Wl,-soname -Wl,$(LIBJVMTI) -o $@ $<
 767endif
 768
 769$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h)
 
 770
 771LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 'EXTRA_CFLAGS=$(EXTRA_CFLAGS)' 'LDFLAGS=$(LDFLAGS)'
 772
 773$(LIBTRACEEVENT): FORCE
 774	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a
 775
 776libtraceevent_plugins: FORCE
 777	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR)plugins $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) plugins
 778
 779$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins
 780	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR)plugins $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent-dynamic-list
 781
 782$(LIBTRACEEVENT)-clean:
 783	$(call QUIET_CLEAN, libtraceevent)
 784	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) O=$(OUTPUT) clean >/dev/null
 785
 786install-traceevent-plugins: libtraceevent_plugins
 787	$(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) install_plugins
 788
 789$(LIBAPI): FORCE
 790	$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a
 791
 792$(LIBAPI)-clean:
 793	$(call QUIET_CLEAN, libapi)
 794	$(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null
 795
 796$(LIBBPF): FORCE
 797	$(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) $(OUTPUT)libbpf.a FEATURES_DUMP=$(FEATURE_DUMP_EXPORT)
 798
 799$(LIBBPF)-clean:
 800	$(call QUIET_CLEAN, libbpf)
 801	$(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) clean >/dev/null
 802
 803$(LIBPERF): FORCE
 804	$(Q)$(MAKE) -C $(LIBPERF_DIR) EXTRA_CFLAGS="$(LIBPERF_CFLAGS)" O=$(OUTPUT) $(OUTPUT)libperf.a
 805
 806$(LIBPERF)-clean:
 807	$(call QUIET_CLEAN, libperf)
 808	$(Q)$(MAKE) -C $(LIBPERF_DIR) O=$(OUTPUT) clean >/dev/null
 809
 810$(LIBSUBCMD): FORCE
 811	$(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) $(OUTPUT)libsubcmd.a
 812
 813$(LIBSUBCMD)-clean:
 
 814	$(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) clean
 815
 816help:
 817	@echo 'Perf make targets:'
 818	@echo '  doc		- make *all* documentation (see below)'
 819	@echo '  man		- make manpage documentation (access with man <foo>)'
 820	@echo '  html		- make html documentation'
 821	@echo '  info		- make GNU info documentation (access with info <foo>)'
 822	@echo '  pdf		- make pdf documentation'
 823	@echo '  TAGS		- use etags to make tag information for source browsing'
 824	@echo '  tags		- use ctags to make tag information for source browsing'
 825	@echo '  cscope	- use cscope to make interactive browsing database'
 826	@echo ''
 827	@echo 'Perf install targets:'
 828	@echo '  NOTE: documentation build requires asciidoc, xmlto packages to be installed'
 829	@echo '  HINT: use "prefix" or "DESTDIR" to install to a particular'
 830	@echo '        path like "make prefix=/usr/local install install-doc"'
 831	@echo '  install	- install compiled binaries'
 832	@echo '  install-doc	- install *all* documentation'
 833	@echo '  install-man	- install manpage documentation'
 834	@echo '  install-html	- install html documentation'
 835	@echo '  install-info	- install GNU info documentation'
 836	@echo '  install-pdf	- install pdf documentation'
 837	@echo ''
 838	@echo '  quick-install-doc	- alias for quick-install-man'
 839	@echo '  quick-install-man	- install the documentation quickly'
 840	@echo '  quick-install-html	- install the html documentation quickly'
 841	@echo ''
 842	@echo 'Perf maintainer targets:'
 843	@echo '  clean			- clean all binary objects and build output'
 844
 845
 846DOC_TARGETS := doc man html info pdf
 847
 848INSTALL_DOC_TARGETS := $(patsubst %,install-%,$(DOC_TARGETS)) try-install-man
 849INSTALL_DOC_TARGETS += quick-install-doc quick-install-man quick-install-html
 850
 851# 'make doc' should call 'make -C Documentation all'
 852$(DOC_TARGETS):
 853	$(Q)$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) $(@:doc=all) ASCIIDOC_EXTRA=$(ASCIIDOC_EXTRA)
 854
 855TAG_FOLDERS= . ../lib ../include
 856TAG_FILES= ../../include/uapi/linux/perf_event.h
 857
 858TAGS:
 859	$(QUIET_GEN)$(RM) TAGS; \
 860	$(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print -o -name '*.cpp' -print | xargs etags -a $(TAG_FILES)
 861
 862tags:
 863	$(QUIET_GEN)$(RM) tags; \
 864	$(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print -o -name '*.cpp' -print | xargs ctags -a $(TAG_FILES)
 865
 866cscope:
 867	$(QUIET_GEN)$(RM) cscope*; \
 868	$(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print -o -name '*.cpp' -print | xargs cscope -b $(TAG_FILES)
 869
 870### Testing rules
 871
 872# GNU make supports exporting all variables by "export" without parameters.
 873# However, the environment gets quite big, and some programs have problems
 874# with that.
 875
 876check: $(OUTPUT)common-cmds.h
 877	if sparse; \
 878	then \
 879		for i in *.c */*.c; \
 880		do \
 881			sparse $(CFLAGS) $(SPARSE_FLAGS) $$i || exit; \
 882		done; \
 883	else \
 884		exit 1; \
 885	fi
 886
 887### Installation rules
 888
 889ifndef NO_GTK2
 890install-gtk: $(OUTPUT)libperf-gtk.so
 891	$(call QUIET_INSTALL, 'GTK UI') \
 892		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
 893		$(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)'
 894else
 895install-gtk:
 896endif
 897
 898install-tools: all install-gtk
 899	$(call QUIET_INSTALL, binaries) \
 900		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'; \
 901		$(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'; \
 902		$(LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf' '$(DESTDIR_SQ)$(bindir_SQ)/trace'
 903ifndef NO_PERF_READ_VDSO32
 904	$(call QUIET_INSTALL, perf-read-vdso32) \
 905		$(INSTALL) $(OUTPUT)perf-read-vdso32 '$(DESTDIR_SQ)$(bindir_SQ)';
 906endif
 907ifndef NO_PERF_READ_VDSOX32
 908	$(call QUIET_INSTALL, perf-read-vdsox32) \
 909		$(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)';
 910endif
 911ifndef NO_JVMTI
 912	$(call QUIET_INSTALL, $(LIBJVMTI)) \
 913		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \
 914		$(INSTALL) $(OUTPUT)$(LIBJVMTI) '$(DESTDIR_SQ)$(libdir_SQ)';
 915endif
 916	$(call QUIET_INSTALL, libexec) \
 917		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
 918ifndef NO_LIBBPF
 919	$(call QUIET_INSTALL, bpf-headers) \
 920		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf'; \
 921		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf/linux'; \
 922		$(INSTALL) include/bpf/*.h -t '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf'; \
 923		$(INSTALL) include/bpf/linux/*.h -t '$(DESTDIR_SQ)$(perf_include_instdir_SQ)/bpf/linux'
 924	$(call QUIET_INSTALL, bpf-examples) \
 925		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perf_examples_instdir_SQ)/bpf'; \
 926		$(INSTALL) examples/bpf/*.c -t '$(DESTDIR_SQ)$(perf_examples_instdir_SQ)/bpf'
 927endif
 928	$(call QUIET_INSTALL, perf-archive) \
 929		$(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
 930	$(call QUIET_INSTALL, perf-with-kcore) \
 931		$(INSTALL) $(OUTPUT)perf-with-kcore -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
 932ifndef NO_LIBAUDIT
 933	$(call QUIET_INSTALL, strace/groups) \
 934		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)'; \
 935		$(INSTALL) trace/strace/groups/* -t '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)'
 936endif
 937ifndef NO_LIBPERL
 938	$(call QUIET_INSTALL, perl-scripts) \
 939		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \
 940		$(INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \
 941		$(INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'; \
 942		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'; \
 943		$(INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
 944endif
 945ifndef NO_LIBPYTHON
 946	$(call QUIET_INSTALL, python-scripts) \
 947		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \
 948		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'; \
 949		$(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -m 644 -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \
 950		$(INSTALL) scripts/python/*.py -m 644 -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python'; \
 951		$(INSTALL) scripts/python/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
 952endif
 953	$(call QUIET_INSTALL, perf_completion-script) \
 954		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'; \
 955		$(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf'
 956	$(call QUIET_INSTALL, perf-tip) \
 957		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(tip_instdir_SQ)'; \
 958		$(INSTALL) Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)'
 959
 960install-tests: all install-gtk
 961	$(call QUIET_INSTALL, tests) \
 962		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
 963		$(INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \
 964		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
 965		$(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \
 966		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell'; \
 967		$(INSTALL) tests/shell/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell'; \
 968		$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/lib'; \
 969		$(INSTALL) tests/shell/lib/*.sh '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/shell/lib'
 970
 971install-bin: install-tools install-tests install-traceevent-plugins
 972
 973install: install-bin try-install-man
 974
 975install-python_ext:
 976	$(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)'
 977
 978# 'make install-doc' should call 'make -C Documentation install'
 979$(INSTALL_DOC_TARGETS):
 980	$(Q)$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) $(@:-doc=) ASCIIDOC_EXTRA=$(ASCIIDOC_EXTRA)
 981
 982### Cleaning rules
 983
 984#
 985# This is here, not in Makefile.config, because Makefile.config does
 986# not get included for the clean target:
 987#
 988config-clean:
 989	$(call QUIET_CLEAN, config)
 990	$(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null
 991
 992python-clean:
 993	$(python-clean)
 994
 995clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean $(LIBPERF)-clean config-clean fixdep-clean python-clean
 996	$(call QUIET_CLEAN, core-objs)  $(RM) $(LIBPERF_A) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS)
 997	$(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete
 998	$(Q)$(RM) $(OUTPUT).config-detected
 999	$(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so
1000	$(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* \
1001		$(OUTPUT)util/intel-pt-decoder/inat-tables.c \
1002		$(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \
1003		$(OUTPUT)pmu-events/pmu-events.c \
1004		$(OUTPUT)$(fadvise_advice_array) \
1005		$(OUTPUT)$(fsconfig_arrays) \
1006		$(OUTPUT)$(fsmount_arrays) \
1007		$(OUTPUT)$(fspick_arrays) \
1008		$(OUTPUT)$(madvise_behavior_array) \
1009		$(OUTPUT)$(mmap_flags_array) \
1010		$(OUTPUT)$(mount_flags_array) \
1011		$(OUTPUT)$(move_mount_flags_array) \
1012		$(OUTPUT)$(drm_ioctl_array) \
1013		$(OUTPUT)$(pkey_alloc_access_rights_array) \
1014		$(OUTPUT)$(sndrv_ctl_ioctl_array) \
1015		$(OUTPUT)$(sndrv_pcm_ioctl_array) \
1016		$(OUTPUT)$(kvm_ioctl_array) \
1017		$(OUTPUT)$(kcmp_type_array) \
1018		$(OUTPUT)$(socket_ipproto_array) \
1019		$(OUTPUT)$(socket_arrays) \
1020		$(OUTPUT)$(vhost_virtio_ioctl_array) \
1021		$(OUTPUT)$(perf_ioctl_array) \
1022		$(OUTPUT)$(prctl_option_array) \
1023		$(OUTPUT)$(usbdevfs_ioctl_array) \
1024		$(OUTPUT)$(x86_arch_irq_vectors_array) \
1025		$(OUTPUT)$(x86_arch_MSRs_array) \
1026		$(OUTPUT)$(x86_arch_prctl_code_array) \
1027		$(OUTPUT)$(rename_flags_array) \
1028		$(OUTPUT)$(arch_errno_name_array) \
1029		$(OUTPUT)$(sync_file_range_arrays)
1030	$(call QUIET_CLEAN, Documentation) \
1031	$(MAKE) -C $(DOC_DIR) O=$(OUTPUT) clean >/dev/null
1032
1033#
1034# To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY)
1035# file if defined, with no further action.
1036feature-dump:
1037ifdef FEATURE_DUMP_COPY
1038	@cp $(OUTPUT)FEATURE-DUMP $(FEATURE_DUMP_COPY)
1039	@echo "FEATURE-DUMP file copied into $(FEATURE_DUMP_COPY)"
1040else
1041	@echo "FEATURE-DUMP file available in $(OUTPUT)FEATURE-DUMP"
1042endif
1043
1044#
1045# Trick: if ../../.git does not exist - we are building out of tree for example,
1046# then force version regeneration:
1047#
1048ifeq ($(wildcard ../../.git/HEAD),)
1049    GIT-HEAD-PHONY = ../../.git/HEAD
1050else
1051    GIT-HEAD-PHONY =
1052endif
1053
1054FORCE:
1055
1056.PHONY: all install clean config-clean strip install-gtk
1057.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
1058.PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE prepare
1059.PHONY: libtraceevent_plugins archheaders
1060
1061endif # force_fixdep