Makefile 38.5 KB
Newer Older
B
Borislav Petkov 已提交
1
include ../scripts/Makefile.include
2

3
# The default target of this Makefile is...
4
all:
5

6 7
include config/utilities.mak

8
# Define V to have a more verbose compile.
9
#
10 11 12 13 14 15 16 17 18 19
# 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.
#
20 21 22 23 24 25
# 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.
#
26 27 28 29
# 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.
#
30
# Define LDFLAGS=-static to build a static binary.
31 32
#
# Define EXTRA_CFLAGS=-m64 or EXTRA_CFLAGS=-m32 as appropriate for cross-builds.
33 34
#
# Define NO_DWARF if you do not want debug-info analysis feature at all.
35 36
#
# Define WERROR=0 to disable treating any warnings as errors.
37 38 39
#
# Define NO_NEWT if you do not want TUI support.
#
40 41
# Define NO_GTK2 if you do not want GTK+ GUI support.
#
42
# Define NO_DEMANGLE if you do not want C++ symbol demangling.
43 44 45
#
# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds)
#
46 47
# Define NO_LIBUNWIND if you do not want libunwind dependency for dwarf
# backtrace post unwind.
48 49
#
# Define NO_BACKTRACE if you do not want stack backtrace debug feature
50 51
#
# Define NO_LIBNUMA if you do not want numa perf benchmark
52

53 54
$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
	@$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
55

56
uname_M := $(shell uname -m 2>/dev/null || echo not)
57

58 59 60 61
ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
				  -e s/arm.*/arm/ -e s/sa110/arm/ \
				  -e s/s390x/s390/ -e s/parisc64/parisc/ \
				  -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \
62
				  -e s/sh[234].*/sh/ -e s/aarch64.*/arm64/ )
63
NO_PERF_REGS := 1
64

65 66 67
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar

68 69
# Additional ARCH settings for x86
ifeq ($(ARCH),i386)
70
	override ARCH := x86
71
	NO_PERF_REGS := 0
72
	LIBUNWIND_LIBS = -lunwind -lunwind-x86
73 74
endif
ifeq ($(ARCH),x86_64)
75
	override ARCH := x86
76 77
	IS_X86_64 := 0
	ifeq (, $(findstring m32,$(EXTRA_CFLAGS)))
J
Jean Delvare 已提交
78
		IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1)
79
	endif
80 81 82
	ifeq (${IS_X86_64}, 1)
		RAW_ARCH := x86_64
		ARCH_CFLAGS := -DARCH_X86_64
83
		ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
84
	endif
85
	NO_PERF_REGS := 0
86
	LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
87 88
endif

89 90 91 92 93
# Treat warnings as errors unless directed not to
ifneq ($(WERROR),0)
	CFLAGS_WERROR := -Werror
endif

94 95 96 97
ifeq ("$(origin DEBUG)", "command line")
  PERF_DEBUG = $(DEBUG)
endif
ifndef PERF_DEBUG
98
  CFLAGS_OPTIMIZE = -O6 -D_FORTIFY_SOURCE=2
99 100
endif

101 102 103 104 105 106
ifdef PARSER_DEBUG
	PARSER_DEBUG_BISON  := -t
	PARSER_DEBUG_FLEX   := -d
	PARSER_DEBUG_CFLAGS := -DPARSER_DEBUG
endif

107
CFLAGS = -fno-omit-frame-pointer -ggdb3 -funwind-tables -Wall -Wextra -std=gnu99 $(CFLAGS_WERROR) $(CFLAGS_OPTIMIZE) $(EXTRA_WARNINGS) $(EXTRA_CFLAGS) $(PARSER_DEBUG_CFLAGS)
108
EXTLIBS = -lpthread -lrt -lelf -lm
109
ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
110 111 112 113
ALL_LDFLAGS = $(LDFLAGS)
STRIP ?= strip

# Among the variables below, these:
114
#   perfexecdir
115 116 117 118
#   template_dir
#   mandir
#   infodir
#   htmldir
119
#   ETC_PERFCONFIG (but not sysconfdir)
120
# can be specified as a relative path some/where/else;
121
# this is interpreted as relative to $(prefix) and "perf" at
122 123 124
# runtime figures out where they are based on the path to the executable.
# This can help installing the suite in a relocatable way.

125 126
# Make the path relative to DESTDIR, not to prefix
ifndef DESTDIR
127
prefix = $(HOME)
128
endif
129 130 131 132
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
mandir = share/man
infodir = share/info
133
perfexecdir = libexec/perf-core
134
sharedir = $(prefix)/share
135 136
template_dir = share/perf-core/templates
htmldir = share/doc/perf-doc
137 138
ifeq ($(prefix),/usr)
sysconfdir = /etc
139
ETC_PERFCONFIG = $(sysconfdir)/perfconfig
140 141
else
sysconfdir = $(prefix)/etc
142
ETC_PERFCONFIG = etc/perfconfig
143 144 145 146 147 148
endif
lib = lib

export prefix bindir sharedir sysconfdir

RM = rm -f
149
MKDIR = mkdir
150 151 152 153 154 155 156
FIND = find
INSTALL = install

# 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__

157
ifneq ($(MAKECMDGOALS),clean)
158
ifneq ($(MAKECMDGOALS),tags)
159
-include config/feature-tests.mak
160

161
ifeq ($(call try-cc,$(SOURCE_HELLO),$(CFLAGS) -Werror -fstack-protector-all,-fstack-protector-all),y)
162
	CFLAGS := $(CFLAGS) -fstack-protector-all
163
endif
164

165
ifeq ($(call try-cc,$(SOURCE_HELLO),$(CFLAGS) -Werror -Wstack-protector,-Wstack-protector),y)
166 167 168
       CFLAGS := $(CFLAGS) -Wstack-protector
endif

169
ifeq ($(call try-cc,$(SOURCE_HELLO),$(CFLAGS) -Werror -Wvolatile-register-var,-Wvolatile-register-var),y)
170 171
       CFLAGS := $(CFLAGS) -Wvolatile-register-var
endif
172 173 174

### --- END CONFIGURATION SECTION ---

175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
ifeq ($(srctree),)
srctree := $(patsubst %/,%,$(dir $(shell pwd)))
srctree := $(patsubst %/,%,$(dir $(srctree)))
#$(info Determined 'srctree' to be $(srctree))
endif

ifneq ($(objtree),)
#$(info Determined 'objtree' to be $(objtree))
endif

ifneq ($(OUTPUT),)
#$(info Determined 'OUTPUT' to be $(OUTPUT))
endif

