Makefile 19.3 KB
Newer Older
1

2 3 4
ifeq ($(src-perf),)
src-perf := $(srctree)/tools/perf
endif
5

6 7
ifeq ($(obj-perf),)
obj-perf := $(OUTPUT)
8 9
endif

10 11 12 13 14 15 16 17 18 19 20 21 22
ifneq ($(obj-perf),)
obj-perf := $(abspath $(obj-perf))/
endif

LIB_INCLUDE := $(srctree)/tools/lib/
CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)

include $(src-perf)/config/Makefile.arch

NO_PERF_REGS := 1

# Additional ARCH settings for x86
ifeq ($(ARCH),x86)
23
  ifeq (${IS_X86_64}, 1)
24
    CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
25
    ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
26 27 28
    LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
  else
    LIBUNWIND_LIBS = -lunwind -lunwind-x86
29 30
  endif
  NO_PERF_REGS := 0
31
endif
32 33 34 35
ifeq ($(ARCH),arm)
  NO_PERF_REGS := 0
  LIBUNWIND_LIBS = -lunwind -lunwind-arm
endif
36

37 38 39 40 41 42 43 44
# So far there's only x86 libdw unwind support merged in perf.
# Disable it on all other architectures in case libdw unwind
# support is detected in system. Add supported architectures
# to the check.
ifneq ($(ARCH),x86)
  NO_LIBDW_DWARF_UNWIND := 1
endif

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
ifeq ($(LIBUNWIND_LIBS),)
  NO_LIBUNWIND := 1
else
  #
  # 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
  LIBUNWIND_LDFLAGS += $(LIBUNWIND_LIBS)

  # Set per-feature check compilation flags
  FEATURE_CHECK_CFLAGS-libunwind = $(LIBUNWIND_CFLAGS)
  FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS)
  FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS)
  FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS)
endif

66
ifeq ($(NO_PERF_REGS),0)
67
  CFLAGS += -DHAVE_PERF_REGS_SUPPORT
68
endif
69

70 71 72 73 74 75 76
ifndef NO_LIBELF
  # 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
77 78
  FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS)
  FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) -ldw
79 80
endif

81 82 83 84
# include ARCH specific config
-include $(src-perf)/arch/$(ARCH)/Makefile

include $(src-perf)/config/utilities.mak
85 86

ifeq ($(call get-executable,$(FLEX)),)
87
  dummy := $(error Error: $(FLEX) is missing on this system, please install it)
88 89 90
endif

ifeq ($(call get-executable,$(BISON)),)
91
  dummy := $(error Error: $(BISON) is missing on this system, please install it)
92
endif
93 94 95

# Treat warnings as errors unless directed not to
ifneq ($(WERROR),0)
96
  CFLAGS += -Werror
97 98
endif

A
Adrian Hunter 已提交
99 100 101 102
ifndef DEBUG
  DEBUG := 0
endif

103
ifeq ($(DEBUG),0)
104
  CFLAGS += -O6
105 106 107
endif

ifdef PARSER_DEBUG
108 109 110
  PARSER_DEBUG_BISON := -t
  PARSER_DEBUG_FLEX  := -d
  CFLAGS             += -DPARSER_DEBUG
111 112
endif

113 114 115 116 117 118
CFLAGS += -fno-omit-frame-pointer
CFLAGS += -ggdb3
CFLAGS += -funwind-tables
CFLAGS += -Wall
CFLAGS += -Wextra
CFLAGS += -std=gnu99
119

120
EXTLIBS = -lelf -lpthread -lrt -lm -ldl
121

122 123 124 125 126
ifneq ($(OUTPUT),)
  OUTPUT_FEATURES = $(OUTPUT)config/feature-checks/
  $(shell mkdir -p $(OUTPUT_FEATURES))
endif

127
feature_check = $(eval $(feature_check_code))
128
define feature_check_code
129
  feature-$(1) := $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS) $(FEATURE_CHECK_CFLAGS-$(1))" LDFLAGS="$(LDFLAGS) $(FEATURE_CHECK_LDFLAGS-$(1))" -C config/feature-checks test-$1.bin >/dev/null 2>/dev/null && echo 1 || echo 0)
