Makefile 35.0 KB
Newer Older
1 2 3 4
ifeq ("$(origin O)", "command line")
	OUTPUT := $(O)/
endif

5 6
# The default target of this Makefile is...
all::
7

8 9 10 11 12 13
ifneq ($(OUTPUT),)
# check that the output directory actually exists
OUTDIR := $(shell cd $(OUTPUT) && /bin/pwd)
$(if $(OUTDIR),, $(error output directory "$(OUTPUT)" does not exist))
endif

14
# Define V=1 to have a more verbose compile.
15
# Define V=2 to have an even more verbose compile.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
#
# Define CURLDIR=/foo/bar if your curl header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
# Define EXPATDIR=/foo/bar if your expat header and library files are in
# /foo/bar/include and /foo/bar/lib directories.
#
# Define NO_C99_FORMAT if your formatted IO functions (printf/scanf et.al.)
# do not support the 'size specifiers' introduced by C99, namely ll, hh,
# j, z, t. (representing long long int, char, intmax_t, size_t, ptrdiff_t).
# some C compilers supported these specifiers prior to C99 as an extension.
#
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
#
# Define NO_R_TO_GCC_LINKER if your gcc does not like "-R/path/lib"
# that tells runtime paths to dynamic libraries;
# "-Wl,-rpath=/path/lib" is used instead.
#
# Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8
#
# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72.
#
# Define NO_PERL_MAKEMAKER if you cannot use Makefiles generated by perl's
# MakeMaker (e.g. using ActiveState under Cygwin).
#
# Define NO_PERL if you do not want Perl scripts or libraries at all.
#
# Define INTERNAL_QSORT to use Git's implementation of qsort(), which
# is a simplified version of the merge sort used in glibc. This is
# recommended if Git triggers O(n^2) behavior in your platform's qsort().
#
47
# Define NO_EXTERNAL_GREP if you don't want "perf grep" to ever call
48
# your external grep (e.g., if your system lacks grep, if its grep is
49
# broken, or spawning external process is slower than built-in grep perf has).
50 51
#
# Define LDFLAGS=-static to build a static binary.
52 53
#
# Define EXTRA_CFLAGS=-m64 or EXTRA_CFLAGS=-m32 as appropriate for cross-builds.
54 55
#
# Define NO_DWARF if you do not want debug-info analysis feature at all.
56

57 58 59
$(OUTPUT)PERF-VERSION-FILE: .FORCE-PERF-VERSION-FILE
	@$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT)
-include $(OUTPUT)PERF-VERSION-FILE
60

61 62 63 64 65 66
uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not')
uname_M := $(shell sh -c 'uname -m 2>/dev/null || echo not')
uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not')
uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not')
uname_P := $(shell sh -c 'uname -p 2>/dev/null || echo not')
uname_V := $(shell sh -c 'uname -v 2>/dev/null || echo not')
67

68 69 70 71 72 73 74 75 76 77 78
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/ \
				  -e s/sh[234].*/sh/ )

# Additional ARCH settings for x86
ifeq ($(ARCH),i386)
        ARCH := x86
endif
ifeq ($(ARCH),x86_64)
79
	RAW_ARCH := x86_64
80
        ARCH := x86
81 82
	ARCH_CFLAGS := -DARCH_X86_64
	ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S
83 84
endif

85
# CFLAGS and LDFLAGS are for the users to override from the command line.
86

87 88 89
#
# Include saner warnings here, which can catch bugs:
#
90

P
Paul Mundt 已提交
91
EXTRA_WARNINGS := -Wformat
92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wformat-security
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wformat-y2k
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wshadow
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Winit-self
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wpacked
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wredundant-decls
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wstrict-aliasing=3
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wswitch-default
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wswitch-enum
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wno-system-headers
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wundef
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wwrite-strings
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wbad-function-cast
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wmissing-declarations
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wmissing-prototypes
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wnested-externs
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wold-style-definition
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wstrict-prototypes
EXTRA_WARNINGS := $(EXTRA_WARNINGS) -Wdeclaration-after-statement
111

112 113 114 115 116 117 118
ifeq ("$(origin DEBUG)", "command line")
  PERF_DEBUG = $(DEBUG)
endif
ifndef PERF_DEBUG
  CFLAGS_OPTIMIZE = -O6
endif

119
CFLAGS = -fno-omit-frame-pointer -ggdb3 -Wall -Wextra -std=gnu99 -Werror $(CFLAGS_OPTIMIZE) -D_FORTIFY_SOURCE=2 $(EXTRA_WARNINGS) $(EXTRA_CFLAGS)
120
EXTLIBS = -lpthread -lrt -lelf -lm
121
ALL_CFLAGS = $(CFLAGS) -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64
122 123 124 125
ALL_LDFLAGS = $(LDFLAGS)
STRIP ?= strip

# Among the variables below, these:
126
#   perfexecdir
127 128 129 130
#   template_dir
#   mandir
#   infodir
#   htmldir
131
#   ETC_PERFCONFIG (but not sysconfdir)
132
# can be specified as a relative path some/where/else;
133
# this is interpreted as relative to $(prefix) and "perf" at
134 135 136
# runtime figures out where they are based on the path to the executable.
# This can help installing the suite in a relocatable way.