BASIC_CFLAGS = \
	-Iutil/include \
	-Iarch/$(ARCH)/include \
	$(if $(objtree),-I$(objtree)/arch/$(ARCH)/include/generated/uapi) \
	-I$(srctree)/arch/$(ARCH)/include/uapi \
	-I$(srctree)/arch/$(ARCH)/include \
	$(if $(objtree),-I$(objtree)/include/generated/uapi) \
	-I$(srctree)/include/uapi \
	-I$(srctree)/include \
	-I$(OUTPUT)util \
	-Iutil \
	-I. \
	-I$(TRACE_EVENT_DIR) \
	-D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
I
Ingo Molnar 已提交
203

204 205
BASIC_LDFLAGS =

206
ifeq ($(call try-cc,$(SOURCE_BIONIC),$(CFLAGS),bionic),y)
207 208 209 210 211
	BIONIC := 1
	EXTLIBS := $(filter-out -lrt,$(EXTLIBS))
	EXTLIBS := $(filter-out -lpthread,$(EXTLIBS))
	BASIC_CFLAGS += -I.
endif
212
endif # MAKECMDGOALS != tags
213
endif # MAKECMDGOALS != clean
214

215 216 217 218
# Guard against environment variables
BUILTIN_OBJS =
LIB_H =
LIB_OBJS =
219
PYRF_OBJS =
220 221
SCRIPT_SH =

222
SCRIPT_SH += perf-archive.sh
223

224 225 226
grep-libs = $(filter -l%,$(1))
strip-libs = $(filter-out -l%,$(1))

227 228 229 230 231 232 233 234 235 236 237
TRACE_EVENT_DIR = ../lib/traceevent/

ifneq ($(OUTPUT),)
	TE_PATH=$(OUTPUT)
else
	TE_PATH=$(TRACE_EVENT_DIR)
endif

LIBTRACEEVENT = $(TE_PATH)libtraceevent.a
TE_LIB := -L$(TE_PATH) -ltraceevent

238 239 240 241 242 243 244 245 246 247
export LIBTRACEEVENT

# 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

python-clean := rm -rf $(PYTHON_EXTBUILD) $(OUTPUT)python/perf.so

248 249 250
PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources)
PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py

251
$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS)
252
	$(QUIET_GEN)CFLAGS='$(BASIC_CFLAGS)' $(PYTHON_WORD) util/setup.py \
253 254 255
	  --quiet build_ext; \
	mkdir -p $(OUTPUT)python && \
	cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/
256 257 258 259
#
# No Perl scripts right now:
#

260
SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH))
261

262
#
263
# Single 'perf' binary right now:
264
#
265
PROGRAMS += $(OUTPUT)perf
266

267
LANG_BINDINGS =
268

269
# what 'all' will build and 'install' will install, in perfexecdir
270
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
271

272
# what 'all' will build but not install in perfexecdir
273
OTHER_PROGRAMS = $(OUTPUT)perf
274 275 276 277 278 279 280 281 282 283 284

# Set paths to tools early so that they can be used for version tests.
ifndef SHELL_PATH
	SHELL_PATH = /bin/sh
endif
ifndef PERL_PATH
	PERL_PATH = /usr/bin/perl
endif

export PERL_PATH

285 286
FLEX = flex
BISON= bison
287

E
Eric Sandeen 已提交
288
$(OUTPUT)util/parse-events-flex.c: util/parse-events.l $(OUTPUT)util/parse-events-bison.c
289
	$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/parse-events-flex.h $(PARSER_DEBUG_FLEX) -t util/parse-events.l > $(OUTPUT)util/parse-events-flex.c
290

291
$(OUTPUT)util/parse-events-bison.c: util/parse-events.y
292
	$(QUIET_BISON)$(BISON) -v util/parse-events.y -d $(PARSER_DEBUG_BISON) -o $(OUTPUT)util/parse-events-bison.c
293

E
Eric Sandeen 已提交
294
$(OUTPUT)util/pmu-flex.c: util/pmu.l $(OUTPUT)util/pmu-bison.c
295 296
	$(QUIET_FLEX)$(FLEX) --header-file=$(OUTPUT)util/pmu-flex.h -t util/pmu.l > $(OUTPUT)util/pmu-flex.c

297 298
$(OUTPUT)util/pmu-bison.c: util/pmu.y
	$(QUIET_BISON)$(BISON) -v util/pmu.y -d -o $(OUTPUT)util/pmu-bison.c
299

300 301
$(OUTPUT)util/parse-events.o: $(OUTPUT)util/parse-events-flex.c $(OUTPUT)util/parse-events-bison.c
$(OUTPUT)util/pmu.o: $(OUTPUT)util/pmu-flex.c $(OUTPUT)util/pmu-bison.c
302

303
LIB_FILE=$(OUTPUT)libperf.a
304