130 131 132 133 134
endef

feature_set = $(eval $(feature_set_code))
define feature_set_code
  feature-$(1) := 1
135 136 137 138 139 140
endef

#
# Build the feature check binaries in parallel, ignore errors, ignore return value and suppress output:
#

141 142 143 144 145 146 147 148 149 150 151
#
# Note that this is not a complete list of all feature tests, just
# those that are typically built on a fully configured system.
#
# [ Feature tests not mentioned here have to be built explicitly in
#   the rule that uses them - an example for that is the 'bionic'
#   feature check. ]
#
CORE_FEATURE_TESTS =			\
	backtrace			\
	dwarf				\
152
	fortify-source			\
153
	glibc				\
154
	gtk2				\
155
	gtk2-infobar			\
156 157 158 159 160 161
	libaudit			\
	libbfd				\
	libelf				\
	libelf-getphdrnum		\
	libelf-mmap			\
	libnuma				\
162
	libperl				\
163
	libpython			\
164
	libpython-version		\
165 166
	libslang			\
	libunwind			\
167
	on-exit				\
168
	stackprotector-all		\
169 170
	timerfd				\
	libdw-dwarf-unwind
171

172 173 174 175 176 177 178 179 180 181 182
LIB_FEATURE_TESTS =			\
	dwarf				\
	glibc				\
	gtk2				\
	libaudit			\
	libbfd				\
	libelf				\
	libnuma				\
	libperl				\
	libpython			\
	libslang			\
183 184
	libunwind			\
	libdw-dwarf-unwind
185 186 187 188 189 190 191 192 193 194 195 196

VF_FEATURE_TESTS =			\
	backtrace			\
	fortify-source			\
	gtk2-infobar			\
	libelf-getphdrnum		\
	libelf-mmap			\
	libpython-version		\
	on-exit				\
	stackprotector-all		\
	timerfd				\
	libunwind-debug-frame		\
197 198 199 200
	bionic				\
	liberty				\
	liberty-z			\
	cplus-demangle
201

202 203 204 205 206 207 208 209 210 211 212
# Set FEATURE_CHECK_(C|LD)FLAGS-all for all CORE_FEATURE_TESTS features.
# If in the future we need per-feature checks/flags for features not
# mentioned in this list we need to refactor this ;-).
set_test_all_flags = $(eval $(set_test_all_flags_code))
define set_test_all_flags_code
  FEATURE_CHECK_CFLAGS-all  += $(FEATURE_CHECK_CFLAGS-$(1))
  FEATURE_CHECK_LDFLAGS-all += $(FEATURE_CHECK_LDFLAGS-$(1))
endef

$(foreach feat,$(CORE_FEATURE_TESTS),$(call set_test_all_flags,$(feat)))

213 214 215
#
# Special fast-path for the 'all features are available' case:
#
216 217 218 219 220 221
$(call feature_check,all,$(MSG))

#
# Just in case the build freshly failed, make sure we print the
# feature matrix:
#
222
ifeq ($(feature-all), 1)
223 224 225 226
  #
  # test-all.c passed - just set all the core feature flags to 1:
  #
  $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_set,$(feat)))
227
else
228
  $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS)" LDFLAGS=$(LDFLAGS) -i -j -C config/feature-checks $(addsuffix .bin,$(CORE_FEATURE_TESTS)) >/dev/null 2>&1)
229
  $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_check,$(feat)))
230 231
endif

232
ifeq ($(feature-stackprotector-all), 1)
233
  CFLAGS += -fstack-protector-all
234 235
endif

236
ifeq ($(DEBUG),0)
237
  ifeq ($(feature-fortify-source), 1)
238 239
    CFLAGS += -D_FORTIFY_SOURCE=2
  endif
240 241
endif