137 138
# Make the path relative to DESTDIR, not to prefix
ifndef DESTDIR
139
prefix = $(HOME)
140
endif
141 142 143 144
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
mandir = share/man
infodir = share/info
145
perfexecdir = libexec/perf-core
146
sharedir = $(prefix)/share
147 148
template_dir = share/perf-core/templates
htmldir = share/doc/perf-doc
149 150
ifeq ($(prefix),/usr)
sysconfdir = /etc
151
ETC_PERFCONFIG = $(sysconfdir)/perfconfig
152 153
else
sysconfdir = $(prefix)/etc
154
ETC_PERFCONFIG = etc/perfconfig
155 156 157 158 159
endif
lib = lib

export prefix bindir sharedir sysconfdir

J
Jamie Iles 已提交
160 161
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar
162
RM = rm -f
163
MKDIR = mkdir
164 165 166 167 168 169 170 171 172 173
TAR = tar
FIND = find
INSTALL = install
RPMBUILD = rpmbuild
PTHREAD_LIBS = -lpthread

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

174 175 176 177 178 179
ifeq ($(V), 2)
	QUIET_STDERR = ">/dev/null"
else
	QUIET_STDERR = ">/dev/null 2>&1"
endif

180
-include feature-tests.mak
181

182 183
ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -fstack-protector-all),y)
	CFLAGS := $(CFLAGS) -fstack-protector-all
184
endif
185

186 187 188 189 190 191 192
ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -Wstack-protector),y)
       CFLAGS := $(CFLAGS) -Wstack-protector
endif

ifeq ($(call try-cc,$(SOURCE_HELLO),-Werror -Wvolatile-register-var),y)
       CFLAGS := $(CFLAGS) -Wvolatile-register-var
endif
193 194 195 196 197 198

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

# Those must not be GNU-specific; they are shared with perl/ which may
# be built by a different compiler. (Note that this is an artifact now
# but it still might be nice to keep that distinction.)
199
BASIC_CFLAGS = -Iutil/include -Iarch/$(ARCH)/include
200 201 202 203 204 205 206
BASIC_LDFLAGS =

# Guard against environment variables
BUILTIN_OBJS =
BUILT_INS =
LIB_H =
LIB_OBJS =
207
PYRF_OBJS =
208 209 210 211
SCRIPT_PERL =
SCRIPT_SH =
TEST_PROGRAMS =

212
SCRIPT_SH += perf-archive.sh
213

214 215 216
grep-libs = $(filter -l%,$(1))
strip-libs = $(filter-out -l%,$(1))

217
$(OUTPUT)python/perf.so: $(PYRF_OBJS)
218
	$(QUIET_GEN)python util/setup.py --quiet  build_ext --build-lib='$(OUTPUT)python' \
219
						--build-temp='$(OUTPUT)python/temp'
220 221 222 223 224
#
# No Perl scripts right now:
#

# SCRIPT_PERL += perf-add--interactive.perl
225 226

SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
227
	  $(patsubst %.perl,%,$(SCRIPT_PERL))
228 229 230 231

# Empty...
EXTRA_PROGRAMS =

232
# ... and all the rest that could be moved out of bindir to perfexecdir
233
PROGRAMS += $(EXTRA_PROGRAMS)
234 235

#
236
# Single 'perf' binary right now:
237
#
238
PROGRAMS += $(OUTPUT)perf
239

240
LANG_BINDINGS =
241

242 243
# List built-in command $C whose implementation cmd_$C() is not in
# builtin-$C.o but is linked in as part of some other command.
244 245 246
#

# what 'all' will build and 'install' will install, in perfexecdir
247
ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS)
248

249
# what 'all' will build but not install in perfexecdir
250
OTHER_PROGRAMS = $(OUTPUT)perf
251 252 253 254 255 256 257 258 259 260 261

# 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

262
LIB_FILE=$(OUTPUT)libperf.a
263