I
Ingo Molnar 已提交
305
LIB_H += ../../include/uapi/linux/perf_event.h
306
LIB_H += ../../include/linux/rbtree.h
307
LIB_H += ../../include/linux/list.h
I
Ingo Molnar 已提交
308
LIB_H += ../../include/uapi/linux/const.h
309
LIB_H += ../../include/linux/hash.h
310
LIB_H += ../../include/linux/stringify.h
311 312 313
LIB_H += util/include/linux/bitmap.h
LIB_H += util/include/linux/bitops.h
LIB_H += util/include/linux/compiler.h
314
LIB_H += util/include/linux/const.h
315 316
LIB_H += util/include/linux/ctype.h
LIB_H += util/include/linux/kernel.h
317
LIB_H += util/include/linux/list.h
318
LIB_H += util/include/linux/export.h
319
LIB_H += util/include/linux/magic.h
320 321 322
LIB_H += util/include/linux/poison.h
LIB_H += util/include/linux/prefetch.h
LIB_H += util/include/linux/rbtree.h
323
LIB_H += util/include/linux/rbtree_augmented.h
324
LIB_H += util/include/linux/string.h
325
LIB_H += util/include/linux/types.h
326
LIB_H += util/include/linux/linkage.h
327
LIB_H += util/include/asm/asm-offsets.h
328
LIB_H += util/include/asm/bug.h
329
LIB_H += util/include/asm/byteorder.h
330
LIB_H += util/include/asm/hweight.h
331 332 333
LIB_H += util/include/asm/swab.h
LIB_H += util/include/asm/system.h
LIB_H += util/include/asm/uaccess.h
334
LIB_H += util/include/dwarf-regs.h
335 336
LIB_H += util/include/asm/dwarf2.h
LIB_H += util/include/asm/cpufeature.h
337 338
LIB_H += util/include/asm/unistd_32.h
LIB_H += util/include/asm/unistd_64.h
339
LIB_H += perf.h
340
LIB_H += util/annotate.h
341 342
LIB_H += util/cache.h
LIB_H += util/callchain.h
343
LIB_H += util/build-id.h
344
LIB_H += util/debug.h
345
LIB_H += util/debugfs.h
346
LIB_H += util/sysfs.h
347
LIB_H += util/pmu.h
348
LIB_H += util/event.h
349
LIB_H += util/evsel.h
350
LIB_H += util/evlist.h
351
LIB_H += util/exec_cmd.h
352
LIB_H += util/types.h
353
LIB_H += util/levenshtein.h
354
LIB_H += util/machine.h
355
LIB_H += util/map.h
356
LIB_H += util/parse-options.h
357
LIB_H += util/parse-events.h
358 359
LIB_H += util/quote.h
LIB_H += util/util.h
360
LIB_H += util/xyarray.h
361
LIB_H += util/header.h
362
LIB_H += util/help.h
363
LIB_H += util/session.h
364
LIB_H += util/strbuf.h
365
LIB_H += util/strlist.h
366
LIB_H += util/strfilter.h
367
LIB_H += util/svghelper.h
368
LIB_H += util/tool.h
369
LIB_H += util/run-command.h
370
LIB_H += util/sigchain.h
371
LIB_H += util/dso.h
372
LIB_H += util/symbol.h
373
LIB_H += util/color.h
374
LIB_H += util/values.h
375
LIB_H += util/sort.h
376
LIB_H += util/hist.h
377
LIB_H += util/thread.h
378
LIB_H += util/thread_map.h
379
LIB_H += util/trace-event.h
380
LIB_H += util/probe-finder.h
381
LIB_H += util/dwarf-aux.h
382
LIB_H += util/probe-event.h
383
LIB_H += util/pstack.h
384
LIB_H += util/cpumap.h
385
LIB_H += util/top.h
386
LIB_H += $(ARCH_INCLUDE)
S
Stephane Eranian 已提交
387
LIB_H += util/cgroup.h
388
LIB_H += $(TRACE_EVENT_DIR)event-parse.h
389
LIB_H += util/target.h
D
David Ahern 已提交
390
LIB_H += util/rblist.h
D
David Ahern 已提交
391
LIB_H += util/intlist.h
392
LIB_H += util/perf_regs.h
393
LIB_H += util/unwind.h
394
LIB_H += util/vdso.h
395 396 397 398
LIB_H += ui/helpline.h
LIB_H += ui/progress.h
LIB_H += ui/util.h
LIB_H += ui/ui.h
399

400 401
LIB_OBJS += $(OUTPUT)util/abspath.o
LIB_OBJS += $(OUTPUT)util/alias.o
402
LIB_OBJS += $(OUTPUT)util/annotate.o
403 404 405 406
LIB_OBJS += $(OUTPUT)util/build-id.o
LIB_OBJS += $(OUTPUT)util/config.o
LIB_OBJS += $(OUTPUT)util/ctype.o
LIB_OBJS += $(OUTPUT)util/debugfs.o
407
LIB_OBJS += $(OUTPUT)util/sysfs.o
408
LIB_OBJS += $(OUTPUT)util/pmu.o
409 410
LIB_OBJS += $(OUTPUT)util/environment.o
LIB_OBJS += $(OUTPUT)util/event.o
411
LIB_OBJS += $(OUTPUT)util/evlist.o
412
LIB_OBJS += $(OUTPUT)util/evsel.o
413 414 415 416 417 418 419 420 421 422 423 424 425 426
LIB_OBJS += $(OUTPUT)util/exec_cmd.o
LIB_OBJS += $(OUTPUT)util/help.o
LIB_OBJS += $(OUTPUT)util/levenshtein.o
LIB_OBJS += $(OUTPUT)util/parse-options.o
LIB_OBJS += $(OUTPUT)util/parse-events.o
LIB_OBJS += $(OUTPUT)util/path.o
LIB_OBJS += $(OUTPUT)util/rbtree.o
LIB_OBJS += $(OUTPUT)util/bitmap.o
LIB_OBJS += $(OUTPUT)util/hweight.o
LIB_OBJS += $(OUTPUT)util/run-command.o
LIB_OBJS += $(OUTPUT)util/quote.o
LIB_OBJS += $(OUTPUT)util/strbuf.o
LIB_OBJS += $(OUTPUT)util/string.o
LIB_OBJS += $(OUTPUT)util/strlist.o
427
LIB_OBJS += $(OUTPUT)util/strfilter.o
428
LIB_OBJS += $(OUTPUT)util/top.o
429 430 431
LIB_OBJS += $(OUTPUT)util/usage.o
LIB_OBJS += $(OUTPUT)util/wrapper.o
LIB_OBJS += $(OUTPUT)util/sigchain.o
432
LIB_OBJS += $(OUTPUT)util/dso.o
433
LIB_OBJS += $(OUTPUT)util/symbol.o
434
LIB_OBJS += $(OUTPUT)util/symbol-elf.o
435 436 437 438 439 440
LIB_OBJS += $(OUTPUT)util/color.o
LIB_OBJS += $(OUTPUT)util/pager.o
LIB_OBJS += $(OUTPUT)util/header.o
LIB_OBJS += $(OUTPUT)util/callchain.o
LIB_OBJS += $(OUTPUT)util/values.o
LIB_OBJS += $(OUTPUT)util/debug.o
441
LIB_OBJS += $(OUTPUT)util/machine.o
442
LIB_OBJS += $(OUTPUT)util/map.o
443
LIB_OBJS += $(OUTPUT)util/pstack.o
444 445
LIB_OBJS += $(OUTPUT)util/session.o
LIB_OBJS += $(OUTPUT)util/thread.o
446
LIB_OBJS += $(OUTPUT)util/thread_map.o
447
LIB_OBJS += $(OUTPUT)util/trace-event-parse.o
448 449
LIB_OBJS += $(OUTPUT)util/parse-events-flex.o
LIB_OBJS += $(OUTPUT)util/parse-events-bison.o
450 451
LIB_OBJS += $(OUTPUT)util/pmu-flex.o
LIB_OBJS += $(OUTPUT)util/pmu-bison.o
452 453 454 455 456 457 458 459
LIB_OBJS += $(OUTPUT)util/trace-event-read.o
LIB_OBJS += $(OUTPUT)util/trace-event-info.o
LIB_OBJS += $(OUTPUT)util/trace-event-scripting.o
LIB_OBJS += $(OUTPUT)util/svghelper.o
LIB_OBJS += $(OUTPUT)util/sort.o
LIB_OBJS += $(OUTPUT)util/hist.o
LIB_OBJS += $(OUTPUT)util/probe-event.o
LIB_OBJS += $(OUTPUT)util/util.o
460
LIB_OBJS += $(OUTPUT)util/xyarray.o
461
LIB_OBJS += $(OUTPUT)util/cpumap.o
S
Stephane Eranian 已提交
462
LIB_OBJS += $(OUTPUT)util/cgroup.o
463
LIB_OBJS += $(OUTPUT)util/target.o
D
David Ahern 已提交
464
LIB_OBJS += $(OUTPUT)util/rblist.o
D
David Ahern 已提交
465
LIB_OBJS += $(OUTPUT)util/intlist.o
466
LIB_OBJS += $(OUTPUT)util/vdso.o
467
LIB_OBJS += $(OUTPUT)util/stat.o
468