242 243
CFLAGS += -I$(src-perf)/util/include
CFLAGS += -I$(src-perf)/arch/$(ARCH)/include
244
CFLAGS += -I$(srctree)/tools/include/
245 246 247 248
CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi
CFLAGS += -I$(srctree)/arch/$(ARCH)/include
CFLAGS += -I$(srctree)/include/uapi
CFLAGS += -I$(srctree)/include
249 250 251 252

# $(obj-perf)      for generated common-cmds.h
# $(obj-perf)/util for generated bison/flex headers
ifneq ($(OUTPUT),)
253 254
CFLAGS += -I$(obj-perf)/util
CFLAGS += -I$(obj-perf)
255 256
endif

257 258
CFLAGS += -I$(src-perf)/util
CFLAGS += -I$(src-perf)
259
CFLAGS += -I$(LIB_INCLUDE)
260

261
CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
262

263
ifndef NO_BIONIC
264
  $(call feature_check,bionic)
265 266 267 268 269
  ifeq ($(feature-bionic), 1)
    BIONIC := 1
    EXTLIBS := $(filter-out -lrt,$(EXTLIBS))
    EXTLIBS := $(filter-out -lpthread,$(EXTLIBS))
  endif
270
endif
271 272

ifdef NO_LIBELF
273 274 275
  NO_DWARF := 1
  NO_DEMANGLE := 1
  NO_LIBUNWIND := 1
276
  NO_LIBDW_DWARF_UNWIND := 1
277
else
278
  ifeq ($(feature-libelf), 0)
279
    ifeq ($(feature-glibc), 1)
280 281 282 283 284 285 286 287 288 289 290
      LIBC_SUPPORT := 1
    endif
    ifeq ($(BIONIC),1)
      LIBC_SUPPORT := 1
    endif
    ifeq ($(LIBC_SUPPORT),1)
      msg := $(warning No libelf found, disables 'probe' tool, please install elfutils-libelf-devel/libelf-dev);

      NO_LIBELF := 1
      NO_DWARF := 1
      NO_DEMANGLE := 1
291 292
      NO_LIBUNWIND := 1
      NO_LIBDW_DWARF_UNWIND := 1
293 294 295
    else
      msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
    endif
296
  else
297 298 299 300 301 302
    ifndef NO_LIBDW_DWARF_UNWIND
      ifneq ($(feature-libdw-dwarf-unwind),1)
        NO_LIBDW_DWARF_UNWIND := 1
        msg := $(warning No libdw DWARF unwind found, Please install elfutils-devel/libdw-dev >= 0.158 and/or set LIBDW_DIR);
      endif
    endif
303
    ifneq ($(feature-dwarf), 1)
304 305 306
      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
307
  endif # libelf support
308 309 310
endif # NO_LIBELF

ifndef NO_LIBELF
311
  CFLAGS += -DHAVE_LIBELF_SUPPORT
312

313
  ifeq ($(feature-libelf-mmap), 1)
314 315
    CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
  endif
316

317
  ifeq ($(feature-libelf-getphdrnum), 1)
318 319 320 321 322
    CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
  endif

  # include ARCH specific config
  -include $(src-perf)/arch/$(ARCH)/Makefile
323

324 325 326 327 328 329 330 331 332 333
  ifndef NO_DWARF
    ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
      msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled);
      NO_DWARF := 1
    else
      CFLAGS += -DHAVE_DWARF_SUPPORT $(LIBDW_CFLAGS)
      LDFLAGS += $(LIBDW_LDFLAGS)
      EXTLIBS += -lelf -ldw
    endif # PERF_HAVE_DWARF_REGS
  endif # NO_DWARF
334
endif # NO_LIBELF
335 336

ifndef NO_LIBUNWIND
337
  ifneq ($(feature-libunwind), 1)
338
    msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
339
    NO_LIBUNWIND := 1
340 341 342 343 344 345 346 347 348 349 350
  endif
endif

dwarf-post-unwind := 1
dwarf-post-unwind-text := BUG

# setup DWARF post unwinder
ifdef NO_LIBUNWIND
  ifdef NO_LIBDW_DWARF_UNWIND
    msg := $(warning Disabling post unwind, no support found.);
    dwarf-post-unwind := 0
