Makefile 15.1 KB
Newer Older
1 2 3
uname_M := $(shell uname -m 2>/dev/null || echo not)

ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
4 5 6 7
                                  -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/ -e s/aarch64.*/arm64/ )
8
NO_PERF_REGS := 1
9
CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
10 11 12

# Additional ARCH settings for x86
ifeq ($(ARCH),i386)
13 14 15
  override ARCH := x86
  NO_PERF_REGS := 0
  LIBUNWIND_LIBS = -lunwind -lunwind-x86
16 17 18
endif

ifeq ($(ARCH),x86_64)
19 20 21 22 23 24 25
  override ARCH := x86
  IS_X86_64 := 0
  ifeq (, $(findstring m32,$(CFLAGS)))
    IS_X86_64 := $(shell echo __x86_64__ | ${CC} -E -x c - | tail -n 1)
  endif
  ifeq (${IS_X86_64}, 1)
    RAW_ARCH := x86_64
26
    CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT
27
    ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
28 29 30
    LIBUNWIND_LIBS = -lunwind -lunwind-x86_64
  else
    LIBUNWIND_LIBS = -lunwind -lunwind-x86
31 32
  endif
  NO_PERF_REGS := 0
33 34 35
endif

ifeq ($(NO_PERF_REGS),0)
36
  CFLAGS += -DHAVE_PERF_REGS_SUPPORT
37
endif
38

39 40 41 42 43
ifeq ($(src-perf),)
src-perf := $(srctree)/tools/perf
endif

ifeq ($(obj-perf),)
44
obj-perf := $(OUTPUT)
45 46 47 48 49 50
endif

ifneq ($(obj-perf),)
obj-perf := $(abspath $(obj-perf))/
endif

51 52
LIB_INCLUDE := $(srctree)/tools/lib/

53 54 55 56
# include ARCH specific config
-include $(src-perf)/arch/$(ARCH)/Makefile

include $(src-perf)/config/utilities.mak
57 58

ifeq ($(call get-executable,$(FLEX)),)
59
  dummy := $(error Error: $(FLEX) is missing on this system, please install it)
60 61 62
endif

ifeq ($(call get-executable,$(BISON)),)
63
  dummy := $(error Error: $(BISON) is missing on this system, please install it)
64
endif
65 66 67

# Treat warnings as errors unless directed not to
ifneq ($(WERROR),0)
68
  CFLAGS += -Werror
69 70
endif

A
Adrian Hunter 已提交
71 72 73 74
ifndef DEBUG
  DEBUG := 0
endif

75
ifeq ($(DEBUG),0)
76
  CFLAGS += -O6
77 78 79
endif

ifdef PARSER_DEBUG
80 81 82
  PARSER_DEBUG_BISON := -t
  PARSER_DEBUG_FLEX  := -d
  CFLAGS             += -DPARSER_DEBUG
83 84
endif

85 86 87 88 89 90
CFLAGS += -fno-omit-frame-pointer
CFLAGS += -ggdb3
CFLAGS += -funwind-tables
CFLAGS += -Wall
CFLAGS += -Wextra
CFLAGS += -std=gnu99
91

92
EXTLIBS = -lelf -lpthread -lrt -lm -ldl
93

94 95 96 97 98
ifneq ($(OUTPUT),)
  OUTPUT_FEATURES = $(OUTPUT)config/feature-checks/
  $(shell mkdir -p $(OUTPUT_FEATURES))
endif

99
feature_check = $(eval $(feature_check_code))
100
define feature_check_code
101
  feature-$(1) := $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS)" LDFLAGS=$(LDFLAGS) LIBUNWIND_LIBS="$(LIBUNWIND_LIBS)" -C config/feature-checks test-$1 >/dev/null 2>/dev/null && echo 1 || echo 0)
102 103 104 105 106
endef

feature_set = $(eval $(feature_set_code))
define feature_set_code
  feature-$(1) := 1
107 108 109 110 111 112
endef

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

113 114 115 116 117 118 119 120 121 122 123
#
# 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				\
124
	fortify-source			\
125
	glibc				\
126
	gtk2				\
127
	gtk2-infobar			\
128 129 130 131 132 133
	libaudit			\
	libbfd				\
	libelf				\
	libelf-getphdrnum		\
	libelf-mmap			\
	libnuma				\
134
	libperl				\
135
	libpython			\
136
	libpython-version		\
137 138
	libslang			\
	libunwind			\
139
	on-exit				\
140
	stackprotector			\
141
	stackprotector-all
142

143 144 145 146 147
#
# So here we detect whether test-all was rebuilt, to be able
# to skip the print-out of the long features list if the file
# existed before and after it was built:
#
148
ifeq ($(wildcard $(OUTPUT)config/feature-checks/test-all),)
149 150 151 152 153
  test-all-failed := 1
else
  test-all-failed := 0
endif

154 155 156
#
# Special fast-path for the 'all features are available' case:
#
157 158 159 160 161 162 163 164 165 166 167 168 169 170
$(call feature_check,all,$(MSG))