469
LIB_OBJS += $(OUTPUT)ui/setup.o
470
LIB_OBJS += $(OUTPUT)ui/helpline.o
471
LIB_OBJS += $(OUTPUT)ui/progress.o
472
LIB_OBJS += $(OUTPUT)ui/util.o
473
LIB_OBJS += $(OUTPUT)ui/hist.o
474
LIB_OBJS += $(OUTPUT)ui/stdio/hist.o
475

476 477
LIB_OBJS += $(OUTPUT)arch/common.o

478 479
LIB_OBJS += $(OUTPUT)tests/parse-events.o
LIB_OBJS += $(OUTPUT)tests/dso-data.o
480
LIB_OBJS += $(OUTPUT)tests/attr.o
481
LIB_OBJS += $(OUTPUT)tests/vmlinux-kallsyms.o
482
LIB_OBJS += $(OUTPUT)tests/open-syscall.o
483
LIB_OBJS += $(OUTPUT)tests/open-syscall-all-cpus.o
484
LIB_OBJS += $(OUTPUT)tests/open-syscall-tp-fields.o
485
LIB_OBJS += $(OUTPUT)tests/mmap-basic.o
486
LIB_OBJS += $(OUTPUT)tests/perf-record.o
487
LIB_OBJS += $(OUTPUT)tests/rdpmc.o
488
LIB_OBJS += $(OUTPUT)tests/evsel-roundtrip-name.o
489
LIB_OBJS += $(OUTPUT)tests/evsel-tp-sched.o
490
LIB_OBJS += $(OUTPUT)tests/pmu.o
491
LIB_OBJS += $(OUTPUT)tests/hists_link.o
492
LIB_OBJS += $(OUTPUT)tests/python-use.o
493

494 495
BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o
BUILTIN_OBJS += $(OUTPUT)builtin-bench.o
496
# Benchmark modules
497 498
BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o
BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o
499 500
ifeq ($(RAW_ARCH),x86_64)
BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy-x86-64-asm.o
501
BUILTIN_OBJS += $(OUTPUT)bench/mem-memset-x86-64-asm.o
502
endif
503
BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o
504
BUILTIN_OBJS += $(OUTPUT)bench/mem-memset.o
505 506

BUILTIN_OBJS += $(OUTPUT)builtin-diff.o
507
BUILTIN_OBJS += $(OUTPUT)builtin-evlist.o
508 509 510 511 512 513 514 515 516 517
BUILTIN_OBJS += $(OUTPUT)builtin-help.o
BUILTIN_OBJS += $(OUTPUT)builtin-sched.o
BUILTIN_OBJS += $(OUTPUT)builtin-buildid-list.o
BUILTIN_OBJS += $(OUTPUT)builtin-buildid-cache.o
BUILTIN_OBJS += $(OUTPUT)builtin-list.o
BUILTIN_OBJS += $(OUTPUT)builtin-record.o
BUILTIN_OBJS += $(OUTPUT)builtin-report.o
BUILTIN_OBJS += $(OUTPUT)builtin-stat.o
BUILTIN_OBJS += $(OUTPUT)builtin-timechart.o
BUILTIN_OBJS += $(OUTPUT)builtin-top.o
518
BUILTIN_OBJS += $(OUTPUT)builtin-script.o
519 520 521
BUILTIN_OBJS += $(OUTPUT)builtin-probe.o
BUILTIN_OBJS += $(OUTPUT)builtin-kmem.o
BUILTIN_OBJS += $(OUTPUT)builtin-lock.o
522
BUILTIN_OBJS += $(OUTPUT)builtin-kvm.o
T
Tom Zanussi 已提交
523
BUILTIN_OBJS += $(OUTPUT)builtin-inject.o
524
BUILTIN_OBJS += $(OUTPUT)tests/builtin-test.o
525

526
PERFLIBS = $(LIB_FILE) $(LIBTRACEEVENT)
527 528 529 530

#
# Platform specific tweaks
#
531
ifneq ($(MAKECMDGOALS),clean)
532
ifneq ($(MAKECMDGOALS),tags)
533 534 535 536 537

# 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...

538
ifdef NO_LIBELF
539
	NO_DWARF := 1
540
	NO_DEMANGLE := 1
541
	NO_LIBUNWIND := 1
542
else
543
FLAGS_LIBELF=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS)
544
ifneq ($(call try-cc,$(SOURCE_LIBELF),$(FLAGS_LIBELF),libelf),y)
545
	FLAGS_GLIBC=$(ALL_CFLAGS) $(ALL_LDFLAGS)
546
	ifeq ($(call try-cc,$(SOURCE_GLIBC),$(FLAGS_GLIBC),glibc),y)
547 548 549 550 551 552
		LIBC_SUPPORT := 1
	endif
	ifeq ($(BIONIC),1)
		LIBC_SUPPORT := 1
	endif
	ifeq ($(LIBC_SUPPORT),1)
553 554
		msg := $(warning No libelf found, disables 'probe' tool, please install elfutils-libelf-devel/libelf-dev);

555 556 557
		NO_LIBELF := 1
		NO_DWARF := 1
		NO_DEMANGLE := 1
558 559
	else
		msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
560
	endif
561
else
562 563 564 565 566 567 568 569
	# for linking with debug library, run like:
	# make DEBUG=1 LIBDW_DIR=/opt/libdw/
	ifdef LIBDW_DIR
		LIBDW_CFLAGS  := -I$(LIBDW_DIR)/include
		LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib
	endif

	FLAGS_DWARF=$(ALL_CFLAGS) $(LIBDW_CFLAGS) -ldw -lelf $(LIBDW_LDFLAGS) $(ALL_LDFLAGS) $(EXTLIBS)