351
  else
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372
    dwarf-post-unwind-text := libdw
  endif
else
  dwarf-post-unwind-text := libunwind
  # Enable libunwind support by default.
  ifndef NO_LIBDW_DWARF_UNWIND
    NO_LIBDW_DWARF_UNWIND := 1
  endif
endif

ifeq ($(dwarf-post-unwind),1)
  CFLAGS += -DHAVE_DWARF_UNWIND_SUPPORT
else
  NO_DWARF_UNWIND := 1
endif

ifndef NO_LIBUNWIND
  ifeq ($(ARCH),arm)
    $(call feature_check,libunwind-debug-frame)
    ifneq ($(feature-libunwind-debug-frame), 1)
      msg := $(warning No debug_frame support found in libunwind);
373 374
      CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
    endif
375 376 377 378 379 380 381 382
  else
    # non-ARM has no dwarf_find_debug_frame() function:
    CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
  endif
  CFLAGS  += -DHAVE_LIBUNWIND_SUPPORT
  EXTLIBS += $(LIBUNWIND_LIBS)
  CFLAGS  += $(LIBUNWIND_CFLAGS)
  LDFLAGS += $(LIBUNWIND_LDFLAGS)
383
endif
384 385

ifndef NO_LIBAUDIT
386
  ifneq ($(feature-libaudit), 1)
387 388 389
    msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
    NO_LIBAUDIT := 1
  else
390
    CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
391 392
    EXTLIBS += -laudit
  endif
393
endif
394 395

ifdef NO_NEWT
396
  NO_SLANG=1
397 398 399
endif

ifndef NO_SLANG
400
  ifneq ($(feature-libslang), 1)
401 402 403 404 405
    msg := $(warning slang not found, disables TUI support. Please install slang-devel or libslang-dev);
    NO_SLANG := 1
  else
    # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
    CFLAGS += -I/usr/include/slang
406
    CFLAGS += -DHAVE_SLANG_SUPPORT
407 408
    EXTLIBS += -lslang
  endif
409
endif
410 411

ifndef NO_GTK2
M
Mark Rutland 已提交
412
  FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
413
  ifneq ($(feature-gtk2), 1)
414 415 416
    msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
    NO_GTK2 := 1
  else
417
    ifeq ($(feature-gtk2-infobar), 1)
418
      GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
419
    endif
420
    CFLAGS += -DHAVE_GTK2_SUPPORT
M
Mark Rutland 已提交
421 422
    GTK_CFLAGS += $(shell $(PKG_CONFIG) --cflags gtk+-2.0 2>/dev/null)
    GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk+-2.0 2>/dev/null)
423
    EXTLIBS += -ldl
424
  endif
425
endif
426 427 428 429 430

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

ifdef NO_LIBPERL
431
  CFLAGS += -DNO_LIBPERL
