Makefile 19.1 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 197 198

VF_FEATURE_TESTS =			\
	backtrace			\
	fortify-source			\
	gtk2-infobar			\
	libelf-getphdrnum		\
	libelf-mmap			\
	libpython-version		\
	on-exit				\
	stackprotector-all		\
	timerfd				\
	libunwind-debug-frame		\
	bionic

199 200 201 202 203 204 205 206 207 208 209
# 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)))

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

#
# Just in case the build freshly failed, make sure we print the
# feature matrix:
#
219
ifeq ($(feature-all), 1)
220 221 222 223
  #
  # test-all.c passed - just set all the core feature flags to 1:
  #
  $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_set,$(feat)))
224
else
225
  $(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)
226
  $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_check,$(feat)))
227 228
endif

229
ifeq ($(feature-stackprotector-all), 1)
230
  CFLAGS += -fstack-protector-all
231 232
endif

233
ifeq ($(DEBUG),0)
234
  ifeq ($(feature-fortify-source), 1)
235 236
    CFLAGS += -D_FORTIFY_SOURCE=2
  endif
237 238
endif

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

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

254 255
CFLAGS += -I$(src-perf)/util
CFLAGS += -I$(src-perf)
256
CFLAGS += -I$(LIB_INCLUDE)
257

258
CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
259

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

ifdef NO_LIBELF
270 271 272
  NO_DWARF := 1
  NO_DEMANGLE := 1
  NO_LIBUNWIND := 1
273
  NO_LIBDW_DWARF_UNWIND := 1
274
else
275
  ifeq ($(feature-libelf), 0)
276
    ifeq ($(feature-glibc), 1)
277 278 279 280 281 282 283 284 285 286 287
      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
288 289
      NO_LIBUNWIND := 1
      NO_LIBDW_DWARF_UNWIND := 1
290 291 292
    else
      msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
    endif
293
  else
294 295 296 297 298 299
    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
300
    ifneq ($(feature-dwarf), 1)
301 302 303
      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
304
  endif # libelf support
305 306 307
endif # NO_LIBELF

ifndef NO_LIBELF
308
  CFLAGS += -DHAVE_LIBELF_SUPPORT
309

310
  ifeq ($(feature-libelf-mmap), 1)
311 312
    CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
  endif
313

314
  ifeq ($(feature-libelf-getphdrnum), 1)
315 316 317 318 319
    CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
  endif

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

321 322 323 324 325 326 327 328 329 330
  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
331
endif # NO_LIBELF
332 333

ifndef NO_LIBUNWIND
334
  ifneq ($(feature-libunwind), 1)
335
    msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
336
    NO_LIBUNWIND := 1
337 338 339 340 341 342 343 344 345 346 347
  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
348
  else
349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
    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);
370 371
      CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
    endif
372 373 374 375 376 377 378 379
  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)
380
endif
381 382

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

ifdef NO_NEWT
393
  NO_SLANG=1
394 395 396
endif

ifndef NO_SLANG
397
  ifneq ($(feature-libslang), 1)
398 399 400 401 402
    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
403
    CFLAGS += -DHAVE_SLANG_SUPPORT
404 405
    EXTLIBS += -lslang
  endif
406
endif
407 408

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

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

ifdef NO_LIBPERL
428
  CFLAGS += -DNO_LIBPERL
429
else
430 431 432 433 434 435
  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)

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

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

451 452
disable-python = $(eval $(disable-python_code))
define disable-python_code
453
  CFLAGS += -DNO_LIBPYTHON
454 455 456 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
  $(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)

487
      ifneq ($(feature-libpython), 1)
488 489 490
        $(call disable-python,Python.h (for Python 2.x))
      else

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

514
ifeq ($(feature-libbfd), 1)
515
  EXTLIBS += -lbfd -lz -liberty
516 517
endif

518
ifdef NO_DEMANGLE
519
  CFLAGS += -DNO_DEMANGLE
520
else
521
  ifdef HAVE_CPLUS_DEMANGLE_SUPPORT
522
    EXTLIBS += -liberty
523
    CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
524
  else
525
    ifneq ($(feature-libbfd), 1)
526
      $(call feature_check,liberty)
527
      ifeq ($(feature-liberty), 1)
528 529
        EXTLIBS += -lbfd -liberty
      else
530
        $(call feature_check,liberty-z)
531
        ifeq ($(feature-liberty-z), 1)
532 533
          EXTLIBS += -lbfd -liberty -lz
        else
534
          $(call feature_check,cplus-demangle)
535
          ifeq ($(feature-cplus-demangle), 1)
536
            EXTLIBS += -liberty
537
            CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
538 539 540 541 542 543 544 545
          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
546
endif
547

548 549 550 551
ifneq ($(filter -lbfd,$(EXTLIBS)),)
  CFLAGS += -DHAVE_LIBBFD_SUPPORT
endif

552
ifndef NO_ON_EXIT
553
  ifeq ($(feature-on-exit), 1)
554
    CFLAGS += -DHAVE_ON_EXIT_SUPPORT
555
  endif
556 557 558
endif

ifndef NO_BACKTRACE
559
  ifeq ($(feature-backtrace), 1)
560
    CFLAGS += -DHAVE_BACKTRACE_SUPPORT
561
  endif
562
endif
563 564

ifndef NO_LIBNUMA
565
  ifeq ($(feature-libnuma), 0)
566
    msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev);
567 568
    NO_LIBNUMA := 1
  else
569
    CFLAGS += -DHAVE_LIBNUMA_SUPPORT
570 571
    EXTLIBS += -lnuma
  endif
572
endif
573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604

# 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
605 606 607
ifeq ($(IS_X86_64),1)
lib = lib64
else
608
lib = lib
609 610
endif
libdir = $(prefix)/$(lib)
611 612 613 614 615 616 617 618 619 620 621 622

# 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))
623
libdir_SQ = $(subst ','\'',$(libdir))
624 625 626 627 628 629 630

ifneq ($(filter /%,$(firstword $(perfexecdir))),)
perfexec_instdir = $(perfexecdir)
else
perfexec_instdir = $(prefix)/$(perfexecdir)
endif
perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
631 632 633 634 635 636

# 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
637
plugindir_SQ= $(subst ','\'',$(plugindir))
638
endif
639 640 641 642

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

645
define feature_print_status_code
646 647 648 649 650 651 652
  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

653 654 655 656 657 658 659 660 661 662
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

663 664 665
PERF_FEATURES := $(foreach feat,$(LIB_FEATURE_TESTS),feature-$(feat)($(feature-$(feat))))
PERF_FEATURES_FILE := $(shell touch $(OUTPUT)PERF-FEATURES; cat $(OUTPUT)PERF-FEATURES)

666 667 668 669
ifeq ($(dwarf-post-unwind),1)
  PERF_FEATURES += dwarf-post-unwind($(dwarf-post-unwind-text))
endif

670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
# 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:)
699
  $(foreach feat,$(LIB_FEATURE_TESTS),$(call feature_print_status,$(feat),))
700 701 702 703

  ifeq ($(dwarf-post-unwind),1)
    $(call feature_print_text,"DWARF post unwind library", $(dwarf-post-unwind-text))
  endif
704 705 706
endif

ifeq ($(display_vf),1)
707 708 709 710 711 712
  $(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)
713 714
  $(call feature_print_var,LIBUNWIND_DIR)
  $(call feature_print_var,LIBDW_DIR)
715 716 717 718 719
endif

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