570
	ifneq ($(call try-cc,$(SOURCE_DWARF),$(FLAGS_DWARF),libdw),y)
571 572 573 574
		msg := $(warning No libdw.h found or old libdw.h found or elfutils is older than 0.138, disables dwarf support. Please install new elfutils-devel/libdw-dev);
		NO_DWARF := 1
	endif # Dwarf support
endif # SOURCE_LIBELF
575 576
endif # NO_LIBELF

577 578 579 580 581 582 583 584 585
ifndef NO_LIBUNWIND
# for linking with debug library, run like:
# make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
ifdef LIBUNWIND_DIR
	LIBUNWIND_CFLAGS  := -I$(LIBUNWIND_DIR)/include
	LIBUNWIND_LDFLAGS := -L$(LIBUNWIND_DIR)/lib
endif

FLAGS_UNWIND=$(LIBUNWIND_CFLAGS) $(ALL_CFLAGS) $(LIBUNWIND_LDFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) $(LIBUNWIND_LIBS)
586
ifneq ($(call try-cc,$(SOURCE_LIBUNWIND),$(FLAGS_UNWIND),libunwind),y)
587
	msg := $(warning No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 0.99);
588 589 590 591
	NO_LIBUNWIND := 1
endif # Libunwind support
endif # NO_LIBUNWIND

592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612
-include arch/$(ARCH)/Makefile

ifneq ($(OUTPUT),)
	BASIC_CFLAGS += -I$(OUTPUT)
endif

ifdef NO_LIBELF
EXTLIBS := $(filter-out -lelf,$(EXTLIBS))

# Remove ELF/DWARF dependent codes
LIB_OBJS := $(filter-out $(OUTPUT)util/symbol-elf.o,$(LIB_OBJS))
LIB_OBJS := $(filter-out $(OUTPUT)util/dwarf-aux.o,$(LIB_OBJS))
LIB_OBJS := $(filter-out $(OUTPUT)util/probe-event.o,$(LIB_OBJS))
LIB_OBJS := $(filter-out $(OUTPUT)util/probe-finder.o,$(LIB_OBJS))

BUILTIN_OBJS := $(filter-out $(OUTPUT)builtin-probe.o,$(BUILTIN_OBJS))

# Use minimal symbol handling
LIB_OBJS += $(OUTPUT)util/symbol-minimal.o

else # NO_LIBELF
613
BASIC_CFLAGS += -DLIBELF_SUPPORT
614

615 616
FLAGS_LIBELF=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS)
ifeq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_LIBELF),-DLIBELF_MMAP),y)
617
	BASIC_CFLAGS += -DLIBELF_MMAP
P
Peter Zijlstra 已提交
618 619
endif

620
ifndef NO_DWARF
621 622 623
ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
	msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled);
else
624 625
	BASIC_CFLAGS := -DDWARF_SUPPORT $(LIBDW_CFLAGS) $(BASIC_CFLAGS)
	BASIC_LDFLAGS := $(LIBDW_LDFLAGS) $(BASIC_LDFLAGS)
626
	EXTLIBS += -lelf -ldw
627
	LIB_OBJS += $(OUTPUT)util/probe-finder.o
628
	LIB_OBJS += $(OUTPUT)util/dwarf-aux.o
629 630
endif # PERF_HAVE_DWARF_REGS
endif # NO_DWARF
631
endif # NO_LIBELF
632

633 634
ifndef NO_LIBUNWIND
	BASIC_CFLAGS += -DLIBUNWIND_SUPPORT
635 636 637
	EXTLIBS += $(LIBUNWIND_LIBS)
	BASIC_CFLAGS := $(LIBUNWIND_CFLAGS) $(BASIC_CFLAGS)
	BASIC_LDFLAGS := $(LIBUNWIND_LDFLAGS) $(BASIC_LDFLAGS)
638
	LIB_OBJS += $(OUTPUT)util/unwind.o
639 640
endif

641
ifndef NO_LIBAUDIT
642
	FLAGS_LIBAUDIT = $(ALL_CFLAGS) $(ALL_LDFLAGS) -laudit
643
	ifneq ($(call try-cc,$(SOURCE_LIBAUDIT),$(FLAGS_LIBAUDIT),libaudit),y)
644 645
		msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
	else
646
		BASIC_CFLAGS += -DLIBAUDIT_SUPPORT
647 648 649 650 651
		BUILTIN_OBJS += $(OUTPUT)builtin-trace.o
		EXTLIBS += -laudit
	endif
endif

N
Namhyung Kim 已提交
652
ifndef NO_NEWT
653
	FLAGS_NEWT=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -lnewt
654
	ifneq ($(call try-cc,$(SOURCE_NEWT),$(FLAGS_NEWT),libnewt),y)
655 656 657 658
		msg := $(warning newt not found, disables TUI support. Please install newt-devel or libnewt-dev);
	else
		# Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
		BASIC_CFLAGS += -I/usr/include/slang
N
Namhyung Kim 已提交
659
		BASIC_CFLAGS += -DNEWT_SUPPORT
660
		EXTLIBS += -lnewt -lslang
661 662 663 664
		LIB_OBJS += $(OUTPUT)ui/browser.o
		LIB_OBJS += $(OUTPUT)ui/browsers/annotate.o
		LIB_OBJS += $(OUTPUT)ui/browsers/hists.o
		LIB_OBJS += $(OUTPUT)ui/browsers/map.o
665
		LIB_OBJS += $(OUTPUT)ui/browsers/scripts.o
666
		LIB_OBJS += $(OUTPUT)ui/tui/setup.o
667
		LIB_OBJS += $(OUTPUT)ui/tui/util.o
668
		LIB_OBJS += $(OUTPUT)ui/tui/helpline.o
669
		LIB_OBJS += $(OUTPUT)ui/tui/progress.o
670 671 672 673
		LIB_H += ui/browser.h
		LIB_H += ui/browsers/map.h
		LIB_H += ui/keysyms.h
		LIB_H += ui/libslang.h
674
	endif
J
Jamie Iles 已提交
675
endif
676

N
Namhyung Kim 已提交
677
ifndef NO_GTK2
D
David Ahern 已提交
678
	FLAGS_GTK2=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
679
	ifneq ($(call try-cc,$(SOURCE_GTK2),$(FLAGS_GTK2),gtk2),y)
680 681
		msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
	else
682
		ifeq ($(call try-cc,$(SOURCE_GTK2_INFOBAR),$(FLAGS_GTK2),-DHAVE_GTK_INFO_BAR),y)
683 684
			BASIC_CFLAGS += -DHAVE_GTK_INFO_BAR
		endif