#
# Just in case the build freshly failed, make sure we print the
# feature matrix:
#
ifeq ($(feature-all), 0)
  test-all-failed := 1
endif

ifeq ($(test-all-failed),1)
  $(info )
  $(info Auto-detecting system features:)
endif
171 172

ifeq ($(feature-all), 1)
173 174 175 176
  #
  # test-all.c passed - just set all the core feature flags to 1:
  #
  $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_set,$(feat)))
177
else
A
Adrian Hunter 已提交
178
  $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS)" LDFLAGS=$(LDFLAGS) -i -j -C config/feature-checks $(CORE_FEATURE_TESTS) >/dev/null 2>&1)
179
  $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_check,$(feat)))
180 181 182 183 184
endif

#
# Print the result of the feature test:
#
185 186
feature_print = $(eval $(feature_print_code)) $(info $(MSG))

187 188
define feature_print_code
  ifeq ($(feature-$(1)), 1)
189
    MSG = $(shell printf '...%30s: [ \033[32mon\033[m  ]' $(1))
190
  else
191
    MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(1))
192 193 194
  endif
endef

195 196 197 198
#
# Only print out our features if we rebuilt the testcases or if a test failed:
#
ifeq ($(test-all-failed), 1)
199
  $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_print,$(feat)))
200 201
  $(info )
endif
202

203
ifeq ($(feature-stackprotector-all), 1)
204
  CFLAGS += -fstack-protector-all
205 206
endif

207
ifeq ($(feature-stackprotector), 1)
208
  CFLAGS += -Wstack-protector
209 210
endif

211
ifeq ($(DEBUG),0)
212
  ifeq ($(feature-fortify-source), 1)
213 214
    CFLAGS += -D_FORTIFY_SOURCE=2
  endif
215 216
endif

217 218 219 220 221 222
CFLAGS += -I$(src-perf)/util/include
CFLAGS += -I$(src-perf)/arch/$(ARCH)/include
CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi
CFLAGS += -I$(srctree)/arch/$(ARCH)/include
CFLAGS += -I$(srctree)/include/uapi
CFLAGS += -I$(srctree)/include
223 224 225 226

# $(obj-perf)      for generated common-cmds.h
# $(obj-perf)/util for generated bison/flex headers
ifneq ($(OUTPUT),)
227 228
CFLAGS += -I$(obj-perf)/util
CFLAGS += -I$(obj-perf)
229 230
endif

231 232
CFLAGS += -I$(src-perf)/util
CFLAGS += -I$(src-perf)
233
CFLAGS += -I$(LIB_INCLUDE)
234

235
CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
236

237
ifndef NO_BIONIC
238 239 240 241 242 243
  $(feature_check,bionic)
  ifeq ($(feature-bionic), 1)
    BIONIC := 1
    EXTLIBS := $(filter-out -lrt,$(EXTLIBS))
    EXTLIBS := $(filter-out -lpthread,$(EXTLIBS))
  endif
244
endif
245 246

ifdef NO_LIBELF
247 248 249
  NO_DWARF := 1
  NO_DEMANGLE := 1
  NO_LIBUNWIND := 1
250
else
251
  ifeq ($(feature-libelf), 0)
252
    ifeq ($(feature-glibc), 1)
253 254 255 256 257 258 259 260 261 262 263 264 265 266
      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
    else
      msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
    endif
267
  else
268 269 270 271 272 273 274
    # 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

275
    ifneq ($(feature-dwarf), 1)
276 277 278
      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
279
  endif # libelf support
280 281 282
endif # NO_LIBELF

ifndef NO_LIBELF
283
  CFLAGS += -DHAVE_LIBELF_SUPPORT
284

285
  ifeq ($(feature-libelf-mmap), 1)
286 287
    CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
  endif
288

289
  ifeq ($(feature-libelf-getphdrnum), 1)
290 291 292 293 294
    CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
  endif

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

296 297 298 299 300 301 302 303 304 305
  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
306
endif # NO_LIBELF
307 308 309

# There's only x86 (both 32 and 64) support for CFI unwind so far
ifneq ($(ARCH),x86)
310
  NO_LIBUNWIND := 1
311 312 313
endif

ifndef NO_LIBUNWIND
314 315 316 317 318
  #
  # For linking with debug library, run like:
  #
  #   make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
  #
319 320 321 322
  ifdef LIBUNWIND_DIR
    LIBUNWIND_CFLAGS  := -I$(LIBUNWIND_DIR)/include
    LIBUNWIND_LDFLAGS := -L$(LIBUNWIND_DIR)/lib
  endif
323

324
  ifneq ($(feature-libunwind), 1)
325 326 327 328
    msg := $(warning No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 0.99);
    NO_LIBUNWIND := 1
  endif
endif
329 330

ifndef NO_LIBUNWIND
331
  CFLAGS += -DHAVE_LIBUNWIND_SUPPORT
332 333 334
  EXTLIBS += $(LIBUNWIND_LIBS)
  CFLAGS += $(LIBUNWIND_CFLAGS)
  LDFLAGS += $(LIBUNWIND_LDFLAGS)
335
endif
336 337