264
LIB_H += ../../include/linux/perf_event.h
265
LIB_H += ../../include/linux/rbtree.h
266
LIB_H += ../../include/linux/list.h
267
LIB_H += ../../include/linux/hash.h
268
LIB_H += ../../include/linux/stringify.h
269 270 271 272 273
LIB_H += util/include/linux/bitmap.h
LIB_H += util/include/linux/bitops.h
LIB_H += util/include/linux/compiler.h
LIB_H += util/include/linux/ctype.h
LIB_H += util/include/linux/kernel.h
274
LIB_H += util/include/linux/list.h
275 276 277 278
LIB_H += util/include/linux/module.h
LIB_H += util/include/linux/poison.h
LIB_H += util/include/linux/prefetch.h
LIB_H += util/include/linux/rbtree.h
279
LIB_H += util/include/linux/string.h
280
LIB_H += util/include/linux/types.h
281
LIB_H += util/include/linux/linkage.h
282
LIB_H += util/include/asm/asm-offsets.h
283
LIB_H += util/include/asm/bug.h
284
LIB_H += util/include/asm/byteorder.h
285
LIB_H += util/include/asm/hweight.h
286 287 288
LIB_H += util/include/asm/swab.h
LIB_H += util/include/asm/system.h
LIB_H += util/include/asm/uaccess.h
289
LIB_H += util/include/dwarf-regs.h
290 291
LIB_H += util/include/asm/dwarf2.h
LIB_H += util/include/asm/cpufeature.h
292
LIB_H += perf.h
293
LIB_H += util/annotate.h
294 295
LIB_H += util/cache.h
LIB_H += util/callchain.h
296
LIB_H += util/build-id.h
297
LIB_H += util/debug.h
298
LIB_H += util/debugfs.h
299
LIB_H += util/event.h
300
LIB_H += util/evsel.h
301
LIB_H += util/evlist.h
302
LIB_H += util/exec_cmd.h
303
LIB_H += util/types.h
304
LIB_H += util/levenshtein.h
305
LIB_H += util/map.h
306
LIB_H += util/parse-options.h
307
LIB_H += util/parse-events.h
308 309
LIB_H += util/quote.h
LIB_H += util/util.h
310
LIB_H += util/xyarray.h
311
LIB_H += util/header.h
312
LIB_H += util/help.h
313
LIB_H += util/session.h
314
LIB_H += util/strbuf.h
315
LIB_H += util/strlist.h
316
LIB_H += util/strfilter.h
317
LIB_H += util/svghelper.h
318
LIB_H += util/run-command.h
319
LIB_H += util/sigchain.h
320
LIB_H += util/symbol.h
321
LIB_H += util/color.h
322
LIB_H += util/values.h
323
LIB_H += util/sort.h
324
LIB_H += util/hist.h
325
LIB_H += util/thread.h
326
LIB_H += util/thread_map.h
327
LIB_H += util/trace-event.h
328
LIB_H += util/probe-finder.h
329
LIB_H += util/probe-event.h
330
LIB_H += util/pstack.h
331
LIB_H += util/cpumap.h
332
LIB_H += util/top.h
333
LIB_H += $(ARCH_INCLUDE)
S
Stephane Eranian 已提交
334
LIB_H += util/cgroup.h
335

336 337
LIB_OBJS += $(OUTPUT)util/abspath.o
LIB_OBJS += $(OUTPUT)util/alias.o
338
LIB_OBJS += $(OUTPUT)util/annotate.o
339 340 341 342 343 344
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
LIB_OBJS += $(OUTPUT)util/environment.o
LIB_OBJS += $(OUTPUT)util/event.o
345
LIB_OBJS += $(OUTPUT)util/evlist.o
346
LIB_OBJS += $(OUTPUT)util/evsel.o
347 348 349 350 351 352 353 354 355 356 357 358 359 360
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
361
LIB_OBJS += $(OUTPUT)util/strfilter.o
362
LIB_OBJS += $(OUTPUT)util/top.o
363 364 365 366 367 368 369 370 371 372 373
LIB_OBJS += $(OUTPUT)util/usage.o
LIB_OBJS += $(OUTPUT)util/wrapper.o
LIB_OBJS += $(OUTPUT)util/sigchain.o
LIB_OBJS += $(OUTPUT)util/symbol.o
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
LIB_OBJS += $(OUTPUT)util/map.o
374
LIB_OBJS += $(OUTPUT)util/pstack.o
375 376
LIB_OBJS += $(OUTPUT)util/session.o
LIB_OBJS += $(OUTPUT)util/thread.o
377
LIB_OBJS += $(OUTPUT)util/thread_map.o
378 379 380 381 382 383 384 385 386
LIB_OBJS += $(OUTPUT)util/trace-event-parse.o
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
387
LIB_OBJS += $(OUTPUT)util/xyarray.o
388
LIB_OBJS += $(OUTPUT)util/cpumap.o
S
Stephane Eranian 已提交
389
LIB_OBJS += $(OUTPUT)util/cgroup.o
390 391 392 393

BUILTIN_OBJS += $(OUTPUT)builtin-annotate.o

BUILTIN_OBJS += $(OUTPUT)builtin-bench.o
394 395

# Benchmark modules
396 397
BUILTIN_OBJS += $(OUTPUT)bench/sched-messaging.o
BUILTIN_OBJS += $(OUTPUT)bench/sched-pipe.o
398 399 400
ifeq ($(RAW_ARCH),x86_64)
BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy-x86-64-asm.o
endif
401 402 403 404 405 406 407 408 409 410 411 412 413
BUILTIN_OBJS += $(OUTPUT)bench/mem-memcpy.o

BUILTIN_OBJS += $(OUTPUT)builtin-diff.o
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
414
BUILTIN_OBJS += $(OUTPUT)builtin-script.o
415 416 417
BUILTIN_OBJS += $(OUTPUT)builtin-probe.o
BUILTIN_OBJS += $(OUTPUT)builtin-kmem.o
BUILTIN_OBJS += $(OUTPUT)builtin-lock.o
418
BUILTIN_OBJS += $(OUTPUT)builtin-kvm.o
419
BUILTIN_OBJS += $(OUTPUT)builtin-test.o
T
Tom Zanussi 已提交
420
BUILTIN_OBJS += $(OUTPUT)builtin-inject.o
421 422

PERFLIBS = $(LIB_FILE)
423

424 425 426 427 428 429 430 431 432 433 434 435 436 437
# Files needed for the python binding, perf.so
# pyrf is just an internal name needed for all those wrappers.
# This has to be in sync with what is in the 'sources' variable in
# tools/perf/util/setup.py

