at v3.14 604 lines 16 kB view raw
1 2ifeq ($(src-perf),) 3src-perf := $(srctree)/tools/perf 4endif 5 6ifeq ($(obj-perf),) 7obj-perf := $(OUTPUT) 8endif 9 10ifneq ($(obj-perf),) 11obj-perf := $(abspath $(obj-perf))/ 12endif 13 14LIB_INCLUDE := $(srctree)/tools/lib/ 15CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS) 16 17include $(src-perf)/config/Makefile.arch 18 19NO_PERF_REGS := 1 20 21# Additional ARCH settings for x86 22ifeq ($(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 LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 27 else 28 LIBUNWIND_LIBS = -lunwind -lunwind-x86 29 endif 30 NO_PERF_REGS := 0 31endif 32ifeq ($(ARCH),arm) 33 NO_PERF_REGS := 0 34 LIBUNWIND_LIBS = -lunwind -lunwind-arm 35endif 36 37ifeq ($(LIBUNWIND_LIBS),) 38 NO_LIBUNWIND := 1 39else 40 # 41 # For linking with debug library, run like: 42 # 43 # make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/ 44 # 45 ifdef LIBUNWIND_DIR 46 LIBUNWIND_CFLAGS = -I$(LIBUNWIND_DIR)/include 47 LIBUNWIND_LDFLAGS = -L$(LIBUNWIND_DIR)/lib 48 endif 49 LIBUNWIND_LDFLAGS += $(LIBUNWIND_LIBS) 50 51 # Set per-feature check compilation flags 52 FEATURE_CHECK_CFLAGS-libunwind = $(LIBUNWIND_CFLAGS) 53 FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS) 54 FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS) 55 FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS) 56endif 57 58ifeq ($(NO_PERF_REGS),0) 59 CFLAGS += -DHAVE_PERF_REGS_SUPPORT 60endif 61 62# include ARCH specific config 63-include $(src-perf)/arch/$(ARCH)/Makefile 64 65include $(src-perf)/config/utilities.mak 66 67ifeq ($(call get-executable,$(FLEX)),) 68 dummy := $(error Error: $(FLEX) is missing on this system, please install it) 69endif 70 71ifeq ($(call get-executable,$(BISON)),) 72 dummy := $(error Error: $(BISON) is missing on this system, please install it) 73endif 74 75# Treat warnings as errors unless directed not to 76ifneq ($(WERROR),0) 77 CFLAGS += -Werror 78endif 79 80ifndef DEBUG 81 DEBUG := 0 82endif 83 84ifeq ($(DEBUG),0) 85 CFLAGS += -O6 86endif 87 88ifdef PARSER_DEBUG 89 PARSER_DEBUG_BISON := -t 90 PARSER_DEBUG_FLEX := -d 91 CFLAGS += -DPARSER_DEBUG 92endif 93 94CFLAGS += -fno-omit-frame-pointer 95CFLAGS += -ggdb3 96CFLAGS += -funwind-tables 97CFLAGS += -Wall 98CFLAGS += -Wextra 99CFLAGS += -std=gnu99 100 101EXTLIBS = -lelf -lpthread -lrt -lm -ldl 102 103ifneq ($(OUTPUT),) 104 OUTPUT_FEATURES = $(OUTPUT)config/feature-checks/ 105 $(shell mkdir -p $(OUTPUT_FEATURES)) 106endif 107 108feature_check = $(eval $(feature_check_code)) 109define feature_check_code 110 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) 111endef 112 113feature_set = $(eval $(feature_set_code)) 114define feature_set_code 115 feature-$(1) := 1 116endef 117 118# 119# Build the feature check binaries in parallel, ignore errors, ignore return value and suppress output: 120# 121 122# 123# Note that this is not a complete list of all feature tests, just 124# those that are typically built on a fully configured system. 125# 126# [ Feature tests not mentioned here have to be built explicitly in 127# the rule that uses them - an example for that is the 'bionic' 128# feature check. ] 129# 130CORE_FEATURE_TESTS = \ 131 backtrace \ 132 dwarf \ 133 fortify-source \ 134 glibc \ 135 gtk2 \ 136 gtk2-infobar \ 137 libaudit \ 138 libbfd \ 139 libelf \ 140 libelf-getphdrnum \ 141 libelf-mmap \ 142 libnuma \ 143 libperl \ 144 libpython \ 145 libpython-version \ 146 libslang \ 147 libunwind \ 148 on-exit \ 149 stackprotector-all \ 150 timerfd 151 152# Set FEATURE_CHECK_(C|LD)FLAGS-all for all CORE_FEATURE_TESTS features. 153# If in the future we need per-feature checks/flags for features not 154# mentioned in this list we need to refactor this ;-). 155set_test_all_flags = $(eval $(set_test_all_flags_code)) 156define set_test_all_flags_code 157 FEATURE_CHECK_CFLAGS-all += $(FEATURE_CHECK_CFLAGS-$(1)) 158 FEATURE_CHECK_LDFLAGS-all += $(FEATURE_CHECK_LDFLAGS-$(1)) 159endef 160 161$(foreach feat,$(CORE_FEATURE_TESTS),$(call set_test_all_flags,$(feat))) 162 163# 164# So here we detect whether test-all was rebuilt, to be able 165# to skip the print-out of the long features list if the file 166# existed before and after it was built: 167# 168ifeq ($(wildcard $(OUTPUT)config/feature-checks/test-all.bin),) 169 test-all-failed := 1 170else 171 test-all-failed := 0 172endif 173 174# 175# Special fast-path for the 'all features are available' case: 176# 177$(call feature_check,all,$(MSG)) 178 179# 180# Just in case the build freshly failed, make sure we print the 181# feature matrix: 182# 183ifeq ($(feature-all), 0) 184 test-all-failed := 1 185endif 186 187ifeq ($(test-all-failed),1) 188 $(info ) 189 $(info Auto-detecting system features:) 190endif 191 192ifeq ($(feature-all), 1) 193 # 194 # test-all.c passed - just set all the core feature flags to 1: 195 # 196 $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_set,$(feat))) 197else 198 $(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) 199 $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_check,$(feat))) 200endif 201 202# 203# Print the result of the feature test: 204# 205feature_print = $(eval $(feature_print_code)) $(info $(MSG)) 206 207define feature_print_code 208 ifeq ($(feature-$(1)), 1) 209 MSG = $(shell printf '...%30s: [ \033[32mon\033[m ]' $(1)) 210 else 211 MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(1)) 212 endif 213endef 214 215# 216# Only print out our features if we rebuilt the testcases or if a test failed: 217# 218ifeq ($(test-all-failed), 1) 219 $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_print,$(feat))) 220 $(info ) 221endif 222 223ifeq ($(feature-stackprotector-all), 1) 224 CFLAGS += -fstack-protector-all 225endif 226 227ifeq ($(DEBUG),0) 228 ifeq ($(feature-fortify-source), 1) 229 CFLAGS += -D_FORTIFY_SOURCE=2 230 endif 231endif 232 233CFLAGS += -I$(src-perf)/util/include 234CFLAGS += -I$(src-perf)/arch/$(ARCH)/include 235CFLAGS += -I$(srctree)/tools/include/ 236CFLAGS += -I$(srctree)/arch/$(ARCH)/include/uapi 237CFLAGS += -I$(srctree)/arch/$(ARCH)/include 238CFLAGS += -I$(srctree)/include/uapi 239CFLAGS += -I$(srctree)/include 240 241# $(obj-perf) for generated common-cmds.h 242# $(obj-perf)/util for generated bison/flex headers 243ifneq ($(OUTPUT),) 244CFLAGS += -I$(obj-perf)/util 245CFLAGS += -I$(obj-perf) 246endif 247 248CFLAGS += -I$(src-perf)/util 249CFLAGS += -I$(src-perf) 250CFLAGS += -I$(LIB_INCLUDE) 251 252CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE 253 254ifndef NO_BIONIC 255 $(call feature_check,bionic) 256 ifeq ($(feature-bionic), 1) 257 BIONIC := 1 258 EXTLIBS := $(filter-out -lrt,$(EXTLIBS)) 259 EXTLIBS := $(filter-out -lpthread,$(EXTLIBS)) 260 endif 261endif 262 263ifdef NO_LIBELF 264 NO_DWARF := 1 265 NO_DEMANGLE := 1 266 NO_LIBUNWIND := 1 267else 268 ifeq ($(feature-libelf), 0) 269 ifeq ($(feature-glibc), 1) 270 LIBC_SUPPORT := 1 271 endif 272 ifeq ($(BIONIC),1) 273 LIBC_SUPPORT := 1 274 endif 275 ifeq ($(LIBC_SUPPORT),1) 276 msg := $(warning No libelf found, disables 'probe' tool, please install elfutils-libelf-devel/libelf-dev); 277 278 NO_LIBELF := 1 279 NO_DWARF := 1 280 NO_DEMANGLE := 1 281 else 282 msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static); 283 endif 284 else 285 # for linking with debug library, run like: 286 # make DEBUG=1 LIBDW_DIR=/opt/libdw/ 287 ifdef LIBDW_DIR 288 LIBDW_CFLAGS := -I$(LIBDW_DIR)/include 289 LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib 290 endif 291 292 ifneq ($(feature-dwarf), 1) 293 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); 294 NO_DWARF := 1 295 endif # Dwarf support 296 endif # libelf support 297endif # NO_LIBELF 298 299ifndef NO_LIBELF 300 CFLAGS += -DHAVE_LIBELF_SUPPORT 301 302 ifeq ($(feature-libelf-mmap), 1) 303 CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT 304 endif 305 306 ifeq ($(feature-libelf-getphdrnum), 1) 307 CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT 308 endif 309 310 # include ARCH specific config 311 -include $(src-perf)/arch/$(ARCH)/Makefile 312 313 ifndef NO_DWARF 314 ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined) 315 msg := $(warning DWARF register mappings have not been defined for architecture $(ARCH), DWARF support disabled); 316 NO_DWARF := 1 317 else 318 CFLAGS += -DHAVE_DWARF_SUPPORT $(LIBDW_CFLAGS) 319 LDFLAGS += $(LIBDW_LDFLAGS) 320 EXTLIBS += -lelf -ldw 321 endif # PERF_HAVE_DWARF_REGS 322 endif # NO_DWARF 323endif # NO_LIBELF 324 325ifndef NO_LIBUNWIND 326 ifneq ($(feature-libunwind), 1) 327 msg := $(warning No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 1.1); 328 NO_LIBUNWIND := 1 329 else 330 ifeq ($(ARCH),arm) 331 $(call feature_check,libunwind-debug-frame) 332 ifneq ($(feature-libunwind-debug-frame), 1) 333 msg := $(warning No debug_frame support found in libunwind); 334 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME 335 endif 336 else 337 # non-ARM has no dwarf_find_debug_frame() function: 338 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME 339 endif 340 341 CFLAGS += -DHAVE_LIBUNWIND_SUPPORT 342 EXTLIBS += $(LIBUNWIND_LIBS) 343 CFLAGS += $(LIBUNWIND_CFLAGS) 344 LDFLAGS += $(LIBUNWIND_LDFLAGS) 345 endif # ifneq ($(feature-libunwind), 1) 346endif 347 348ifndef NO_LIBAUDIT 349 ifneq ($(feature-libaudit), 1) 350 msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev); 351 NO_LIBAUDIT := 1 352 else 353 CFLAGS += -DHAVE_LIBAUDIT_SUPPORT 354 EXTLIBS += -laudit 355 endif 356endif 357 358ifdef NO_NEWT 359 NO_SLANG=1 360endif 361 362ifndef NO_SLANG 363 ifneq ($(feature-libslang), 1) 364 msg := $(warning slang not found, disables TUI support. Please install slang-devel or libslang-dev); 365 NO_SLANG := 1 366 else 367 # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h 368 CFLAGS += -I/usr/include/slang 369 CFLAGS += -DHAVE_SLANG_SUPPORT 370 EXTLIBS += -lslang 371 endif 372endif 373 374ifndef NO_GTK2 375 FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) 376 ifneq ($(feature-gtk2), 1) 377 msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev); 378 NO_GTK2 := 1 379 else 380 ifeq ($(feature-gtk2-infobar), 1) 381 GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT 382 endif 383 CFLAGS += -DHAVE_GTK2_SUPPORT 384 GTK_CFLAGS += $(shell $(PKG_CONFIG) --cflags gtk+-2.0 2>/dev/null) 385 GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk+-2.0 2>/dev/null) 386 EXTLIBS += -ldl 387 endif 388endif 389 390grep-libs = $(filter -l%,$(1)) 391strip-libs = $(filter-out -l%,$(1)) 392 393ifdef NO_LIBPERL 394 CFLAGS += -DNO_LIBPERL 395else 396 PERL_EMBED_LDOPTS = $(shell perl -MExtUtils::Embed -e ldopts 2>/dev/null) 397 PERL_EMBED_LDFLAGS = $(call strip-libs,$(PERL_EMBED_LDOPTS)) 398 PERL_EMBED_LIBADD = $(call grep-libs,$(PERL_EMBED_LDOPTS)) 399 PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null` 400 FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS) 401 402 ifneq ($(feature-libperl), 1) 403 CFLAGS += -DNO_LIBPERL 404 NO_LIBPERL := 1 405 else 406 LDFLAGS += $(PERL_EMBED_LDFLAGS) 407 EXTLIBS += $(PERL_EMBED_LIBADD) 408 endif 409endif 410 411ifeq ($(feature-timerfd), 1) 412 CFLAGS += -DHAVE_TIMERFD_SUPPORT 413else 414 msg := $(warning No timerfd support. Disables 'perf kvm stat live'); 415endif 416 417disable-python = $(eval $(disable-python_code)) 418define disable-python_code 419 CFLAGS += -DNO_LIBPYTHON 420 $(if $(1),$(warning No $(1) was found)) 421 $(warning Python support will not be built) 422 NO_LIBPYTHON := 1 423endef 424 425override PYTHON := \ 426 $(call get-executable-or-default,PYTHON,python) 427 428ifndef PYTHON 429 $(call disable-python,python interpreter) 430else 431 432 PYTHON_WORD := $(call shell-wordify,$(PYTHON)) 433 434 ifdef NO_LIBPYTHON 435 $(call disable-python) 436 else 437 438 override PYTHON_CONFIG := \ 439 $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON)-config) 440 441 ifndef PYTHON_CONFIG 442 $(call disable-python,python-config tool) 443 else 444 445 PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG)) 446 447 PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) --ldflags 2>/dev/null) 448 PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS)) 449 PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) 450 PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null) 451 FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS) 452 453 ifneq ($(feature-libpython), 1) 454 $(call disable-python,Python.h (for Python 2.x)) 455 else 456 457 ifneq ($(feature-libpython-version), 1) 458 $(warning Python 3 is not yet supported; please set) 459 $(warning PYTHON and/or PYTHON_CONFIG appropriately.) 460 $(warning If you also have Python 2 installed, then) 461 $(warning try something like:) 462 $(warning $(and ,)) 463 $(warning $(and ,) make PYTHON=python2) 464 $(warning $(and ,)) 465 $(warning Otherwise, disable Python support entirely:) 466 $(warning $(and ,)) 467 $(warning $(and ,) make NO_LIBPYTHON=1) 468 $(warning $(and ,)) 469 $(error $(and ,)) 470 else 471 LDFLAGS += $(PYTHON_EMBED_LDFLAGS) 472 EXTLIBS += $(PYTHON_EMBED_LIBADD) 473 LANG_BINDINGS += $(obj-perf)python/perf.so 474 endif 475 endif 476 endif 477 endif 478endif 479 480ifeq ($(feature-libbfd), 1) 481 EXTLIBS += -lbfd -lz -liberty 482endif 483 484ifdef NO_DEMANGLE 485 CFLAGS += -DNO_DEMANGLE 486else 487 ifdef HAVE_CPLUS_DEMANGLE_SUPPORT 488 EXTLIBS += -liberty 489 CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT 490 else 491 ifneq ($(feature-libbfd), 1) 492 $(call feature_check,liberty) 493 ifeq ($(feature-liberty), 1) 494 EXTLIBS += -lbfd -liberty 495 else 496 $(call feature_check,liberty-z) 497 ifeq ($(feature-liberty-z), 1) 498 EXTLIBS += -lbfd -liberty -lz 499 else 500 $(call feature_check,cplus-demangle) 501 ifeq ($(feature-cplus-demangle), 1) 502 EXTLIBS += -liberty 503 CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT 504 else 505 msg := $(warning No bfd.h/libbfd found, install binutils-dev[el]/zlib-static to gain symbol demangling) 506 CFLAGS += -DNO_DEMANGLE 507 endif 508 endif 509 endif 510 endif 511 endif 512endif 513 514ifneq ($(filter -lbfd,$(EXTLIBS)),) 515 CFLAGS += -DHAVE_LIBBFD_SUPPORT 516endif 517 518ifndef NO_ON_EXIT 519 ifeq ($(feature-on-exit), 1) 520 CFLAGS += -DHAVE_ON_EXIT_SUPPORT 521 endif 522endif 523 524ifndef NO_BACKTRACE 525 ifeq ($(feature-backtrace), 1) 526 CFLAGS += -DHAVE_BACKTRACE_SUPPORT 527 endif 528endif 529 530ifndef NO_LIBNUMA 531 ifeq ($(feature-libnuma), 0) 532 msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev); 533 NO_LIBNUMA := 1 534 else 535 CFLAGS += -DHAVE_LIBNUMA_SUPPORT 536 EXTLIBS += -lnuma 537 endif 538endif 539 540# Among the variables below, these: 541# perfexecdir 542# template_dir 543# mandir 544# infodir 545# htmldir 546# ETC_PERFCONFIG (but not sysconfdir) 547# can be specified as a relative path some/where/else; 548# this is interpreted as relative to $(prefix) and "perf" at 549# runtime figures out where they are based on the path to the executable. 550# This can help installing the suite in a relocatable way. 551 552# Make the path relative to DESTDIR, not to prefix 553ifndef DESTDIR 554prefix = $(HOME) 555endif 556bindir_relative = bin 557bindir = $(prefix)/$(bindir_relative) 558mandir = share/man 559infodir = share/info 560perfexecdir = libexec/perf-core 561sharedir = $(prefix)/share 562template_dir = share/perf-core/templates 563htmldir = share/doc/perf-doc 564ifeq ($(prefix),/usr) 565sysconfdir = /etc 566ETC_PERFCONFIG = $(sysconfdir)/perfconfig 567else 568sysconfdir = $(prefix)/etc 569ETC_PERFCONFIG = etc/perfconfig 570endif 571ifeq ($(IS_X86_64),1) 572lib = lib64 573else 574lib = lib 575endif 576libdir = $(prefix)/$(lib) 577 578# Shell quote (do not use $(call) to accommodate ancient setups); 579ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG)) 580DESTDIR_SQ = $(subst ','\'',$(DESTDIR)) 581bindir_SQ = $(subst ','\'',$(bindir)) 582mandir_SQ = $(subst ','\'',$(mandir)) 583infodir_SQ = $(subst ','\'',$(infodir)) 584perfexecdir_SQ = $(subst ','\'',$(perfexecdir)) 585template_dir_SQ = $(subst ','\'',$(template_dir)) 586htmldir_SQ = $(subst ','\'',$(htmldir)) 587prefix_SQ = $(subst ','\'',$(prefix)) 588sysconfdir_SQ = $(subst ','\'',$(sysconfdir)) 589libdir_SQ = $(subst ','\'',$(libdir)) 590 591ifneq ($(filter /%,$(firstword $(perfexecdir))),) 592perfexec_instdir = $(perfexecdir) 593else 594perfexec_instdir = $(prefix)/$(perfexecdir) 595endif 596perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir)) 597 598# If we install to $(HOME) we keep the traceevent default: 599# $(HOME)/.traceevent/plugins 600# Otherwise we install plugins into the global $(libdir). 601ifdef DESTDIR 602plugindir=$(libdir)/traceevent/plugins 603plugindir_SQ= $(subst ','\'',$(plugindir)) 604endif