1include ../scripts/Makefile.include 2 3# The default target of this Makefile is... 4all: 5 6include ../scripts/utilities.mak 7 8# Define V to have a more verbose compile. 9# 10# Define VF to have a more verbose feature check output. 11# 12# Define O to save output files in a separate directory. 13# 14# Define ARCH as name of target architecture if you want cross-builds. 15# 16# Define CROSS_COMPILE as prefix name of compiler if you want cross-builds. 17# 18# Define NO_LIBPERL to disable perl script extension. 19# 20# Define NO_LIBPYTHON to disable python script extension. 21# 22# Define PYTHON to point to the python binary if the default 23# `python' is not correct; for example: PYTHON=python2 24# 25# Define PYTHON_CONFIG to point to the python-config binary if 26# the default `$(PYTHON)-config' is not correct. 27# 28# Define ASCIIDOC8 if you want to format documentation with AsciiDoc 8 29# 30# Define DOCBOOK_XSL_172 if you want to format man pages with DocBook XSL v1.72. 31# 32# Define LDFLAGS=-static to build a static binary. 33# 34# Define EXTRA_CFLAGS=-m64 or EXTRA_CFLAGS=-m32 as appropriate for cross-builds. 35# 36# Define NO_DWARF if you do not want debug-info analysis feature at all. 37# 38# Define WERROR=0 to disable treating any warnings as errors. 39# 40# Define NO_NEWT if you do not want TUI support. (deprecated) 41# 42# Define NO_SLANG if you do not want TUI support. 43# 44# Define NO_GTK2 if you do not want GTK+ GUI support. 45# 46# Define NO_DEMANGLE if you do not want C++ symbol demangling. 47# 48# Define NO_LIBELF if you do not want libelf dependency (e.g. cross-builds) 49# 50# Define NO_LIBUNWIND if you do not want libunwind dependency for dwarf 51# backtrace post unwind. 52# 53# Define NO_BACKTRACE if you do not want stack backtrace debug feature 54# 55# Define NO_LIBNUMA if you do not want numa perf benchmark 56# 57# Define NO_LIBAUDIT if you do not want libaudit support 58# 59# Define NO_LIBBIONIC if you do not want bionic support 60# 61# Define NO_LIBCRYPTO if you do not want libcrypto (openssl) support 62# used for generating build-ids for ELFs generated by jitdump. 63# 64# Define NO_LIBDW_DWARF_UNWIND if you do not want libdw support 65# for dwarf backtrace post unwind. 66# 67# Define NO_PERF_READ_VDSO32 if you do not want to build perf-read-vdso32 68# for reading the 32-bit compatibility VDSO in 64-bit mode 69# 70# Define NO_PERF_READ_VDSOX32 if you do not want to build perf-read-vdsox32 71# for reading the x32 mode 32-bit compatibility VDSO in 64-bit mode 72# 73# Define NO_ZLIB if you do not want to support compressed kernel modules 74# 75# Define LIBBABELTRACE if you DO want libbabeltrace support 76# for CTF data format. 77# 78# Define NO_LZMA if you do not want to support compressed (xz) kernel modules 79# 80# Define NO_AUXTRACE if you do not want AUX area tracing support 81# 82# Define NO_LIBBPF if you do not want BPF support 83# 84# Define NO_SDT if you do not want to define SDT event in perf tools, 85# note that it doesn't disable SDT scanning support. 86# 87# Define FEATURES_DUMP to provide features detection dump file 88# and bypass the feature detection 89# 90# Define NO_JVMTI if you do not want jvmti agent built 91# 92# Define LIBCLANGLLVM if you DO want builtin clang and llvm support. 93# When selected, pass LLVM_CONFIG=/path/to/llvm-config to `make' if 94# llvm-config is not in $PATH. 95 96# As per kernel Makefile, avoid funny character set dependencies 97unexport LC_ALL 98LC_COLLATE=C 99LC_NUMERIC=C 100export LC_COLLATE LC_NUMERIC 101 102ifeq ($(srctree),) 103srctree := $(patsubst %/,%,$(dir $(shell pwd))) 104srctree := $(patsubst %/,%,$(dir $(srctree))) 105#$(info Determined 'srctree' to be $(srctree)) 106endif 107 108ifneq ($(objtree),) 109#$(info Determined 'objtree' to be $(objtree)) 110endif 111 112ifneq ($(OUTPUT),) 113#$(info Determined 'OUTPUT' to be $(OUTPUT)) 114# Adding $(OUTPUT) as a directory to look for source files, 115# because use generated output files as sources dependency 116# for flex/bison parsers. 117VPATH += $(OUTPUT) 118export VPATH 119endif 120 121ifeq ($(V),1) 122 Q = 123else 124 Q = @ 125endif 126 127# Do not use make's built-in rules 128# (this improves performance and avoids hard-to-debug behaviour); 129MAKEFLAGS += -r 130 131# Makefiles suck: This macro sets a default value of $(2) for the 132# variable named by $(1), unless the variable has been set by 133# environment or command line. This is necessary for CC and AR 134# because make sets default values, so the simpler ?= approach 135# won't work as expected. 136define allow-override 137 $(if $(or $(findstring environment,$(origin $(1))),\ 138 $(findstring command line,$(origin $(1)))),,\ 139 $(eval $(1) = $(2))) 140endef 141 142# Allow setting CC and AR and LD, or setting CROSS_COMPILE as a prefix. 143$(call allow-override,CC,$(CROSS_COMPILE)gcc) 144$(call allow-override,AR,$(CROSS_COMPILE)ar) 145$(call allow-override,LD,$(CROSS_COMPILE)ld) 146$(call allow-override,CXX,$(CROSS_COMPILE)g++) 147 148LD += $(EXTRA_LDFLAGS) 149 150HOSTCC ?= gcc 151HOSTLD ?= ld 152HOSTAR ?= ar 153 154PKG_CONFIG = $(CROSS_COMPILE)pkg-config 155LLVM_CONFIG ?= llvm-config 156 157RM = rm -f 158LN = ln -f 159MKDIR = mkdir 160FIND = find 161INSTALL = install 162FLEX = flex 163BISON = bison 164STRIP = strip 165AWK = awk 166 167# include Makefile.config by default and rule out 168# non-config cases 169config := 1 170 171NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc install-man install-html install-info install-pdf doc man html info pdf 172 173ifdef MAKECMDGOALS 174ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),) 175 config := 0 176endif 177endif 178 179# The fixdep build - we force fixdep tool to be built as 180# the first target in the separate make session not to be 181# disturbed by any parallel make jobs. Once fixdep is done 182# we issue the requested build with FIXDEP=1 variable. 183# 184# The fixdep build is disabled for $(NON_CONFIG_TARGETS) 185# targets, because it's not necessary. 186 187ifdef FIXDEP 188 force_fixdep := 0 189else 190 force_fixdep := $(config) 191endif 192 193export srctree OUTPUT RM CC CXX LD AR CFLAGS CXXFLAGS V BISON FLEX AWK 194export HOSTCC HOSTLD HOSTAR 195 196include $(srctree)/tools/build/Makefile.include 197 198ifeq ($(force_fixdep),1) 199goals := $(filter-out all sub-make, $(MAKECMDGOALS)) 200 201$(goals) all: sub-make 202 203sub-make: fixdep 204 $(Q)$(MAKE) FIXDEP=1 -f Makefile.perf $(goals) 205 206else # force_fixdep 207 208LIB_DIR = $(srctree)/tools/lib/api/ 209TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/ 210BPF_DIR = $(srctree)/tools/lib/bpf/ 211SUBCMD_DIR = $(srctree)/tools/lib/subcmd/ 212 213# Set FEATURE_TESTS to 'all' so all possible feature checkers are executed. 214# Without this setting the output feature dump file misses some features, for 215# example, liberty. Select all checkers so we won't get an incomplete feature 216# dump file. 217ifeq ($(config),1) 218ifdef MAKECMDGOALS 219ifeq ($(filter feature-dump,$(MAKECMDGOALS)),feature-dump) 220FEATURE_TESTS := all 221endif 222endif 223include Makefile.config 224endif 225 226ifeq ($(config),0) 227include $(srctree)/tools/scripts/Makefile.arch 228-include arch/$(ARCH)/Makefile 229endif 230 231# The FEATURE_DUMP_EXPORT holds location of the actual 232# FEATURE_DUMP file to be used to bypass feature detection 233# (for bpf or any other subproject) 234ifeq ($(FEATURES_DUMP),) 235FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP) 236else 237FEATURE_DUMP_EXPORT := $(FEATURES_DUMP) 238endif 239 240export prefix bindir sharedir sysconfdir DESTDIR 241 242# sparse is architecture-neutral, which means that we need to tell it 243# explicitly what architecture to check for. Fix this up for yours.. 244SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__ 245 246# Guard against environment variables 247PYRF_OBJS = 248SCRIPT_SH = 249 250SCRIPT_SH += perf-archive.sh 251SCRIPT_SH += perf-with-kcore.sh 252 253grep-libs = $(filter -l%,$(1)) 254strip-libs = $(filter-out -l%,$(1)) 255 256ifneq ($(OUTPUT),) 257 TE_PATH=$(OUTPUT) 258 BPF_PATH=$(OUTPUT) 259 SUBCMD_PATH=$(OUTPUT) 260ifneq ($(subdir),) 261 API_PATH=$(OUTPUT)/../lib/api/ 262else 263 API_PATH=$(OUTPUT) 264endif 265else 266 TE_PATH=$(TRACE_EVENT_DIR) 267 API_PATH=$(LIB_DIR) 268 BPF_PATH=$(BPF_DIR) 269 SUBCMD_PATH=$(SUBCMD_DIR) 270endif 271 272LIBTRACEEVENT = $(TE_PATH)libtraceevent.a 273export LIBTRACEEVENT 274 275LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list 276LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST) 277 278LIBAPI = $(API_PATH)libapi.a 279export LIBAPI 280 281LIBBPF = $(BPF_PATH)libbpf.a 282 283LIBSUBCMD = $(SUBCMD_PATH)libsubcmd.a 284 285# python extension build directories 286PYTHON_EXTBUILD := $(OUTPUT)python_ext_build/ 287PYTHON_EXTBUILD_LIB := $(PYTHON_EXTBUILD)lib/ 288PYTHON_EXTBUILD_TMP := $(PYTHON_EXTBUILD)tmp/ 289export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP 290 291python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf.so 292 293PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources) 294PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI) 295 296SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) 297 298PROGRAMS += $(OUTPUT)perf 299 300ifndef NO_PERF_READ_VDSO32 301PROGRAMS += $(OUTPUT)perf-read-vdso32 302endif 303 304ifndef NO_PERF_READ_VDSOX32 305PROGRAMS += $(OUTPUT)perf-read-vdsox32 306endif 307 308LIBJVMTI = libperf-jvmti.so 309 310ifndef NO_JVMTI 311PROGRAMS += $(OUTPUT)$(LIBJVMTI) 312endif 313 314# what 'all' will build and 'install' will install, in perfexecdir 315ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS) 316 317# what 'all' will build but not install in perfexecdir 318OTHER_PROGRAMS = $(OUTPUT)perf 319 320# Set paths to tools early so that they can be used for version tests. 321ifndef SHELL_PATH 322 SHELL_PATH = /bin/sh 323endif 324ifndef PERL_PATH 325 PERL_PATH = /usr/bin/perl 326endif 327 328export PERL_PATH 329 330LIB_FILE=$(OUTPUT)libperf.a 331 332PERFLIBS = $(LIB_FILE) $(LIBAPI) $(LIBTRACEEVENT) $(LIBSUBCMD) 333ifndef NO_LIBBPF 334 PERFLIBS += $(LIBBPF) 335endif 336 337# We choose to avoid "if .. else if .. else .. endif endif" 338# because maintaining the nesting to match is a pain. If 339# we had "elif" things would have been much nicer... 340 341ifneq ($(OUTPUT),) 342 CFLAGS += -I$(OUTPUT) 343endif 344 345ifndef NO_GTK2 346 ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so 347 GTK_IN := $(OUTPUT)gtk-in.o 348endif 349 350ifdef ASCIIDOC8 351 export ASCIIDOC8 352endif 353 354LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group 355 356ifeq ($(USE_CLANG), 1) 357 CLANGLIBS_LIST = AST Basic CodeGen Driver Frontend Lex Tooling Edit Sema Analysis Parse Serialization 358 LIBCLANG = $(foreach l,$(CLANGLIBS_LIST),$(wildcard $(shell $(LLVM_CONFIG) --libdir)/libclang$(l).a)) 359 LIBS += -Wl,--start-group $(LIBCLANG) -Wl,--end-group 360endif 361 362ifeq ($(USE_LLVM), 1) 363 LIBLLVM = $(shell $(LLVM_CONFIG) --libs all) $(shell $(LLVM_CONFIG) --system-libs) 364 LIBS += -L$(shell $(LLVM_CONFIG) --libdir) $(LIBLLVM) 365endif 366 367ifeq ($(USE_CXX), 1) 368 LIBS += -lstdc++ 369endif 370 371export INSTALL SHELL_PATH 372 373### Build rules 374 375SHELL = $(SHELL_PATH) 376 377all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS) 378 379$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) 380 $(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \ 381 CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \ 382 $(PYTHON_WORD) util/setup.py \ 383 --quiet build_ext; \ 384 mkdir -p $(OUTPUT)python && \ 385 cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/ 386 387please_set_SHELL_PATH_to_a_more_modern_shell: 388 $(Q)$$(:) 389 390shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell 391 392strip: $(PROGRAMS) $(OUTPUT)perf 393 $(STRIP) $(STRIP_OPTS) $(PROGRAMS) $(OUTPUT)perf 394 395PERF_IN := $(OUTPUT)perf-in.o 396 397JEVENTS := $(OUTPUT)pmu-events/jevents 398JEVENTS_IN := $(OUTPUT)pmu-events/jevents-in.o 399 400PMU_EVENTS_IN := $(OUTPUT)pmu-events/pmu-events-in.o 401 402export JEVENTS 403 404build := -f $(srctree)/tools/build/Makefile.build dir=. obj 405 406$(PERF_IN): prepare FORCE 407 @(test -f ../../include/uapi/linux/perf_event.h && ( \ 408 (diff -B ../include/uapi/linux/perf_event.h ../../include/uapi/linux/perf_event.h >/dev/null) \ 409 || echo "Warning: tools/include/uapi/linux/perf_event.h differs from kernel" >&2 )) || true 410 @(test -f ../../include/linux/hash.h && ( \ 411 (diff -B ../include/linux/hash.h ../../include/linux/hash.h >/dev/null) \ 412 || echo "Warning: tools/include/linux/hash.h differs from kernel" >&2 )) || true 413 @(test -f ../../include/uapi/linux/hw_breakpoint.h && ( \ 414 (diff -B ../include/uapi/linux/hw_breakpoint.h ../../include/uapi/linux/hw_breakpoint.h >/dev/null) \ 415 || echo "Warning: tools/include/uapi/linux/hw_breakpoint.h differs from kernel" >&2 )) || true 416 @(test -f ../../arch/x86/include/asm/disabled-features.h && ( \ 417 (diff -B ../arch/x86/include/asm/disabled-features.h ../../arch/x86/include/asm/disabled-features.h >/dev/null) \ 418 || echo "Warning: tools/arch/x86/include/asm/disabled-features.h differs from kernel" >&2 )) || true 419 @(test -f ../../arch/x86/include/asm/required-features.h && ( \ 420 (diff -B ../arch/x86/include/asm/required-features.h ../../arch/x86/include/asm/required-features.h >/dev/null) \ 421 || echo "Warning: tools/arch/x86/include/asm/required-features.h differs from kernel" >&2 )) || true 422 @(test -f ../../arch/x86/include/asm/cpufeatures.h && ( \ 423 (diff -B ../arch/x86/include/asm/cpufeatures.h ../../arch/x86/include/asm/cpufeatures.h >/dev/null) \ 424 || echo "Warning: tools/arch/x86/include/asm/cpufeatures.h differs from kernel" >&2 )) || true 425 @(test -f ../../arch/x86/lib/memcpy_64.S && ( \ 426 (diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memcpy_64.S >/dev/null) \ 427 || echo "Warning: tools/arch/x86/lib/memcpy_64.S differs from kernel" >&2 )) || true 428 @(test -f ../../arch/x86/lib/memset_64.S && ( \ 429 (diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memset_64.S ../../arch/x86/lib/memset_64.S >/dev/null) \ 430 || echo "Warning: tools/arch/x86/lib/memset_64.S differs from kernel" >&2 )) || true 431 @(test -f ../../arch/arm/include/uapi/asm/perf_regs.h && ( \ 432 (diff -B ../arch/arm/include/uapi/asm/perf_regs.h ../../arch/arm/include/uapi/asm/perf_regs.h >/dev/null) \ 433 || echo "Warning: tools/arch/arm/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 434 @(test -f ../../arch/arm64/include/uapi/asm/perf_regs.h && ( \ 435 (diff -B ../arch/arm64/include/uapi/asm/perf_regs.h ../../arch/arm64/include/uapi/asm/perf_regs.h >/dev/null) \ 436 || echo "Warning: tools/arch/arm64/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 437 @(test -f ../../arch/powerpc/include/uapi/asm/perf_regs.h && ( \ 438 (diff -B ../arch/powerpc/include/uapi/asm/perf_regs.h ../../arch/powerpc/include/uapi/asm/perf_regs.h >/dev/null) \ 439 || echo "Warning: tools/arch/powerpc/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 440 @(test -f ../../arch/x86/include/uapi/asm/perf_regs.h && ( \ 441 (diff -B ../arch/x86/include/uapi/asm/perf_regs.h ../../arch/x86/include/uapi/asm/perf_regs.h >/dev/null) \ 442 || echo "Warning: tools/arch/x86/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 443 @(test -f ../../arch/x86/include/uapi/asm/kvm.h && ( \ 444 (diff -B ../arch/x86/include/uapi/asm/kvm.h ../../arch/x86/include/uapi/asm/kvm.h >/dev/null) \ 445 || echo "Warning: tools/arch/x86/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 446 @(test -f ../../arch/x86/include/uapi/asm/kvm_perf.h && ( \ 447 (diff -B ../arch/x86/include/uapi/asm/kvm_perf.h ../../arch/x86/include/uapi/asm/kvm_perf.h >/dev/null) \ 448 || echo "Warning: tools/arch/x86/include/uapi/asm/kvm_perf.h differs from kernel" >&2 )) || true 449 @(test -f ../../arch/x86/include/uapi/asm/svm.h && ( \ 450 (diff -B ../arch/x86/include/uapi/asm/svm.h ../../arch/x86/include/uapi/asm/svm.h >/dev/null) \ 451 || echo "Warning: tools/arch/x86/include/uapi/asm/svm.h differs from kernel" >&2 )) || true 452 @(test -f ../../arch/x86/include/uapi/asm/vmx.h && ( \ 453 (diff -B ../arch/x86/include/uapi/asm/vmx.h ../../arch/x86/include/uapi/asm/vmx.h >/dev/null) \ 454 || echo "Warning: tools/arch/x86/include/uapi/asm/vmx.h differs from kernel" >&2 )) || true 455 @(test -f ../../arch/powerpc/include/uapi/asm/kvm.h && ( \ 456 (diff -B ../arch/powerpc/include/uapi/asm/kvm.h ../../arch/powerpc/include/uapi/asm/kvm.h >/dev/null) \ 457 || echo "Warning: tools/arch/powerpc/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 458 @(test -f ../../arch/s390/include/uapi/asm/kvm.h && ( \ 459 (diff -B ../arch/s390/include/uapi/asm/kvm.h ../../arch/s390/include/uapi/asm/kvm.h >/dev/null) \ 460 || echo "Warning: tools/arch/s390/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 461 @(test -f ../../arch/s390/include/uapi/asm/kvm_perf.h && ( \ 462 (diff -B ../arch/s390/include/uapi/asm/kvm_perf.h ../../arch/s390/include/uapi/asm/kvm_perf.h >/dev/null) \ 463 || echo "Warning: tools/arch/s390/include/uapi/asm/kvm_perf.h differs from kernel" >&2 )) || true 464 @(test -f ../../arch/s390/include/uapi/asm/sie.h && ( \ 465 (diff -B ../arch/s390/include/uapi/asm/sie.h ../../arch/s390/include/uapi/asm/sie.h >/dev/null) \ 466 || echo "Warning: tools/arch/s390/include/uapi/asm/sie.h differs from kernel" >&2 )) || true 467 @(test -f ../../arch/arm/include/uapi/asm/kvm.h && ( \ 468 (diff -B ../arch/arm/include/uapi/asm/kvm.h ../../arch/arm/include/uapi/asm/kvm.h >/dev/null) \ 469 || echo "Warning: tools/arch/arm/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 470 @(test -f ../../arch/arm64/include/uapi/asm/kvm.h && ( \ 471 (diff -B ../arch/arm64/include/uapi/asm/kvm.h ../../arch/arm64/include/uapi/asm/kvm.h >/dev/null) \ 472 || echo "Warning: tools/arch/arm64/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 473 @(test -f ../../include/asm-generic/bitops/arch_hweight.h && ( \ 474 (diff -B ../include/asm-generic/bitops/arch_hweight.h ../../include/asm-generic/bitops/arch_hweight.h >/dev/null) \ 475 || echo "Warning: tools/include/asm-generic/bitops/arch_hweight.h differs from kernel" >&2 )) || true 476 @(test -f ../../include/asm-generic/bitops/const_hweight.h && ( \ 477 (diff -B ../include/asm-generic/bitops/const_hweight.h ../../include/asm-generic/bitops/const_hweight.h >/dev/null) \ 478 || echo "Warning: tools/include/asm-generic/bitops/const_hweight.h differs from kernel" >&2 )) || true 479 @(test -f ../../include/asm-generic/bitops/__fls.h && ( \ 480 (diff -B ../include/asm-generic/bitops/__fls.h ../../include/asm-generic/bitops/__fls.h >/dev/null) \ 481 || echo "Warning: tools/include/asm-generic/bitops/__fls.h differs from kernel" >&2 )) || true 482 @(test -f ../../include/asm-generic/bitops/fls.h && ( \ 483 (diff -B ../include/asm-generic/bitops/fls.h ../../include/asm-generic/bitops/fls.h >/dev/null) \ 484 || echo "Warning: tools/include/asm-generic/bitops/fls.h differs from kernel" >&2 )) || true 485 @(test -f ../../include/asm-generic/bitops/fls64.h && ( \ 486 (diff -B ../include/asm-generic/bitops/fls64.h ../../include/asm-generic/bitops/fls64.h >/dev/null) \ 487 || echo "Warning: tools/include/asm-generic/bitops/fls64.h differs from kernel" >&2 )) || true 488 @(test -f ../../include/linux/coresight-pmu.h && ( \ 489 (diff -B ../include/linux/coresight-pmu.h ../../include/linux/coresight-pmu.h >/dev/null) \ 490 || echo "Warning: tools/include/linux/coresight-pmu.h differs from kernel" >&2 )) || true 491 @(test -f ../../include/uapi/asm-generic/mman-common.h && ( \ 492 (diff -B ../include/uapi/asm-generic/mman-common.h ../../include/uapi/asm-generic/mman-common.h >/dev/null) \ 493 || echo "Warning: tools/include/uapi/asm-generic/mman-common.h differs from kernel" >&2 )) || true 494 @(test -f ../../include/uapi/asm-generic/mman.h && ( \ 495 (diff -B -I "^#include <\(uapi/\)*asm-generic/mman-common.h>$$" ../include/uapi/asm-generic/mman.h ../../include/uapi/asm-generic/mman.h >/dev/null) \ 496 || echo "Warning: tools/include/uapi/asm-generic/mman.h differs from kernel" >&2 )) || true 497 @(test -f ../../include/uapi/linux/mman.h && ( \ 498 (diff -B -I "^#include <\(uapi/\)*asm/mman.h>$$" ../include/uapi/linux/mman.h ../../include/uapi/linux/mman.h >/dev/null) \ 499 || echo "Warning: tools/include/uapi/linux/mman.h differs from kernel" >&2 )) || true 500 $(Q)$(MAKE) $(build)=perf 501 502$(JEVENTS_IN): FORCE 503 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=jevents 504 505$(JEVENTS): $(JEVENTS_IN) 506 $(QUIET_LINK)$(HOSTCC) $(JEVENTS_IN) -o $@ 507 508$(PMU_EVENTS_IN): $(JEVENTS) FORCE 509 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events 510 511$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST) 512 $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \ 513 $(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@ 514 515$(GTK_IN): FORCE 516 $(Q)$(MAKE) $(build)=gtk 517 518$(OUTPUT)libperf-gtk.so: $(GTK_IN) $(PERFLIBS) 519 $(QUIET_LINK)$(CC) -o $@ -shared $(LDFLAGS) $(filter %.o,$^) $(GTK_LIBS) 520 521$(OUTPUT)common-cmds.h: util/generate-cmdlist.sh command-list.txt 522 523$(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt) 524 $(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@ 525 526$(SCRIPTS) : % : %.sh 527 $(QUIET_GEN)$(INSTALL) '$@.sh' '$(OUTPUT)$@' 528 529$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD 530 $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT) 531 $(Q)touch $(OUTPUT)PERF-VERSION-FILE 532 533# These can record PERF_VERSION 534perf.spec $(SCRIPTS) \ 535 : $(OUTPUT)PERF-VERSION-FILE 536 537.SUFFIXES: 538 539# 540# If a target does not match any of the later rules then prefix it by $(OUTPUT) 541# This makes targets like 'make O=/tmp/perf perf.o' work in a natural way. 542# 543ifneq ($(OUTPUT),) 544%.o: $(OUTPUT)%.o 545 @echo " # Redirected target $@ => $(OUTPUT)$@" 546pmu-events/%.o: $(OUTPUT)pmu-events/%.o 547 @echo " # Redirected target $@ => $(OUTPUT)$@" 548util/%.o: $(OUTPUT)util/%.o 549 @echo " # Redirected target $@ => $(OUTPUT)$@" 550bench/%.o: $(OUTPUT)bench/%.o 551 @echo " # Redirected target $@ => $(OUTPUT)$@" 552tests/%.o: $(OUTPUT)tests/%.o 553 @echo " # Redirected target $@ => $(OUTPUT)$@" 554endif 555 556# These two need to be here so that when O= is not used they take precedence 557# over the general rule for .o 558 559# get relative building directory (to $(OUTPUT)) 560# and '.' if it's $(OUTPUT) itself 561__build-dir = $(subst $(OUTPUT),,$(dir $@)) 562build-dir = $(if $(__build-dir),$(__build-dir),.) 563 564prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h archheaders 565 566$(OUTPUT)%.o: %.c prepare FORCE 567 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 568 569$(OUTPUT)%.i: %.c prepare FORCE 570 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 571 572$(OUTPUT)%.s: %.c prepare FORCE 573 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 574 575$(OUTPUT)%-bison.o: %.c prepare FORCE 576 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 577 578$(OUTPUT)%-flex.o: %.c prepare FORCE 579 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 580 581$(OUTPUT)%.o: %.S prepare FORCE 582 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 583 584$(OUTPUT)%.i: %.S prepare FORCE 585 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 586 587$(OUTPUT)perf-%: %.o $(PERFLIBS) 588 $(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(filter %.o,$^) $(LIBS) 589 590ifndef NO_PERF_READ_VDSO32 591$(OUTPUT)perf-read-vdso32: perf-read-vdso.c util/find-vdso-map.c 592 $(QUIET_CC)$(CC) -m32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c 593endif 594 595ifndef NO_PERF_READ_VDSOX32 596$(OUTPUT)perf-read-vdsox32: perf-read-vdso.c util/find-vdso-map.c 597 $(QUIET_CC)$(CC) -mx32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c 598endif 599 600ifndef NO_JVMTI 601LIBJVMTI_IN := $(OUTPUT)jvmti/jvmti-in.o 602 603$(LIBJVMTI_IN): FORCE 604 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=jvmti obj=jvmti 605 606$(OUTPUT)$(LIBJVMTI): $(LIBJVMTI_IN) 607 $(QUIET_LINK)$(CC) -shared -Wl,-soname -Wl,$(LIBJVMTI) -o $@ $< -lelf -lrt 608endif 609 610$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h) 611 612LIBPERF_IN := $(OUTPUT)libperf-in.o 613 614$(LIBPERF_IN): prepare FORCE 615 $(Q)$(MAKE) $(build)=libperf 616 617$(LIB_FILE): $(LIBPERF_IN) 618 $(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIBPERF_IN) $(LIB_OBJS) 619 620LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 621 622$(LIBTRACEEVENT): FORCE 623 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a 624 625libtraceevent_plugins: FORCE 626 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) plugins 627 628$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins 629 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent-dynamic-list 630 631$(LIBTRACEEVENT)-clean: 632 $(call QUIET_CLEAN, libtraceevent) 633 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) O=$(OUTPUT) clean >/dev/null 634 635install-traceevent-plugins: libtraceevent_plugins 636 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) install_plugins 637 638$(LIBAPI): FORCE 639 $(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a 640 641$(LIBAPI)-clean: 642 $(call QUIET_CLEAN, libapi) 643 $(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null 644 645$(LIBBPF): FORCE 646 $(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) $(OUTPUT)libbpf.a FEATURES_DUMP=$(FEATURE_DUMP_EXPORT) 647 648$(LIBBPF)-clean: 649 $(call QUIET_CLEAN, libbpf) 650 $(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) clean >/dev/null 651 652$(LIBSUBCMD): FORCE 653 $(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) $(OUTPUT)libsubcmd.a 654 655$(LIBSUBCMD)-clean: 656 $(call QUIET_CLEAN, libsubcmd) 657 $(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) clean 658 659help: 660 @echo 'Perf make targets:' 661 @echo ' doc - make *all* documentation (see below)' 662 @echo ' man - make manpage documentation (access with man <foo>)' 663 @echo ' html - make html documentation' 664 @echo ' info - make GNU info documentation (access with info <foo>)' 665 @echo ' pdf - make pdf documentation' 666 @echo ' TAGS - use etags to make tag information for source browsing' 667 @echo ' tags - use ctags to make tag information for source browsing' 668 @echo ' cscope - use cscope to make interactive browsing database' 669 @echo '' 670 @echo 'Perf install targets:' 671 @echo ' NOTE: documentation build requires asciidoc, xmlto packages to be installed' 672 @echo ' HINT: use "prefix" or "DESTDIR" to install to a particular' 673 @echo ' path like "make prefix=/usr/local install install-doc"' 674 @echo ' install - install compiled binaries' 675 @echo ' install-doc - install *all* documentation' 676 @echo ' install-man - install manpage documentation' 677 @echo ' install-html - install html documentation' 678 @echo ' install-info - install GNU info documentation' 679 @echo ' install-pdf - install pdf documentation' 680 @echo '' 681 @echo ' quick-install-doc - alias for quick-install-man' 682 @echo ' quick-install-man - install the documentation quickly' 683 @echo ' quick-install-html - install the html documentation quickly' 684 @echo '' 685 @echo 'Perf maintainer targets:' 686 @echo ' clean - clean all binary objects and build output' 687 688 689DOC_TARGETS := doc man html info pdf 690 691INSTALL_DOC_TARGETS := $(patsubst %,install-%,$(DOC_TARGETS)) try-install-man 692INSTALL_DOC_TARGETS += quick-install-doc quick-install-man quick-install-html 693 694# 'make doc' should call 'make -C Documentation all' 695$(DOC_TARGETS): 696 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:doc=all) 697 698TAG_FOLDERS= . ../lib ../include 699TAG_FILES= ../../include/uapi/linux/perf_event.h 700 701TAGS: 702 $(QUIET_GEN)$(RM) TAGS; \ 703 $(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs etags -a $(TAG_FILES) 704 705tags: 706 $(QUIET_GEN)$(RM) tags; \ 707 $(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs ctags -a $(TAG_FILES) 708 709cscope: 710 $(QUIET_GEN)$(RM) cscope*; \ 711 $(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs cscope -b $(TAG_FILES) 712 713### Testing rules 714 715# GNU make supports exporting all variables by "export" without parameters. 716# However, the environment gets quite big, and some programs have problems 717# with that. 718 719check: $(OUTPUT)common-cmds.h 720 if sparse; \ 721 then \ 722 for i in *.c */*.c; \ 723 do \ 724 sparse $(CFLAGS) $(SPARSE_FLAGS) $$i || exit; \ 725 done; \ 726 else \ 727 exit 1; \ 728 fi 729 730### Installation rules 731 732ifndef NO_GTK2 733install-gtk: $(OUTPUT)libperf-gtk.so 734 $(call QUIET_INSTALL, 'GTK UI') \ 735 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \ 736 $(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)' 737else 738install-gtk: 739endif 740 741install-tools: all install-gtk 742 $(call QUIET_INSTALL, binaries) \ 743 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'; \ 744 $(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'; \ 745 $(LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf' '$(DESTDIR_SQ)$(bindir_SQ)/trace' 746ifndef NO_PERF_READ_VDSO32 747 $(call QUIET_INSTALL, perf-read-vdso32) \ 748 $(INSTALL) $(OUTPUT)perf-read-vdso32 '$(DESTDIR_SQ)$(bindir_SQ)'; 749endif 750ifndef NO_PERF_READ_VDSOX32 751 $(call QUIET_INSTALL, perf-read-vdsox32) \ 752 $(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)'; 753endif 754ifndef NO_JVMTI 755 $(call QUIET_INSTALL, $(LIBJVMTI)) \ 756 $(INSTALL) $(OUTPUT)$(LIBJVMTI) '$(DESTDIR_SQ)$(libdir_SQ)'; 757endif 758 $(call QUIET_INSTALL, libexec) \ 759 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' 760 $(call QUIET_INSTALL, perf-archive) \ 761 $(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' 762 $(call QUIET_INSTALL, perf-with-kcore) \ 763 $(INSTALL) $(OUTPUT)perf-with-kcore -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' 764ifndef NO_LIBAUDIT 765 $(call QUIET_INSTALL, strace/groups) \ 766 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)'; \ 767 $(INSTALL) trace/strace/groups/* -t '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)' 768endif 769ifndef NO_LIBPERL 770 $(call QUIET_INSTALL, perl-scripts) \ 771 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \ 772 $(INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \ 773 $(INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'; \ 774 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'; \ 775 $(INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin' 776endif 777ifndef NO_LIBPYTHON 778 $(call QUIET_INSTALL, python-scripts) \ 779 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \ 780 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'; \ 781 $(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \ 782 $(INSTALL) scripts/python/*.py -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python'; \ 783 $(INSTALL) scripts/python/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin' 784endif 785 $(call QUIET_INSTALL, perf_completion-script) \ 786 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'; \ 787 $(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf' 788 $(call QUIET_INSTALL, perf-tip) \ 789 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(tip_instdir_SQ)'; \ 790 $(INSTALL) Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)' 791 792install-tests: all install-gtk 793 $(call QUIET_INSTALL, tests) \ 794 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \ 795 $(INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \ 796 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \ 797 $(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr' 798 799install-bin: install-tools install-tests 800 801install: install-bin try-install-man install-traceevent-plugins 802 803install-python_ext: 804 $(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)' 805 806# 'make install-doc' should call 'make -C Documentation install' 807$(INSTALL_DOC_TARGETS): 808 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:-doc=) 809 810### Cleaning rules 811 812# 813# This is here, not in Makefile.config, because Makefile.config does 814# not get included for the clean target: 815# 816config-clean: 817 $(call QUIET_CLEAN, config) 818 $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null 819 820clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean 821 $(call QUIET_CLEAN, core-objs) $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS) 822 $(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete 823 $(Q)$(RM) $(OUTPUT).config-detected 824 $(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so 825 $(call QUIET_CLEAN, core-gen) $(RM) *.spec *.pyc *.pyo */*.pyc */*.pyo $(OUTPUT)common-cmds.h TAGS tags cscope* $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)FEATURE-DUMP $(OUTPUT)util/*-bison* $(OUTPUT)util/*-flex* \ 826 $(OUTPUT)util/intel-pt-decoder/inat-tables.c $(OUTPUT)fixdep \ 827 $(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \ 828 $(OUTPUT)pmu-events/pmu-events.c 829 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean 830 $(python-clean) 831 832# 833# To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY) 834# file if defined, with no further action. 835feature-dump: 836ifdef FEATURE_DUMP_COPY 837 @cp $(OUTPUT)FEATURE-DUMP $(FEATURE_DUMP_COPY) 838 @echo "FEATURE-DUMP file copied into $(FEATURE_DUMP_COPY)" 839else 840 @echo "FEATURE-DUMP file available in $(OUTPUT)FEATURE-DUMP" 841endif 842 843# 844# Trick: if ../../.git does not exist - we are building out of tree for example, 845# then force version regeneration: 846# 847ifeq ($(wildcard ../../.git/HEAD),) 848 GIT-HEAD-PHONY = ../../.git/HEAD 849else 850 GIT-HEAD-PHONY = 851endif 852 853FORCE: 854 855.PHONY: all install clean config-clean strip install-gtk 856.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell 857.PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE prepare 858.PHONY: libtraceevent_plugins archheaders 859 860endif # force_fixdep 861