PYRF_OBJS += $(OUTPUT)util/cpumap.o
PYRF_OBJS += $(OUTPUT)util/ctype.o
PYRF_OBJS += $(OUTPUT)util/evlist.o
PYRF_OBJS += $(OUTPUT)util/evsel.o
PYRF_OBJS += $(OUTPUT)util/python.o
PYRF_OBJS += $(OUTPUT)util/thread_map.o
PYRF_OBJS += $(OUTPUT)util/util.o
PYRF_OBJS += $(OUTPUT)util/xyarray.o

438 439 440 441 442 443 444 445 446 447 448
#
# Platform specific tweaks
#

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

-include config.mak.autogen
-include config.mak

449
ifndef NO_DWARF
450
FLAGS_DWARF=$(ALL_CFLAGS) -ldw -lelf $(ALL_LDFLAGS) $(EXTLIBS)
451
ifneq ($(call try-cc,$(SOURCE_DWARF),$(FLAGS_DWARF)),y)
452
	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);
453 454 455 456 457 458
	NO_DWARF := 1
endif # Dwarf support
endif # NO_DWARF

-include arch/$(ARCH)/Makefile

459 460 461 462
ifneq ($(OUTPUT),)
	BASIC_CFLAGS += -I$(OUTPUT)
endif

463 464 465 466 467 468 469 470
FLAGS_LIBELF=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS)
ifneq ($(call try-cc,$(SOURCE_LIBELF),$(FLAGS_LIBELF)),y)
	FLAGS_GLIBC=$(ALL_CFLAGS) $(ALL_LDFLAGS)
	ifneq ($(call try-cc,$(SOURCE_GLIBC),$(FLAGS_GLIBC)),y)
		msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
	else
		msg := $(error No libelf.h/libelf found, please install libelf-dev/elfutils-libelf-devel);
	endif
471 472
endif

473 474
ifneq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_COMMON)),y)
	BASIC_CFLAGS += -DLIBELF_NO_MMAP
P
Peter Zijlstra 已提交
475 476
endif

477
ifndef NO_DWARF
478 479 480
ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
	msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled);
else
481
	BASIC_CFLAGS += -DDWARF_SUPPORT
482
	EXTLIBS += -lelf -ldw
483
	LIB_OBJS += $(OUTPUT)util/probe-finder.o
484 485
endif # PERF_HAVE_DWARF_REGS
endif # NO_DWARF
486

487 488 489
ifdef NO_NEWT
	BASIC_CFLAGS += -DNO_NEWT_SUPPORT
else
490 491 492 493 494 495 496 497
	FLAGS_NEWT=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -lnewt
	ifneq ($(call try-cc,$(SOURCE_NEWT),$(FLAGS_NEWT)),y)
		msg := $(warning newt not found, disables TUI support. Please install newt-devel or libnewt-dev);
		BASIC_CFLAGS += -DNO_NEWT_SUPPORT
	else
		# Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
		BASIC_CFLAGS += -I/usr/include/slang
		EXTLIBS += -lnewt -lslang
498
		LIB_OBJS += $(OUTPUT)util/ui/setup.o
499
		LIB_OBJS += $(OUTPUT)util/ui/browser.o
500
		LIB_OBJS += $(OUTPUT)util/ui/browsers/annotate.o
501
		LIB_OBJS += $(OUTPUT)util/ui/browsers/hists.o
502
		LIB_OBJS += $(OUTPUT)util/ui/browsers/map.o
503
		LIB_OBJS += $(OUTPUT)util/ui/browsers/top.o
504
		LIB_OBJS += $(OUTPUT)util/ui/helpline.o
505
		LIB_OBJS += $(OUTPUT)util/ui/progress.o
506
		LIB_OBJS += $(OUTPUT)util/ui/util.o
507
		LIB_H += util/ui/browser.h
508
		LIB_H += util/ui/browsers/map.h
509
		LIB_H += util/ui/helpline.h
510
		LIB_H += util/ui/libslang.h
511
		LIB_H += util/ui/progress.h
512
		LIB_H += util/ui/util.h
513
		LIB_H += util/ui/ui.h
514
	endif
J
Jamie Iles 已提交
515
endif
516

517
ifdef NO_LIBPERL
518 519
	BASIC_CFLAGS += -DNO_LIBPERL
else
520 521 522
       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))