432
else
433 434 435 436 437 438
  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))
  PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null`
  FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS)

439
  ifneq ($(feature-libperl), 1)
440 441 442 443 444 445
    CFLAGS += -DNO_LIBPERL
    NO_LIBPERL := 1
  else
    LDFLAGS += $(PERL_EMBED_LDFLAGS)
    EXTLIBS += $(PERL_EMBED_LIBADD)
  endif
446
endif
447

448 449 450 451 452 453
ifeq ($(feature-timerfd), 1)
  CFLAGS += -DHAVE_TIMERFD_SUPPORT
else
  msg := $(warning No timerfd support. Disables 'perf kvm stat live');
endif

454 455
disable-python = $(eval $(disable-python_code))
define disable-python_code
456
  CFLAGS += -DNO_LIBPYTHON
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489
  $(if $(1),$(warning No $(1) was found))
  $(warning Python support will not be built)
  NO_LIBPYTHON := 1
endef

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

ifndef PYTHON
  $(call disable-python,python interpreter)
else

  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)

490
      ifneq ($(feature-libpython), 1)
491 492 493
        $(call disable-python,Python.h (for Python 2.x))
      else

494
        ifneq ($(feature-libpython-version), 1)
495 496 497 498 499 500 501 502 503 504 505 506 507
          $(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
508
          LDFLAGS += $(PYTHON_EMBED_LDFLAGS)
509
          EXTLIBS += $(PYTHON_EMBED_LIBADD)
510
          LANG_BINDINGS += $(obj-perf)python/perf.so
511 512 513 514 515
        endif
      endif
    endif
  endif
endif
516

517
ifeq ($(feature-libbfd), 1)
518 519 520 521 522 523 524 525 526 527 528 529 530 531 532
  EXTLIBS += -lbfd

  # call all detections now so we get correct
  # status in VF output
  $(call feature_check,liberty)
  $(call feature_check,liberty-z)
  $(call feature_check,cplus-demangle)

  ifeq ($(feature-liberty), 1)
    EXTLIBS += -liberty
  else
    ifeq ($(feature-liberty-z), 1)
      EXTLIBS += -liberty -lz
    endif
  endif
533 534
endif

535
ifdef NO_DEMANGLE
536
  CFLAGS += -DNO_DEMANGLE
537
else
538
  ifdef HAVE_CPLUS_DEMANGLE_SUPPORT
539
    EXTLIBS += -liberty
540
    CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
541
  else
542
    ifneq ($(feature-libbfd), 1)
543 544 545 546
      ifneq ($(feature-liberty), 1)
        ifneq ($(feature-liberty-z), 1)
          # we dont have neither HAVE_CPLUS_DEMANGLE_SUPPORT
          # or any of 'bfd iberty z' trinity
547
          ifeq ($(feature-cplus-demangle), 1)
548
            EXTLIBS += -liberty
549
            CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
550 551 552 553 554 555 556 557
          else
            msg := $(warning No bfd.h/libbfd found, install binutils-dev[el]/zlib-static to gain symbol demangling)
            CFLAGS += -DNO_DEMANGLE
          endif
        endif
      endif
    endif
  endif
558
endif
559

560 561 562 563
ifneq ($(filter -lbfd,$(EXTLIBS)),)
  CFLAGS += -DHAVE_LIBBFD_SUPPORT
endif

564
ifndef NO_ON_EXIT
565
  ifeq ($(feature-on-exit), 1)
566
    CFLAGS += -DHAVE_ON_EXIT_SUPPORT
567
  endif
568 569 570
endif

ifndef NO_BACKTRACE
571
  ifeq ($(feature-backtrace), 1)
572
    CFLAGS += -DHAVE_BACKTRACE_SUPPORT
573
  endif
574
endif
575 576

ifndef NO_LIBNUMA
577
  ifeq ($(feature-libnuma), 0)
578
    msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev);
579 580
    NO_LIBNUMA := 1
  else
581
    CFLAGS += -DHAVE_LIBNUMA_SUPPORT
582 583
    EXTLIBS += -lnuma
  endif
584
endif
585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616

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

# Make the path relative to DESTDIR, not to prefix
ifndef DESTDIR
prefix = $(HOME)
endif
bindir_relative = bin
bindir = $(prefix)/$(bindir_relative)
mandir = share/man
infodir = share/info
perfexecdir = libexec/perf-core
sharedir = $(prefix)/share
template_dir = share/perf-core/templates
htmldir = share/doc/perf-doc
ifeq ($(prefix),/usr)
sysconfdir = /etc
ETC_PERFCONFIG = $(sysconfdir)/perfconfig
else
sysconfdir = $(prefix)/etc
ETC_PERFCONFIG = etc/perfconfig
endif
617 618 619
ifeq ($(IS_X86_64),1)
lib = lib64
else
620
lib = lib
621 622
endif
libdir = $(prefix)/$(lib)
623 624 625 626 627 628 629 630 631 632 633 634

# Shell quote (do not use $(call) to accommodate ancient setups);
ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG))
DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
bindir_SQ = $(subst ','\'',$(bindir))
mandir_SQ = $(subst ','\'',$(mandir))
infodir_SQ = $(subst ','\'',$(infodir))
perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
template_dir_SQ = $(subst ','\'',$(template_dir))
htmldir_SQ = $(subst ','\'',$(htmldir))
prefix_SQ = $(subst ','\'',$(prefix))
sysconfdir_SQ = $(subst ','\'',$(sysconfdir))
635
libdir_SQ = $(subst ','\'',$(libdir))
636 637 638 639 640 641 642

ifneq ($(filter /%,$(firstword $(perfexecdir))),)
perfexec_instdir = $(perfexecdir)
else
perfexec_instdir = $(prefix)/$(perfexecdir)
endif
perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
643 644 645 646 647 648

# If we install to $(HOME) we keep the traceevent default:
# $(HOME)/.traceevent/plugins
# Otherwise we install plugins into the global $(libdir).
ifdef DESTDIR
plugindir=$(libdir)/traceevent/plugins
649
plugindir_SQ= $(subst ','\'',$(plugindir))
650
endif
651 652 653 654

#
# Print the result of the feature test:
#
655
feature_print_status = $(eval $(feature_print_status_code)) $(info $(MSG))
656

657
define feature_print_status_code
658 659 660 661 662 663 664
  ifeq ($(feature-$(1)), 1)
    MSG = $(shell printf '...%30s: [ \033[32mon\033[m  ]' $(1))
  else
    MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(1))
  endif
endef

665 666 667 668 669 670 671 672 673 674
feature_print_var = $(eval $(feature_print_var_code)) $(info $(MSG))
define feature_print_var_code
    MSG = $(shell printf '...%30s: %s' $(1) $($(1)))
endef

feature_print_text = $(eval $(feature_print_text_code)) $(info $(MSG))
define feature_print_text_code
    MSG = $(shell printf '...%30s: %s' $(1) $(2))
endef

675 676 677
PERF_FEATURES := $(foreach feat,$(LIB_FEATURE_TESTS),feature-$(feat)($(feature-$(feat))))
PERF_FEATURES_FILE := $(shell touch $(OUTPUT)PERF-FEATURES; cat $(OUTPUT)PERF-FEATURES)

678 679 680 681
ifeq ($(dwarf-post-unwind),1)
  PERF_FEATURES += dwarf-post-unwind($(dwarf-post-unwind-text))
endif

682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710
# The $(display_lib) controls the default detection message
# output. It's set if:
# - detected features differes from stored features from
#   last build (in PERF-FEATURES file)
# - one of the $(LIB_FEATURE_TESTS) is not detected
# - VF is enabled

ifneq ("$(PERF_FEATURES)","$(PERF_FEATURES_FILE)")
  $(shell echo "$(PERF_FEATURES)" > $(OUTPUT)PERF-FEATURES)
  display_lib := 1
endif

feature_check = $(eval $(feature_check_code))
define feature_check_code
  ifneq ($(feature-$(1)), 1)
    display_lib := 1
  endif
endef

$(foreach feat,$(LIB_FEATURE_TESTS),$(call feature_check,$(feat)))

ifeq ($(VF),1)
  display_lib := 1
  display_vf := 1
endif

ifeq ($(display_lib),1)
  $(info )
  $(info Auto-detecting system features:)
711
  $(foreach feat,$(LIB_FEATURE_TESTS),$(call feature_print_status,$(feat),))
712 713 714 715

  ifeq ($(dwarf-post-unwind),1)
    $(call feature_print_text,"DWARF post unwind library", $(dwarf-post-unwind-text))
  endif
716 717 718
endif

ifeq ($(display_vf),1)
719 720 721 722 723 724
  $(foreach feat,$(VF_FEATURE_TESTS),$(call feature_print_status,$(feat),))
  $(info )
  $(call feature_print_var,prefix)
  $(call feature_print_var,bindir)
  $(call feature_print_var,libdir)
  $(call feature_print_var,sysconfdir)
725 726
  $(call feature_print_var,LIBUNWIND_DIR)
  $(call feature_print_var,LIBDW_DIR)
727 728 729 730 731
endif

ifeq ($(display_lib),1)
  $(info )
endif