ifndef NO_LIBAUDIT
338
  ifneq ($(feature-libaudit), 1)
339 340 341
    msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
    NO_LIBAUDIT := 1
  else
342
    CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
343 344
    EXTLIBS += -laudit
  endif
345
endif
346 347

ifdef NO_NEWT
348
  NO_SLANG=1
349 350 351
endif

ifndef NO_SLANG
352
  ifneq ($(feature-libslang), 1)
353 354 355 356 357
    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
358
    CFLAGS += -DHAVE_SLANG_SUPPORT
359 360
    EXTLIBS += -lslang
  endif
361
endif
362 363

ifndef NO_GTK2
364
  FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell pkg-config --libs --cflags gtk+-2.0 2>/dev/null)
365
  ifneq ($(feature-gtk2), 1)
366 367 368
    msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
    NO_GTK2 := 1
  else
369
    ifeq ($(feature-gtk2-infobar), 1)
370
      GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
371
    endif
372
    CFLAGS += -DHAVE_GTK2_SUPPORT
373 374
    GTK_CFLAGS += $(shell pkg-config --cflags gtk+-2.0 2>/dev/null)
    GTK_LIBS := $(shell pkg-config --libs gtk+-2.0 2>/dev/null)
375
    EXTLIBS += -ldl
376
  endif
377
endif
378 379 380 381 382

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

ifdef NO_LIBPERL
383
  CFLAGS += -DNO_LIBPERL
384
else
385 386 387 388 389 390
  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)

391
  ifneq ($(feature-libperl), 1)
392 393 394 395 396 397
    CFLAGS += -DNO_LIBPERL
    NO_LIBPERL := 1
  else
    LDFLAGS += $(PERL_EMBED_LDFLAGS)
    EXTLIBS += $(PERL_EMBED_LIBADD)
  endif
398
endif
399 400 401

disable-python = $(eval $(disable-python_code))
define disable-python_code
402
  CFLAGS += -DNO_LIBPYTHON
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
  $(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)

436
      ifneq ($(feature-libpython), 1)
437 438 439
        $(call disable-python,Python.h (for Python 2.x))
      else

440
        ifneq ($(feature-libpython-version), 1)
441 442 443 444 445 446 447 448 449 450 451 452 453
          $(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
454
          LDFLAGS += $(PYTHON_EMBED_LDFLAGS)
455
          EXTLIBS += $(PYTHON_EMBED_LIBADD)
456
          LANG_BINDINGS += $(obj-perf)python/perf.so
457 458 459 460 461
        endif
      endif
    endif
  endif
endif
462

463 464 465 466
ifeq ($(feature-libbfd), 1)
  EXTLIBS += -lbfd
endif

467
ifdef NO_DEMANGLE
468
  CFLAGS += -DNO_DEMANGLE
469
else
470
  ifdef HAVE_CPLUS_DEMANGLE_SUPPORT
471
    EXTLIBS += -liberty
472
    CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
473
  else
474
    ifneq ($(feature-libbfd), 1)
475 476
      $(feature_check,liberty)
      ifeq ($(feature-liberty), 1)
477 478
        EXTLIBS += -lbfd -liberty
      else
479 480
        $(feature_check,liberty-z)
        ifeq ($(feature-liberty-z), 1)
481 482
          EXTLIBS += -lbfd -liberty -lz
        else
483 484
          $(feature_check,cplus-demangle)
          ifeq ($(feature-cplus-demangle), 1)
485
            EXTLIBS += -liberty
486
            CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
487 488 489 490 491 492 493 494
          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
495
endif
496

497 498 499 500
ifneq ($(filter -lbfd,$(EXTLIBS)),)
  CFLAGS += -DHAVE_LIBBFD_SUPPORT
endif

501
ifndef NO_ON_EXIT
502
  ifeq ($(feature-on-exit), 1)
503
    CFLAGS += -DHAVE_ON_EXIT_SUPPORT
504
  endif
505 506 507
endif

ifndef NO_BACKTRACE
508
  ifeq ($(feature-backtrace), 1)
509
    CFLAGS += -DHAVE_BACKTRACE_SUPPORT
510
  endif
511
endif
512 513

ifndef NO_LIBNUMA
514
  ifeq ($(feature-libnuma), 0)
515 516 517
    msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numa-libs-devel or libnuma-dev);
    NO_LIBNUMA := 1
  else
518
    CFLAGS += -DHAVE_LIBNUMA_SUPPORT
519 520
    EXTLIBS += -lnuma
  endif
521
endif
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553

# 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
554 555 556
ifeq ($(IS_X86_64),1)
lib = lib64
else
557
lib = lib
558 559
endif
libdir = $(prefix)/$(lib)
560 561 562 563 564 565 566 567 568 569 570 571

# 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))
572
libdir_SQ = $(subst ','\'',$(libdir))
573 574 575 576 577 578 579

ifneq ($(filter /%,$(firstword $(perfexecdir))),)
perfexec_instdir = $(perfexecdir)
else
perfexec_instdir = $(prefix)/$(perfexecdir)
endif
perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))