N
Namhyung Kim 已提交
685
		BASIC_CFLAGS += -DGTK2_SUPPORT
D
David Ahern 已提交
686 687
		BASIC_CFLAGS += $(shell pkg-config --cflags gtk+-2.0 2>/dev/null)
		EXTLIBS += $(shell pkg-config --libs gtk+-2.0 2>/dev/null)
688
		LIB_OBJS += $(OUTPUT)ui/gtk/browser.o
689
		LIB_OBJS += $(OUTPUT)ui/gtk/hists.o
690
		LIB_OBJS += $(OUTPUT)ui/gtk/setup.o
691
		LIB_OBJS += $(OUTPUT)ui/gtk/util.o
692
		LIB_OBJS += $(OUTPUT)ui/gtk/helpline.o
693
		LIB_OBJS += $(OUTPUT)ui/gtk/progress.o
694 695 696
	endif
endif

697
ifdef NO_LIBPERL
698 699
	BASIC_CFLAGS += -DNO_LIBPERL
else
700 701 702
       PERL_EMBED_LDOPTS = $(shell perl -MExtUtils::Embed -e ldopts 2>/dev/null)
       PERL_EMBED_LDFLAGS = $(call strip-libs,$(PERL_EMBED_LDOPTS))
       PERL_EMBED_LIBADD = $(call grep-libs,$(PERL_EMBED_LDOPTS))