523
	PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null`
T
Tom Zanussi 已提交
524
	FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS)
525

526 527 528
	ifneq ($(call try-cc,$(SOURCE_PERL_EMBED),$(FLAGS_PERL_EMBED)),y)
		BASIC_CFLAGS += -DNO_LIBPERL
	else
529 530
               ALL_LDFLAGS += $(PERL_EMBED_LDFLAGS)
               EXTLIBS += $(PERL_EMBED_LIBADD)
531 532 533
		LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-perl.o
		LIB_OBJS += $(OUTPUT)scripts/perl/Perf-Trace-Util/Context.o
	endif
534 535
endif

536
ifdef NO_LIBPYTHON
537 538
	BASIC_CFLAGS += -DNO_LIBPYTHON
else
539 540 541
       PYTHON_EMBED_LDOPTS = $(shell python-config --ldflags 2>/dev/null)
       PYTHON_EMBED_LDFLAGS = $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
       PYTHON_EMBED_LIBADD = $(call grep-libs,$(PYTHON_EMBED_LDOPTS))
542 543 544
	PYTHON_EMBED_CCOPTS = `python-config --cflags 2>/dev/null`
	FLAGS_PYTHON_EMBED=$(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
	ifneq ($(call try-cc,$(SOURCE_PYTHON_EMBED),$(FLAGS_PYTHON_EMBED)),y)
545
		msg := $(warning No Python.h found, install python-dev[el] to have python support in 'perf script' and to build the python bindings)
546 547
		BASIC_CFLAGS += -DNO_LIBPYTHON
	else
548 549
               ALL_LDFLAGS += $(PYTHON_EMBED_LDFLAGS)
               EXTLIBS += $(PYTHON_EMBED_LIBADD)
550 551
		LIB_OBJS += $(OUTPUT)util/scripting-engines/trace-event-python.o
		LIB_OBJS += $(OUTPUT)scripts/python/Perf-Trace-Util/Context.o
552
		LANG_BINDINGS += $(OUTPUT)python/perf.so
553
	endif
554 555
endif

P
Peter Zijlstra 已提交
556 557 558
ifdef NO_DEMANGLE
	BASIC_CFLAGS += -DNO_DEMANGLE
else
559 560 561 562 563 564 565 566
        ifdef HAVE_CPLUS_DEMANGLE
		EXTLIBS += -liberty
		BASIC_CFLAGS += -DHAVE_CPLUS_DEMANGLE
        else
		FLAGS_BFD=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -lbfd
		has_bfd := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD))
		ifeq ($(has_bfd),y)
			EXTLIBS += -lbfd
567
		else
568 569 570 571
			FLAGS_BFD_IBERTY=$(FLAGS_BFD) -liberty
			has_bfd_iberty := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY))
			ifeq ($(has_bfd_iberty),y)
				EXTLIBS += -lbfd -liberty
572
			else
573 574 575 576
				FLAGS_BFD_IBERTY_Z=$(FLAGS_BFD_IBERTY) -lz
				has_bfd_iberty_z := $(call try-cc,$(SOURCE_BFD),$(FLAGS_BFD_IBERTY_Z))
				ifeq ($(has_bfd_iberty_z),y)
					EXTLIBS += -lbfd -liberty -lz
577
				else
578 579 580 581 582 583 584 585 586
					FLAGS_CPLUS_DEMANGLE=$(ALL_CFLAGS) $(ALL_LDFLAGS) $(EXTLIBS) -liberty
					has_cplus_demangle := $(call try-cc,$(SOURCE_CPLUS_DEMANGLE),$(FLAGS_CPLUS_DEMANGLE))
					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
587 588 589
				endif
			endif
		endif
P
Peter Zijlstra 已提交
590 591 592
	endif
endif

593 594 595 596 597 598 599 600 601

ifdef NO_STRLCPY
	BASIC_CFLAGS += -DNO_STRLCPY
else
	ifneq ($(call try-cc,$(SOURCE_STRLCPY),),y)
		BASIC_CFLAGS += -DNO_STRLCPY
	endif
endif

602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624
ifndef CC_LD_DYNPATH
	ifdef NO_R_TO_GCC_LINKER
		# Some gcc does not accept and pass -R to the linker to specify
		# the runtime dynamic library path.
		CC_LD_DYNPATH = -Wl,-rpath,
	else
		CC_LD_DYNPATH = -R
	endif
endif

ifdef NO_C99_FORMAT
	BASIC_CFLAGS += -DNO_C99_FORMAT
endif

ifdef NO_DEFLATE_BOUND
	BASIC_CFLAGS += -DNO_DEFLATE_BOUND
endif

ifdef NO_PERL_MAKEMAKER
	export NO_PERL_MAKEMAKER
endif
ifdef INTERNAL_QSORT
	COMPAT_CFLAGS += -DINTERNAL_QSORT
625
	COMPAT_OBJS += $(OUTPUT)compat/qsort.o
626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652
endif
ifdef RUNTIME_PREFIX
	COMPAT_CFLAGS += -DRUNTIME_PREFIX
endif

ifdef NO_EXTERNAL_GREP
	BASIC_CFLAGS += -DNO_EXTERNAL_GREP
endif

ifeq ($(PERL_PATH),)
NO_PERL=NoThanks
endif

QUIET_SUBDIR0  = +$(MAKE) -C # space to separate -C and subdir
QUIET_SUBDIR1  =

ifneq ($(findstring $(MAKEFLAGS),w),w)
PRINT_DIR = --no-print-directory
else # "make -w"
NO_SUBDIR = :
endif

ifneq ($(findstring $(MAKEFLAGS),s),s)
ifndef V
	QUIET_CC       = @echo '   ' CC $@;
	QUIET_AR       = @echo '   ' AR $@;
	QUIET_LINK     = @echo '   ' LINK $@;
653
	QUIET_MKDIR    = @echo '   ' MKDIR $@;
654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670
	QUIET_BUILT_IN = @echo '   ' BUILTIN $@;
	QUIET_GEN      = @echo '   ' GEN $@;
	QUIET_SUBDIR0  = +@subdir=
	QUIET_SUBDIR1  = ;$(NO_SUBDIR) echo '   ' SUBDIR $$subdir; \
			 $(MAKE) $(PRINT_DIR) -C $$subdir
	export V
	export QUIET_GEN
	export QUIET_BUILT_IN
endif
endif

ifdef ASCIIDOC8
	export ASCIIDOC8
endif

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

671
ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG))
672 673 674 675 676 677

DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
mandir_SQ = $(subst ','\'',$(mandir))
infodir_SQ = $(subst ','\'',$(infodir))
678
perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
679 680 681 682 683 684 685
template_dir_SQ = $(subst ','\'',$(template_dir))
htmldir_SQ = $(subst ','\'',$(htmldir))
prefix_SQ = $(subst ','\'',$(prefix))

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

686
LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive $(EXTLIBS)
687 688

ALL_CFLAGS += $(BASIC_CFLAGS)
689
ALL_CFLAGS += $(ARCH_CFLAGS)
690 691 692 693 694 695 696 697 698
ALL_LDFLAGS += $(BASIC_LDFLAGS)

export TAR INSTALL DESTDIR SHELL_PATH


### Build rules

SHELL = $(SHELL_PATH)

699
all:: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(BUILT_INS) $(OTHER_PROGRAMS) $(OUTPUT)PERF-BUILD-OPTIONS
700 701 702 703 704 705 706 707

all::

please_set_SHELL_PATH_to_a_more_modern_shell:
	@$$(:)

shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell

708 709
strip: $(PROGRAMS) $(OUTPUT)perf
	$(STRIP) $(STRIP_OPTS) $(PROGRAMS) $(OUTPUT)perf
710

711
$(OUTPUT)perf.o: perf.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
712 713
	$(QUIET_CC)$(CC) -DPERF_VERSION='"$(PERF_VERSION)"' \
		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
714
		$(ALL_CFLAGS) -c $(filter %.c,$^) -o $@
715

716
$(OUTPUT)perf: $(OUTPUT)perf.o $(BUILTIN_OBJS) $(PERFLIBS)
717 718
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) $(ALL_LDFLAGS) $(OUTPUT)perf.o \
               $(BUILTIN_OBJS) $(LIBS) -o $@
719

720 721
$(OUTPUT)builtin-help.o: builtin-help.c $(OUTPUT)common-cmds.h $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) \
722 723
		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
		'-DPERF_MAN_PATH="$(mandir_SQ)"' \
A
Arjan van de Ven 已提交
724 725
		'-DPERF_INFO_PATH="$(infodir_SQ)"' $<

726 727
$(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 已提交
728 729
		'-DPERF_HTML_PATH="$(htmldir_SQ)"' \
		'-DPERF_MAN_PATH="$(mandir_SQ)"' \
730
		'-DPERF_INFO_PATH="$(infodir_SQ)"' $<
731

732
$(BUILT_INS): $(OUTPUT)perf$X
733
	$(QUIET_BUILT_IN)$(RM) $@ && \
734 735 736
	ln perf$X $@ 2>/dev/null || \
	ln -s perf$X $@ 2>/dev/null || \
	cp perf$X $@
737

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

740
$(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt)
741
	$(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@
742 743

$(patsubst %.sh,%,$(SCRIPT_SH)) : % : %.sh
744
	$(QUIET_GEN)$(RM) $(OUTPUT)$@ $(OUTPUT)$@+ && \
745 746 747
	sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
	    -e 's|@SHELL_PATH@|$(SHELL_PATH_SQ)|' \
	    -e 's|@@PERL@@|$(PERL_PATH_SQ)|g' \
748
	    -e 's/@@PERF_VERSION@@/$(PERF_VERSION)/g' \
749
	    -e 's/@@NO_CURL@@/$(NO_CURL)/g' \
750 751 752
	    $@.sh > $(OUTPUT)$@+ && \
	chmod +x $(OUTPUT)$@+ && \
	mv $(OUTPUT)$@+ $(OUTPUT)$@
753 754 755

configure: configure.ac
	$(QUIET_GEN)$(RM) $@ $<+ && \
756
	sed -e 's/@@PERF_VERSION@@/$(PERF_VERSION)/g' \
757 758 759 760
	    $< > $<+ && \
	autoconf -o $@ $<+ && \
	$(RM) $<+

761
# These can record PERF_VERSION
762
$(OUTPUT)perf.o perf.spec \
763 764
	$(patsubst %.sh,%,$(SCRIPT_SH)) \
	$(patsubst %.perl,%,$(SCRIPT_PERL)) \
765
	: $(OUTPUT)PERF-VERSION-FILE
766

767 768 769
$(OUTPUT)%.o: %.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
$(OUTPUT)%.s: %.c $(OUTPUT)PERF-CFLAGS
770
	$(QUIET_CC)$(CC) -S $(ALL_CFLAGS) $<
771 772
$(OUTPUT)%.o: %.S
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) $<
773

774 775
$(OUTPUT)util/exec_cmd.o: util/exec_cmd.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) \
776
		'-DPERF_EXEC_PATH="$(perfexecdir_SQ)"' \
777 778 779 780
		'-DBINDIR="$(bindir_relative_SQ)"' \
		'-DPREFIX="$(prefix_SQ)"' \
		$<

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

784 785 786
$(OUTPUT)util/ui/browser.o: util/ui/browser.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

787 788 789
$(OUTPUT)util/ui/browsers/annotate.o: util/ui/browsers/annotate.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

790 791 792
$(OUTPUT)util/ui/browsers/top.o: util/ui/browsers/top.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

793 794 795
$(OUTPUT)util/ui/browsers/hists.o: util/ui/browsers/hists.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

796 797 798
$(OUTPUT)util/ui/browsers/map.o: util/ui/browsers/map.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DENABLE_SLFUTURE_CONST $<

799 800
$(OUTPUT)util/rbtree.o: ../../lib/rbtree.c $(OUTPUT)PERF-CFLAGS
	$(QUIET_CC)$(CC) -o $@ -c $(ALL_CFLAGS) -DETC_PERFCONFIG='"$(ETC_PERFCONFIG_SQ)"' $<
801

802 803
$(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 $<
804

805 806
$(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 $<
807

808 809
$(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 $<
810

811 812
$(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 $<
813

814
$(OUTPUT)perf-%: %.o $(PERFLIBS)
815 816 817
	$(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)

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

820 821 822
# 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 已提交
823
$(DIRECTORY_DEPS): | $(sort $(dir $(DIRECTORY_DEPS)))
824 825 826 827
# In the second step, we make a rule to actually create these directories
$(sort $(dir $(DIRECTORY_DEPS))):
	$(QUIET_MKDIR)$(MKDIR) -p $@ 2>/dev/null

828 829 830
$(LIB_FILE): $(LIB_OBJS)
	$(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)

831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860
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 '  distclean		- alias to clean'
	@echo '  clean			- clean all binary objects and build output'

861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
doc:
	$(MAKE) -C Documentation all

man:
	$(MAKE) -C Documentation man

html:
	$(MAKE) -C Documentation html

info:
	$(MAKE) -C Documentation info

pdf:
	$(MAKE) -C Documentation pdf

876 877 878 879 880 881 882 883 884 885 886 887 888 889
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)):\
890
             $(bindir_SQ):$(perfexecdir_SQ):$(template_dir_SQ):$(prefix_SQ)
891

892
$(OUTPUT)PERF-CFLAGS: .FORCE-PERF-CFLAGS
893
	@FLAGS='$(TRACK_CFLAGS)'; \
894
	    if test x"$$FLAGS" != x"`cat $(OUTPUT)PERF-CFLAGS 2>/dev/null`" ; then \
895
		echo 1>&2 "    * new build flags or prefix"; \
896
		echo "$$FLAGS" >$(OUTPUT)PERF-CFLAGS; \
897 898 899
            fi

# We need to apply sq twice, once to protect from the shell
900
# that runs $(OUTPUT)PERF-BUILD-OPTIONS, and then again to protect it
901
# and the first level quoting from the shell that runs "echo".
902
$(OUTPUT)PERF-BUILD-OPTIONS: .FORCE-PERF-BUILD-OPTIONS
903 904 905 906 907 908 909
	@echo SHELL_PATH=\''$(subst ','\'',$(SHELL_PATH_SQ))'\' >$@
	@echo TAR=\''$(subst ','\'',$(subst ','\'',$(TAR)))'\' >>$@
	@echo NO_CURL=\''$(subst ','\'',$(subst ','\'',$(NO_CURL)))'\' >>$@
	@echo NO_PERL=\''$(subst ','\'',$(subst ','\'',$(NO_PERL)))'\' >>$@

### Testing rules

910 911 912 913
#
# None right now:
#
# TEST_PROGRAMS += test-something$X
914 915 916 917 918 919 920

all:: $(TEST_PROGRAMS)

# GNU make supports exporting all variables by "export" without parameters.
# However, the environment gets quite big, and some programs have problems
# with that.

921
check: $(OUTPUT)common-cmds.h
922 923
	if sparse; \
	then \
924
		for i in *.c */*.c; \
925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944
		do \
			sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; \
		done; \
	else \
		echo 2>&1 "Did you mean 'make test'?"; \
		exit 1; \
	fi

remove-dashes:
	./fixup-builtins $(BUILT_INS) $(PROGRAMS) $(SCRIPTS)

### Installation rules

ifneq ($(filter /%,$(firstword $(template_dir))),)
template_instdir = $(template_dir)
else
template_instdir = $(prefix)/$(template_dir)
endif
export template_instdir

945 946
ifneq ($(filter /%,$(firstword $(perfexecdir))),)
perfexec_instdir = $(perfexecdir)
947
else
948
perfexec_instdir = $(prefix)/$(perfexecdir)
949
endif
950 951
perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
export perfexec_instdir
952 953 954

install: all
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'
955
	$(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'
956 957
	$(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'
958
	$(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
959 960 961
	$(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'
962
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'
963
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'
964
	$(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'
965 966
	$(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'
967

968 969 970
ifdef BUILT_INS
	$(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
	$(INSTALL) $(BUILT_INS) '$(DESTDIR_SQ)$(perfexec_instdir_SQ)'
971
ifneq (,$X)
972
	$(foreach p,$(patsubst %$X,%,$(filter %$X,$(ALL_PROGRAMS) $(BUILT_INS) $(OUTPUT)perf$X)), $(RM) '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/$p';)
973
endif
974
endif
975

976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000
install-doc:
	$(MAKE) -C Documentation install

install-man:
	$(MAKE) -C Documentation install-man

install-html:
	$(MAKE) -C Documentation install-html

install-info:
	$(MAKE) -C Documentation install-info

install-pdf:
	$(MAKE) -C Documentation install-pdf

quick-install-doc:
	$(MAKE) -C Documentation quick-install

quick-install-man:
	$(MAKE) -C Documentation quick-install-man

quick-install-html:
	$(MAKE) -C Documentation quick-install-html


1001
### Maintainer's dist rules
1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045
#
# None right now
#
#
# perf.spec: perf.spec.in
#	sed -e 's/@@VERSION@@/$(PERF_VERSION)/g' < $< > $@+
#	mv $@+ $@
#
# PERF_TARNAME=perf-$(PERF_VERSION)
# dist: perf.spec perf-archive$(X) configure
#	./perf-archive --format=tar \
#		--prefix=$(PERF_TARNAME)/ HEAD^{tree} > $(PERF_TARNAME).tar
#	@mkdir -p $(PERF_TARNAME)
#	@cp perf.spec configure $(PERF_TARNAME)
#	@echo $(PERF_VERSION) > $(PERF_TARNAME)/version
#	$(TAR) rf $(PERF_TARNAME).tar \
#		$(PERF_TARNAME)/perf.spec \
#		$(PERF_TARNAME)/configure \
#		$(PERF_TARNAME)/version
#	@$(RM) -r $(PERF_TARNAME)
#	gzip -f -9 $(PERF_TARNAME).tar
#
# htmldocs = perf-htmldocs-$(PERF_VERSION)
# manpages = perf-manpages-$(PERF_VERSION)
# dist-doc:
#	$(RM) -r .doc-tmp-dir
#	mkdir .doc-tmp-dir
#	$(MAKE) -C Documentation WEBDOC_DEST=../.doc-tmp-dir install-webdoc
#	cd .doc-tmp-dir && $(TAR) cf ../$(htmldocs).tar .
#	gzip -n -9 -f $(htmldocs).tar
#	:
#	$(RM) -r .doc-tmp-dir
#	mkdir -p .doc-tmp-dir/man1 .doc-tmp-dir/man5 .doc-tmp-dir/man7
#	$(MAKE) -C Documentation DESTDIR=./ \
#		man1dir=../.doc-tmp-dir/man1 \
#		man5dir=../.doc-tmp-dir/man5 \
#		man7dir=../.doc-tmp-dir/man7 \
#		install
#	cd .doc-tmp-dir && $(TAR) cf ../$(manpages).tar .
#	gzip -n -9 -f $(manpages).tar
#	$(RM) -r .doc-tmp-dir
#
# rpm: dist
#	$(RPMBUILD) -ta $(PERF_TARNAME).tar.gz
1046 1047 1048 1049

### Cleaning rules

distclean: clean
1050
#	$(RM) configure
1051 1052

clean:
1053
	$(RM) $(OUTPUT){*.o,*/*.o,*/*/*.o,*/*/*/*.o,$(LIB_FILE),perf-archive}
1054
	$(RM) $(ALL_PROGRAMS) $(BUILT_INS) perf
1055
	$(RM) $(TEST_PROGRAMS)
1056
	$(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope*
1057 1058
	$(RM) -r $(PERF_TARNAME) .doc-tmp-dir
	$(RM) $(PERF_TARNAME).tar.gz perf-core_$(PERF_VERSION)-*.tar.gz
1059
	$(RM) $(htmldocs).tar.gz $(manpages).tar.gz
1060
	$(MAKE) -C Documentation/ clean
1061
	$(RM) $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)PERF-CFLAGS $(OUTPUT)PERF-BUILD-OPTIONS
1062 1063
	@python util/setup.py clean --build-lib='$(OUTPUT)python' \
				   --build-temp='$(OUTPUT)python/temp'
1064 1065 1066

.PHONY: all install clean strip
.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell
1067 1068
.PHONY: .FORCE-PERF-VERSION-FILE TAGS tags cscope .FORCE-PERF-CFLAGS
.PHONY: .FORCE-PERF-BUILD-OPTIONS
1069

1070
### Make sure built-ins do not have dups and listed in perf.c
1071 1072 1073 1074 1075 1076
#
check-builtins::
	./check-builtins.sh

### Test suite coverage testing
#
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100
# None right now
#
# .PHONY: coverage coverage-clean coverage-build coverage-report
#
# coverage:
#	$(MAKE) coverage-build
#	$(MAKE) coverage-report
#
# coverage-clean:
#	rm -f *.gcda *.gcno
#
# COVERAGE_CFLAGS = $(CFLAGS) -O0 -ftest-coverage -fprofile-arcs
# COVERAGE_LDFLAGS = $(CFLAGS)  -O0 -lgcov
#
# coverage-build: coverage-clean
#	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" all
#	$(MAKE) CFLAGS="$(COVERAGE_CFLAGS)" LDFLAGS="$(COVERAGE_LDFLAGS)" \
#		-j1 test
#
# coverage-report:
#	gcov -b *.c */*.c
#	grep '^function.*called 0 ' *.c.gcov */*.c.gcov \
#		| sed -e 's/\([^:]*\)\.gcov: *function \([^ ]*\) called.*/\1: \2/' \
#		| tee coverage-untested-functions