703
	PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null`
T
Tom Zanussi 已提交
704
	FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS)
705

706
	ifneq ($(call try-cc,$(SOURCE_PERL_EMBED),$(FLAGS_PERL_EMBED),perl),y)
707 708
		BASIC_CFLAGS += -DNO_LIBPERL
	else
709 710
               ALL_LDFLAGS += $(PERL_EMBED_LDFLAGS)
               EXTLIBS += $(PERL_EMBED_LIBADD)
711 712 713
		LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-perl.o
		LIB_OBJS += $(OUTPUT)scripts/perl/Perf-Trace-Util/Context.o
	endif
714 715
endif

716 717 718 719
disable-python = $(eval $(disable-python_code))
define disable-python_code
  BASIC_CFLAGS += -DNO_LIBPYTHON
  $(if $(1),$(warning No $(1) was found))
720
  $(warning Python support will not be built)
721 722 723 724 725 726 727
endef

override PYTHON := \
  $(call get-executable-or-default,PYTHON,python)

ifndef PYTHON
  $(call disable-python,python interpreter)
728
else
729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750

  PYTHON_WORD := $(call shell-wordify,$(PYTHON))

  ifdef NO_LIBPYTHON
    $(call disable-python)
  else

    override PYTHON_CONFIG := \
      $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON)-config)

    ifndef PYTHON_CONFIG
      $(call disable-python,python-config tool)
    else

      PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG))

      PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null)
      PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
      PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS))
      PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
      FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)

751
      ifneq ($(call try-cc,$(SOURCE_PYTHON_EMBED),$(FLAGS_PYTHON_EMBED),python),y)
752 753 754
        $(call disable-python,Python.h (for Python 2.x))
      else

755
        ifneq ($(call try-cc,$(SOURCE_PYTHON_VERSION),$(FLAGS_PYTHON_EMBED),python version),y)
756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778
          $(warning Python 3 is not yet supported; please set)
          $(warning PYTHON and/or PYTHON_CONFIG appropriately.)
          $(warning If you also have Python 2 installed, then)
          $(warning try something like:)
          $(warning $(and ,))
          $(warning $(and ,)  make PYTHON=python2)
          $(warning $(and ,))
          $(warning Otherwise, disable Python support entirely:)
          $(warning $(and ,))
          $(warning $(and ,)  make NO_LIBPYTHON=1)
          $(warning $(and ,))
          $(error   $(and ,))
        else
          ALL_LDFLAGS += $(PYTHON_EMBED_LDFLAGS)
          EXTLIBS += $(PYTHON_EMBED_LIBADD)
          LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-python.o
          LIB_OBJS += $(OUTPUT)scripts/python/Perf-Trace-Util/Context.o
          LANG_BINDINGS += $(OUTPUT)python/perf.so
        endif

      endif
    endif
  endif
779 780
endif

P
Peter Zijlstra 已提交
781 782 783
ifdef NO_DEMANGLE
	BASIC_CFLAGS += -DNO_DEMANGLE
else
784 785 786 787
        ifdef HAVE_CPLUS_DEMANGLE
		EXTLIBS += -liberty
		BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE
        else
788
		FLAGS_BFD=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -DPACKAGE='perf' -lbfd
789
		has_bfd := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD),libbfd)
790 791
		ifeq ($(has_bfd),y)
			EXTLIBS += -lbfd
792
		else
793
			FLAGS_BFD_IBERTY=$(FLAGS_BFD) -liberty
794
			has_bfd_iberty := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY),liberty)
795 796
			ifeq ($(has_bfd_iberty),y)
				EXTLIBS += -lbfd -liberty
797
			else
798
				FLAGS_BFD_IBERTY_Z=$(FLAGS_BFD_IBERTY) -lz
799
				has_bfd_iberty_z := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY_Z),libz)
800 801
				ifeq ($(has_bfd_iberty_z),y)
					EXTLIBS += -lbfd -liberty -lz
802
				else
803
					FLAGS_CPLUS_DEMANGLE=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -liberty
804
					has_cplus_demangle := $(call try-cc,$(SOURCE_CPLUS_DEMANGLE),$(FLAGS_CPLUS_DEMANGLE),demangle)
805 806 807 808 809 810 811
					ifeq ($(has_cplus_demangle),y)
						EXTLIBS += -liberty
						BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE
					else
						msg := $(warning No bfd.h/libbfd found, install binutils-dev[el]/zlib-static to gain symbol demangling)
						BASIC_CFLAGS += -DNO_DEMANGLE
					endif
812 813 814
				endif
			endif
		endif
P
Peter Zijlstra 已提交
815 816 817
	endif
endif

818 819 820 821
ifeq ($(NO_PERF_REGS),0)
	ifeq ($(ARCH),x86)
		LIB_H += arch/x86/include/perf_regs.h
	endif
822
	BASIC_CFLAGS += -DHAVE_PERF_REGS
823
endif
824

N
Namhyung Kim 已提交
825
ifndef NO_STRLCPY
826
	ifeq ($(call try-cc,$(SOURCE_STRLCPY),,-DHAVE_STRLCPY),y)
N
Namhyung Kim 已提交
827
		BASIC_CFLAGS += -DHAVE_STRLCPY
828 829 830
	endif
endif

831
ifndef NO_ON_EXIT
832
	ifeq ($(call try-cc,$(SOURCE_ON_EXIT),,-DHAVE_ON_EXIT),y)
833 834 835 836
		BASIC_CFLAGS += -DHAVE_ON_EXIT
	endif
endif

837
ifndef NO_BACKTRACE
838
       ifeq ($(call try-cc,$(SOURCE_BACKTRACE),,-DBACKTRACE_SUPPORT),y)
839
               BASIC_CFLAGS += -DBACKTRACE_SUPPORT
840 841 842
       endif
endif

843 844 845 846 847 848 849 850 851 852 853
ifndef NO_LIBNUMA
	FLAGS_LIBNUMA = $(ALL_CFLAGS) $(ALL_LDFLAGS) -lnuma
	ifneq ($(call try-cc,$(SOURCE_LIBNUMA),$(FLAGS_LIBNUMA),libnuma),y)
		msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numa-libs-devel or libnuma-dev);
	else
		BASIC_CFLAGS += -DLIBNUMA_SUPPORT
		BUILTIN_OBJS += $(OUTPUT)bench/numa.o
		EXTLIBS += -lnuma
	endif
endif

854 855 856 857
ifdef ASCIIDOC8
	export ASCIIDOC8
endif

858
endif # MAKECMDGOALS != tags
859 860
endif # MAKECMDGOALS != clean

861 862
# Shell quote (do not use $(call) to accommodate ancient setups);

863
ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG))
864 865 866 867 868 869

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
mandir_SQ = $(subst ','\'',$(mandir))
infodir_SQ = $(subst ','\'',$(infodir))
870
perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
871 872 873
template_dir_SQ = $(subst ','\'',$(template_dir))
htmldir_SQ = $(subst ','\'',$(htmldir))
prefix_SQ = $(subst ','\'',$(prefix))
874
sysconfdir_SQ = $(subst ','\'',$(sysconfdir))
875 876 877

SHELL_PATH_SQ = $(subst ','\'',$(SHELL_PATH))

878
LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group
879 880

ALL_CFLAGS += $(BASIC_CFLAGS)
881
ALL_CFLAGS += $(ARCH_CFLAGS)
882 883
ALL_LDFLAGS += $(BASIC_LDFLAGS)

884
export INSTALL SHELL_PATH
885 886 887 888 889 890


### Build rules

SHELL = $(SHELL_PATH)

891
all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS)
892 893 894 895 896 897

please_set_SHELL_PATH_to_a_more_modern_shell:
	@$$(:)

shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell

898 899
strip: $(PROGRAMS) $(OUTPUT)perf
	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) $(OUTPUT)perf
900

901
$(OUTPUT)perf.o: perf.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
902
	$(QUIET_CC)$(CC) -include $(OUTPUT)PERF-VERSION-FILE \
903
		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
904
		$(ALL_CFLAGS) -c $(filter %.c,$^) -o $@
905

906
$(OUTPUT)perf: $(OUTPUT)perf.o $(BUILTIN_OBJS) $(PERFLIBS)
907 908
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) $(ALL_LDFLAGS) $(OUTPUT)perf.o \
               $(BUILTIN_OBJS) $(LIBS) -o $@
909

910 911
$(OUTPUT)builtin-help.o: builtin-help.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) \
912 913
		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
		'-DPERF_MAN_PATH="$(mandir_SQ)"' \
A
Arjan van de Ven 已提交
914 915
		'-DPERF_INFO_PATH="$(infodir_SQ)"' $<

916 917
$(OUTPUT)builtin-timechart.o: builtin-timechart.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) \
A
Arjan van de Ven 已提交
918 919
		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
		'-DPERF_MAN_PATH="$(mandir_SQ)"' \
920
		'-DPERF_INFO_PATH="$(infodir_SQ)"' $<
921

922
$(OUTPUT)common-cmds.h: util/generate-cmdlist.sh command-list.txt
923

924
$(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt)
925
	$(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@
926

927 928
$(SCRIPTS) : % : %.sh
	$(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@'
929

930
# These can record PERF_VERSION
931
$(OUTPUT)perf.o perf.spec \
932
	$(SCRIPTS) \
933
	: $(OUTPUT)PERF-VERSION-FILE
934

935 936 937
.SUFFIXES:
.SUFFIXES: .o .c .S .s

938 939 940 941
# These two need to be here so that when O= is not used they take precedence
# over the general rule for .o

$(OUTPUT)util/%-flex.o: $(OUTPUT)util/%-flex.c $(OUTPUT)PERF-CFLAGS
942
	$(QUIET_CC)$(CC) -o $@ -c -Iutil/ $(ALL_CFLAGS) -w $<
943 944

$(OUTPUT)util/%-bison.o: $(OUTPUT)util/%-bison.c $(OUTPUT)PERF-CFLAGS
945
	$(QUIET_CC)$(CC) -o $@ -c -Iutil/ $(ALL_CFLAGS) -DYYENABLE_NLS=0 -DYYLTYPE_IS_TRIVIAL=0 -w $<
946

947 948
$(OUTPUT)%.o: %.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
J
Jan Beulich 已提交
949 950
$(OUTPUT)%.i: %.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -E $(ALL_CFLAGS) $<
951
$(OUTPUT)%.s: %.c $(OUTPUT)PERF-CFLAGS
J
Jan Beulich 已提交
952
	$(QUIET_CC)$(CC) -o $@ -S $(ALL_CFLAGS) $<
953 954
$(OUTPUT)%.o: %.S
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
J
Jan Beulich 已提交
955 956
$(OUTPUT)%.s: %.S
	$(QUIET_CC)$(CC) -o $@ -E $(ALL_CFLAGS) $<
957

958 959
$(OUTPUT)util/exec_cmd.o: util/exec_cmd.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) \
960
		'-DPERF_EXEC_PATH="$(perfexecdir_SQ)"' \
961 962 963
		'-DPREFIX="$(prefix_SQ)"' \
		$<

964 965
$(OUTPUT)tests/attr.o: tests/attr.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) \
966
		'-DBINDIR="$(bindir_SQ)"' -DPYTHON='"$(PYTHON_WORD)"' \
967 968
		$<

969
$(OUTPUT)tests/python-use.o: tests/python-use.c $(OUTPUT)PERF-CFLAGS
970
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) \
971
		-DPYTHONPATH='"$(OUTPUT)python"' \
972 973
		-DPYTHON='"$(PYTHON_WORD)"' \
		$<
974

975 976
$(OUTPUT)util/config.o: util/config.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
977

978
$(OUTPUT)ui/browser.o: ui/browser.c $(OUTPUT)PERF-CFLAGS
979 980
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

981
$(OUTPUT)ui/browsers/annotate.o: ui/browsers/annotate.c $(OUTPUT)PERF-CFLAGS
982 983
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

984
$(OUTPUT)ui/browsers/hists.o: ui/browsers/hists.c $(OUTPUT)PERF-CFLAGS
985 986
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

987
$(OUTPUT)ui/browsers/map.o: ui/browsers/map.c $(OUTPUT)PERF-CFLAGS
988 989
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

990 991 992
$(OUTPUT)ui/browsers/scripts.o: ui/browsers/scripts.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

993
$(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS
994
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Wno-unused-parameter -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
995

996 997 998
$(OUTPUT)util/parse-events.o: util/parse-events.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -Wno-redundant-decls $<

999 1000
$(OUTPUT)util/scripting-engines/trace-event-perl.o: util/scripting-engines/trace-event-perl.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow $<
1001

1002 1003
$(OUTPUT)scripts/perl/Perf-Trace-Util/Context.o: scripts/perl/Perf-Trace-Util/Context.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $(PERL_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs $<
1004

1005 1006
$(OUTPUT)util/scripting-engines/trace-event-python.o: util/scripting-engines/trace-event-python.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-shadow $<
1007

1008 1009
$(OUTPUT)scripts/python/Perf-Trace-Util/Context.o: scripts/python/Perf-Trace-Util/Context.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $(PYTHON_EMBED_CCOPTS) -Wno-redundant-decls -Wno-strict-prototypes -Wno-unused-parameter -Wno-nested-externs $<
1010

1011
$(OUTPUT)perf-%: %.o $(PERFLIBS)
1012 1013 1014
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)

$(LIB_OBJS) $(BUILTIN_OBJS): $(LIB_H)
1015
$(patsubst perf-%,%.o,$(PROGRAMS)): $(LIB_H) $(wildcard */*.h)
1016

1017 1018 1019
# we compile into subdirectories. if the target directory is not the source directory, they might not exists. So
# we depend the various files onto their directories.
DIRECTORY_DEPS = $(LIB_OBJS) $(BUILTIN_OBJS) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h
K
Kusanagi Kouichi 已提交
1020
$(DIRECTORY_DEPS): | $(sort $(dir $(DIRECTORY_DEPS)))
1021 1022 1023 1024
# In the second step, we make a rule to actually create these directories
$(sort $(dir $(DIRECTORY_DEPS))):
	$(QUIET_MKDIR)$(MKDIR) -p $@ 2>/dev/null

1025 1026 1027
$(LIB_FILE): $(LIB_OBJS)
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)

1028 1029
# libtraceevent.a
$(LIBTRACEEVENT):
1030
	$(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) libtraceevent.a
S
Steven Rostedt 已提交
1031

1032 1033 1034
$(LIBTRACEEVENT)-clean:
	$(QUIET_SUBDIR0)$(TRACE_EVENT_DIR) $(QUIET_SUBDIR1) O=$(OUTPUT) clean

1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063
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'
	@echo '  HINT: use "make prefix=<path> <install target>" to install to a particular'
	@echo '        path like make prefix=/usr/local install install-doc'
	@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'

1064

1065
DOC_TARGETS := doc man html info pdf
1066

1067 1068
INSTALL_DOC_TARGETS := $(patsubst %,install-%,$(DOC_TARGETS)) try-install-man
INSTALL_DOC_TARGETS += quick-install-doc quick-install-man quick-install-html
1069

1070 1071
# 'make doc' should call 'make -C Documentation all'
$(DOC_TARGETS):
1072
	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:doc=all)
1073

1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087
TAGS:
	$(RM) TAGS
	$(FIND) . -name '*.[hcS]' -print | xargs etags -a

tags:
	$(RM) tags
	$(FIND) . -name '*.[hcS]' -print | xargs ctags -a

cscope:
	$(RM) cscope*
	$(FIND) . -name '*.[hcS]' -print | xargs cscope -b

### Detect prefix changes
TRACK_CFLAGS = $(subst ','\'',$(ALL_CFLAGS)):\
1088
             $(bindir_SQ):$(perfexecdir_SQ):$(template_dir_SQ):$(prefix_SQ)
1089

1090
$(OUTPUT)PERF-CFLAGS: .FORCE-PERF-CFLAGS
1091
	@FLAGS='$(TRACK_CFLAGS)'; \
1092
	    if test x"$$FLAGS" != x"`cat $(OUTPUT)PERF-CFLAGS 2>/dev/null`" ; then \
1093
		echo 1>&2 "    * new build flags or prefix"; \
1094
		echo "$$FLAGS" >$(OUTPUT)PERF-CFLAGS; \
1095 1096 1097 1098 1099 1100 1101 1102
            fi

### 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.

1103
check: $(OUTPUT)common-cmds.h
1104 1105
	if sparse; \
	then \
1106
		for i in *.c */*.c; \
1107 1108 1109 1110 1111 1112 1113 1114 1115
		do \
			sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; \
		done; \
	else \
		exit 1; \
	fi

### Installation rules

1116 1117
ifneq ($(filter /%,$(firstword $(perfexecdir))),)
perfexec_instdir = $(perfexecdir)
1118
else
1119
perfexec_instdir = $(prefix)/$(perfexecdir)
1120
endif
1121
perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
1122

1123
install-bin: all
1124
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
1125
	$(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'
1126 1127
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
1128
	$(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
1129 1130 1131
	$(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) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'
1132
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'
1133
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
1134
	$(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'
1135 1136
	$(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'
1137 1138
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'
	$(INSTALL) bash_completion '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf'
1139 1140 1141 1142
	$(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'
1143

1144 1145
install: install-bin try-install-man

1146 1147 1148
install-python_ext:
	$(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)'

1149 1150
# 'make install-doc' should call 'make -C Documentation install'
$(INSTALL_DOC_TARGETS):
1151
	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:-doc=)
1152

1153 1154
### Cleaning rules

1155
clean: $(LIBTRACEEVENT)-clean
1156
	$(RM) $(LIB_OBJS) $(BUILTIN_OBJS) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf.o $(LANG_BINDINGS)
1157
	$(RM) $(ALL_PROGRAMS) perf
1158
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope*
1159
	$(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean
1160
	$(RM) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS
1161 1162
	$(RM) $(OUTPUT)util/*-bison*
	$(RM) $(OUTPUT)util/*-flex*
1163
	$(python-clean)
1164

1165
.PHONY: all install clean strip $(LIBTRACEEVENT)
1166
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
1167
.PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope .FORCE-PERF-CFLAGS