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# As per kernel Makefile, avoid funny character set dependencies 93unexport LC_ALL 94LC_COLLATE=C 95LC_NUMERIC=C 96export LC_COLLATE LC_NUMERIC 97 98ifeq ($(srctree),) 99srctree := $(patsubst %/,%,$(dir $(shell pwd))) 100srctree := $(patsubst %/,%,$(dir $(srctree))) 101#$(info Determined 'srctree' to be $(srctree)) 102endif 103 104ifneq ($(objtree),) 105#$(info Determined 'objtree' to be $(objtree)) 106endif 107 108ifneq ($(OUTPUT),) 109#$(info Determined 'OUTPUT' to be $(OUTPUT)) 110# Adding $(OUTPUT) as a directory to look for source files, 111# because use generated output files as sources dependency 112# for flex/bison parsers. 113VPATH += $(OUTPUT) 114export VPATH 115endif 116 117ifeq ($(V),1) 118 Q = 119else 120 Q = @ 121endif 122 123# Do not use make's built-in rules 124# (this improves performance and avoids hard-to-debug behaviour); 125MAKEFLAGS += -r 126 127$(OUTPUT)PERF-VERSION-FILE: ../../.git/HEAD 128 $(Q)$(SHELL_PATH) util/PERF-VERSION-GEN $(OUTPUT) 129 $(Q)touch $(OUTPUT)PERF-VERSION-FILE 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 147LD += $(EXTRA_LDFLAGS) 148 149HOSTCC ?= gcc 150HOSTLD ?= ld 151HOSTAR ?= ar 152 153PKG_CONFIG = $(CROSS_COMPILE)pkg-config 154 155RM = rm -f 156LN = ln -f 157MKDIR = mkdir 158FIND = find 159INSTALL = install 160FLEX = flex 161BISON = bison 162STRIP = strip 163AWK = awk 164 165LIB_DIR = $(srctree)/tools/lib/api/ 166TRACE_EVENT_DIR = $(srctree)/tools/lib/traceevent/ 167BPF_DIR = $(srctree)/tools/lib/bpf/ 168SUBCMD_DIR = $(srctree)/tools/lib/subcmd/ 169 170# include Makefile.config by default and rule out 171# non-config cases 172config := 1 173 174NON_CONFIG_TARGETS := clean TAGS tags cscope help install-doc 175 176ifdef MAKECMDGOALS 177ifeq ($(filter-out $(NON_CONFIG_TARGETS),$(MAKECMDGOALS)),) 178 config := 0 179endif 180endif 181 182# Set FEATURE_TESTS to 'all' so all possible feature checkers are executed. 183# Without this setting the output feature dump file misses some features, for 184# example, liberty. Select all checkers so we won't get an incomplete feature 185# dump file. 186ifeq ($(config),1) 187ifdef MAKECMDGOALS 188ifeq ($(filter feature-dump,$(MAKECMDGOALS)),feature-dump) 189FEATURE_TESTS := all 190endif 191endif 192include Makefile.config 193endif 194 195ifeq ($(config),0) 196include $(srctree)/tools/scripts/Makefile.arch 197-include arch/$(ARCH)/Makefile 198endif 199 200# The FEATURE_DUMP_EXPORT holds location of the actual 201# FEATURE_DUMP file to be used to bypass feature detection 202# (for bpf or any other subproject) 203ifeq ($(FEATURES_DUMP),) 204FEATURE_DUMP_EXPORT := $(realpath $(OUTPUT)FEATURE-DUMP) 205else 206FEATURE_DUMP_EXPORT := $(FEATURES_DUMP) 207endif 208 209export prefix bindir sharedir sysconfdir DESTDIR 210 211# sparse is architecture-neutral, which means that we need to tell it 212# explicitly what architecture to check for. Fix this up for yours.. 213SPARSE_FLAGS = -D__BIG_ENDIAN__ -D__powerpc__ 214 215# Guard against environment variables 216PYRF_OBJS = 217SCRIPT_SH = 218 219SCRIPT_SH += perf-archive.sh 220SCRIPT_SH += perf-with-kcore.sh 221 222grep-libs = $(filter -l%,$(1)) 223strip-libs = $(filter-out -l%,$(1)) 224 225ifneq ($(OUTPUT),) 226 TE_PATH=$(OUTPUT) 227 BPF_PATH=$(OUTPUT) 228 SUBCMD_PATH=$(OUTPUT) 229ifneq ($(subdir),) 230 API_PATH=$(OUTPUT)/../lib/api/ 231else 232 API_PATH=$(OUTPUT) 233endif 234else 235 TE_PATH=$(TRACE_EVENT_DIR) 236 API_PATH=$(LIB_DIR) 237 BPF_PATH=$(BPF_DIR) 238 SUBCMD_PATH=$(SUBCMD_DIR) 239endif 240 241LIBTRACEEVENT = $(TE_PATH)libtraceevent.a 242export LIBTRACEEVENT 243 244LIBTRACEEVENT_DYNAMIC_LIST = $(TE_PATH)libtraceevent-dynamic-list 245LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS = -Xlinker --dynamic-list=$(LIBTRACEEVENT_DYNAMIC_LIST) 246 247LIBAPI = $(API_PATH)libapi.a 248export LIBAPI 249 250LIBBPF = $(BPF_PATH)libbpf.a 251 252LIBSUBCMD = $(SUBCMD_PATH)libsubcmd.a 253 254# python extension build directories 255PYTHON_EXTBUILD := $(OUTPUT)python_ext_build/ 256PYTHON_EXTBUILD_LIB := $(PYTHON_EXTBUILD)lib/ 257PYTHON_EXTBUILD_TMP := $(PYTHON_EXTBUILD)tmp/ 258export PYTHON_EXTBUILD_LIB PYTHON_EXTBUILD_TMP 259 260python-clean := $(call QUIET_CLEAN, python) $(RM) -r $(PYTHON_EXTBUILD) $(OUTPUT)python/perf.so 261 262PYTHON_EXT_SRCS := $(shell grep -v ^\# util/python-ext-sources) 263PYTHON_EXT_DEPS := util/python-ext-sources util/setup.py $(LIBTRACEEVENT) $(LIBAPI) 264 265$(OUTPUT)python/perf.so: $(PYTHON_EXT_SRCS) $(PYTHON_EXT_DEPS) $(LIBTRACEEVENT_DYNAMIC_LIST) 266 $(QUIET_GEN)LDSHARED="$(CC) -pthread -shared" \ 267 CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS)' \ 268 $(PYTHON_WORD) util/setup.py \ 269 --quiet build_ext; \ 270 mkdir -p $(OUTPUT)python && \ 271 cp $(PYTHON_EXTBUILD_LIB)perf.so $(OUTPUT)python/ 272# 273# No Perl scripts right now: 274# 275 276SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) 277 278PROGRAMS += $(OUTPUT)perf 279 280ifndef NO_PERF_READ_VDSO32 281PROGRAMS += $(OUTPUT)perf-read-vdso32 282endif 283 284ifndef NO_PERF_READ_VDSOX32 285PROGRAMS += $(OUTPUT)perf-read-vdsox32 286endif 287 288LIBJVMTI = libperf-jvmti.so 289 290ifndef NO_JVMTI 291PROGRAMS += $(OUTPUT)$(LIBJVMTI) 292endif 293 294# what 'all' will build and 'install' will install, in perfexecdir 295ALL_PROGRAMS = $(PROGRAMS) $(SCRIPTS) 296 297# what 'all' will build but not install in perfexecdir 298OTHER_PROGRAMS = $(OUTPUT)perf 299 300# Set paths to tools early so that they can be used for version tests. 301ifndef SHELL_PATH 302 SHELL_PATH = /bin/sh 303endif 304ifndef PERL_PATH 305 PERL_PATH = /usr/bin/perl 306endif 307 308export PERL_PATH 309 310LIB_FILE=$(OUTPUT)libperf.a 311 312PERFLIBS = $(LIB_FILE) $(LIBAPI) $(LIBTRACEEVENT) $(LIBSUBCMD) 313ifndef NO_LIBBPF 314 PERFLIBS += $(LIBBPF) 315endif 316 317# We choose to avoid "if .. else if .. else .. endif endif" 318# because maintaining the nesting to match is a pain. If 319# we had "elif" things would have been much nicer... 320 321ifneq ($(OUTPUT),) 322 CFLAGS += -I$(OUTPUT) 323endif 324 325ifndef NO_GTK2 326 ALL_PROGRAMS += $(OUTPUT)libperf-gtk.so 327 GTK_IN := $(OUTPUT)gtk-in.o 328 329install-gtk: $(OUTPUT)libperf-gtk.so 330 $(call QUIET_INSTALL, 'GTK UI') \ 331 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(libdir_SQ)'; \ 332 $(INSTALL) $(OUTPUT)libperf-gtk.so '$(DESTDIR_SQ)$(libdir_SQ)' 333endif 334 335ifdef ASCIIDOC8 336 export ASCIIDOC8 337endif 338 339LIBS = -Wl,--whole-archive $(PERFLIBS) -Wl,--no-whole-archive -Wl,--start-group $(EXTLIBS) -Wl,--end-group 340 341export INSTALL SHELL_PATH 342 343### Build rules 344 345SHELL = $(SHELL_PATH) 346 347all: shell_compatibility_test $(ALL_PROGRAMS) $(LANG_BINDINGS) $(OTHER_PROGRAMS) 348 349please_set_SHELL_PATH_to_a_more_modern_shell: 350 $(Q)$$(:) 351 352shell_compatibility_test: please_set_SHELL_PATH_to_a_more_modern_shell 353 354strip: $(PROGRAMS) $(OUTPUT)perf 355 $(STRIP) $(STRIP_OPTS) $(PROGRAMS) $(OUTPUT)perf 356 357PERF_IN := $(OUTPUT)perf-in.o 358 359export srctree OUTPUT RM CC LD AR CFLAGS V BISON FLEX AWK 360export HOSTCC HOSTLD HOSTAR 361include $(srctree)/tools/build/Makefile.include 362 363JEVENTS := $(OUTPUT)pmu-events/jevents 364JEVENTS_IN := $(OUTPUT)pmu-events/jevents-in.o 365 366PMU_EVENTS_IN := $(OUTPUT)pmu-events/pmu-events-in.o 367 368export JEVENTS 369 370build := -f $(srctree)/tools/build/Makefile.build dir=. obj 371 372$(PERF_IN): prepare FORCE 373 @(test -f ../../include/uapi/linux/perf_event.h && ( \ 374 (diff -B ../include/uapi/linux/perf_event.h ../../include/uapi/linux/perf_event.h >/dev/null) \ 375 || echo "Warning: tools/include/uapi/linux/perf_event.h differs from kernel" >&2 )) || true 376 @(test -f ../../include/linux/hash.h && ( \ 377 (diff -B ../include/linux/hash.h ../../include/linux/hash.h >/dev/null) \ 378 || echo "Warning: tools/include/linux/hash.h differs from kernel" >&2 )) || true 379 @(test -f ../../include/uapi/linux/hw_breakpoint.h && ( \ 380 (diff -B ../include/uapi/linux/hw_breakpoint.h ../../include/uapi/linux/hw_breakpoint.h >/dev/null) \ 381 || echo "Warning: tools/include/uapi/linux/hw_breakpoint.h differs from kernel" >&2 )) || true 382 @(test -f ../../arch/x86/include/asm/disabled-features.h && ( \ 383 (diff -B ../arch/x86/include/asm/disabled-features.h ../../arch/x86/include/asm/disabled-features.h >/dev/null) \ 384 || echo "Warning: tools/arch/x86/include/asm/disabled-features.h differs from kernel" >&2 )) || true 385 @(test -f ../../arch/x86/include/asm/required-features.h && ( \ 386 (diff -B ../arch/x86/include/asm/required-features.h ../../arch/x86/include/asm/required-features.h >/dev/null) \ 387 || echo "Warning: tools/arch/x86/include/asm/required-features.h differs from kernel" >&2 )) || true 388 @(test -f ../../arch/x86/include/asm/cpufeatures.h && ( \ 389 (diff -B ../arch/x86/include/asm/cpufeatures.h ../../arch/x86/include/asm/cpufeatures.h >/dev/null) \ 390 || echo "Warning: tools/arch/x86/include/asm/cpufeatures.h differs from kernel" >&2 )) || true 391 @(test -f ../../arch/x86/lib/memcpy_64.S && ( \ 392 (diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memcpy_64.S >/dev/null) \ 393 || echo "Warning: tools/arch/x86/lib/memcpy_64.S differs from kernel" >&2 )) || true 394 @(test -f ../../arch/x86/lib/memset_64.S && ( \ 395 (diff -B -I "^EXPORT_SYMBOL" -I "^#include <asm/export.h>" ../arch/x86/lib/memset_64.S ../../arch/x86/lib/memset_64.S >/dev/null) \ 396 || echo "Warning: tools/arch/x86/lib/memset_64.S differs from kernel" >&2 )) || true 397 @(test -f ../../arch/arm/include/uapi/asm/perf_regs.h && ( \ 398 (diff -B ../arch/arm/include/uapi/asm/perf_regs.h ../../arch/arm/include/uapi/asm/perf_regs.h >/dev/null) \ 399 || echo "Warning: tools/arch/arm/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 400 @(test -f ../../arch/arm64/include/uapi/asm/perf_regs.h && ( \ 401 (diff -B ../arch/arm64/include/uapi/asm/perf_regs.h ../../arch/arm64/include/uapi/asm/perf_regs.h >/dev/null) \ 402 || echo "Warning: tools/arch/arm64/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 403 @(test -f ../../arch/powerpc/include/uapi/asm/perf_regs.h && ( \ 404 (diff -B ../arch/powerpc/include/uapi/asm/perf_regs.h ../../arch/powerpc/include/uapi/asm/perf_regs.h >/dev/null) \ 405 || echo "Warning: tools/arch/powerpc/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 406 @(test -f ../../arch/x86/include/uapi/asm/perf_regs.h && ( \ 407 (diff -B ../arch/x86/include/uapi/asm/perf_regs.h ../../arch/x86/include/uapi/asm/perf_regs.h >/dev/null) \ 408 || echo "Warning: tools/arch/x86/include/uapi/asm/perf_regs.h differs from kernel" >&2 )) || true 409 @(test -f ../../arch/x86/include/uapi/asm/kvm.h && ( \ 410 (diff -B ../arch/x86/include/uapi/asm/kvm.h ../../arch/x86/include/uapi/asm/kvm.h >/dev/null) \ 411 || echo "Warning: tools/arch/x86/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 412 @(test -f ../../arch/x86/include/uapi/asm/kvm_perf.h && ( \ 413 (diff -B ../arch/x86/include/uapi/asm/kvm_perf.h ../../arch/x86/include/uapi/asm/kvm_perf.h >/dev/null) \ 414 || echo "Warning: tools/arch/x86/include/uapi/asm/kvm_perf.h differs from kernel" >&2 )) || true 415 @(test -f ../../arch/x86/include/uapi/asm/svm.h && ( \ 416 (diff -B ../arch/x86/include/uapi/asm/svm.h ../../arch/x86/include/uapi/asm/svm.h >/dev/null) \ 417 || echo "Warning: tools/arch/x86/include/uapi/asm/svm.h differs from kernel" >&2 )) || true 418 @(test -f ../../arch/x86/include/uapi/asm/vmx.h && ( \ 419 (diff -B ../arch/x86/include/uapi/asm/vmx.h ../../arch/x86/include/uapi/asm/vmx.h >/dev/null) \ 420 || echo "Warning: tools/arch/x86/include/uapi/asm/vmx.h differs from kernel" >&2 )) || true 421 @(test -f ../../arch/powerpc/include/uapi/asm/kvm.h && ( \ 422 (diff -B ../arch/powerpc/include/uapi/asm/kvm.h ../../arch/powerpc/include/uapi/asm/kvm.h >/dev/null) \ 423 || echo "Warning: tools/arch/powerpc/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 424 @(test -f ../../arch/s390/include/uapi/asm/kvm.h && ( \ 425 (diff -B ../arch/s390/include/uapi/asm/kvm.h ../../arch/s390/include/uapi/asm/kvm.h >/dev/null) \ 426 || echo "Warning: tools/arch/s390/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 427 @(test -f ../../arch/s390/include/uapi/asm/kvm_perf.h && ( \ 428 (diff -B ../arch/s390/include/uapi/asm/kvm_perf.h ../../arch/s390/include/uapi/asm/kvm_perf.h >/dev/null) \ 429 || echo "Warning: tools/arch/s390/include/uapi/asm/kvm_perf.h differs from kernel" >&2 )) || true 430 @(test -f ../../arch/s390/include/uapi/asm/sie.h && ( \ 431 (diff -B ../arch/s390/include/uapi/asm/sie.h ../../arch/s390/include/uapi/asm/sie.h >/dev/null) \ 432 || echo "Warning: tools/arch/s390/include/uapi/asm/sie.h differs from kernel" >&2 )) || true 433 @(test -f ../../arch/arm/include/uapi/asm/kvm.h && ( \ 434 (diff -B ../arch/arm/include/uapi/asm/kvm.h ../../arch/arm/include/uapi/asm/kvm.h >/dev/null) \ 435 || echo "Warning: tools/arch/arm/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 436 @(test -f ../../arch/arm64/include/uapi/asm/kvm.h && ( \ 437 (diff -B ../arch/arm64/include/uapi/asm/kvm.h ../../arch/arm64/include/uapi/asm/kvm.h >/dev/null) \ 438 || echo "Warning: tools/arch/arm64/include/uapi/asm/kvm.h differs from kernel" >&2 )) || true 439 @(test -f ../../include/asm-generic/bitops/arch_hweight.h && ( \ 440 (diff -B ../include/asm-generic/bitops/arch_hweight.h ../../include/asm-generic/bitops/arch_hweight.h >/dev/null) \ 441 || echo "Warning: tools/include/asm-generic/bitops/arch_hweight.h differs from kernel" >&2 )) || true 442 @(test -f ../../include/asm-generic/bitops/const_hweight.h && ( \ 443 (diff -B ../include/asm-generic/bitops/const_hweight.h ../../include/asm-generic/bitops/const_hweight.h >/dev/null) \ 444 || echo "Warning: tools/include/asm-generic/bitops/const_hweight.h differs from kernel" >&2 )) || true 445 @(test -f ../../include/asm-generic/bitops/__fls.h && ( \ 446 (diff -B ../include/asm-generic/bitops/__fls.h ../../include/asm-generic/bitops/__fls.h >/dev/null) \ 447 || echo "Warning: tools/include/asm-generic/bitops/__fls.h differs from kernel" >&2 )) || true 448 @(test -f ../../include/asm-generic/bitops/fls.h && ( \ 449 (diff -B ../include/asm-generic/bitops/fls.h ../../include/asm-generic/bitops/fls.h >/dev/null) \ 450 || echo "Warning: tools/include/asm-generic/bitops/fls.h differs from kernel" >&2 )) || true 451 @(test -f ../../include/asm-generic/bitops/fls64.h && ( \ 452 (diff -B ../include/asm-generic/bitops/fls64.h ../../include/asm-generic/bitops/fls64.h >/dev/null) \ 453 || echo "Warning: tools/include/asm-generic/bitops/fls64.h differs from kernel" >&2 )) || true 454 @(test -f ../../include/linux/coresight-pmu.h && ( \ 455 (diff -B ../include/linux/coresight-pmu.h ../../include/linux/coresight-pmu.h >/dev/null) \ 456 || echo "Warning: tools/include/linux/coresight-pmu.h differs from kernel" >&2 )) || true 457 @(test -f ../../include/uapi/asm-generic/mman-common.h && ( \ 458 (diff -B ../include/uapi/asm-generic/mman-common.h ../../include/uapi/asm-generic/mman-common.h >/dev/null) \ 459 || echo "Warning: tools/include/uapi/asm-generic/mman-common.h differs from kernel" >&2 )) || true 460 @(test -f ../../include/uapi/asm-generic/mman.h && ( \ 461 (diff -B -I "^#include <\(uapi/\)*asm-generic/mman-common.h>$$" ../include/uapi/asm-generic/mman.h ../../include/uapi/asm-generic/mman.h >/dev/null) \ 462 || echo "Warning: tools/include/uapi/asm-generic/mman.h differs from kernel" >&2 )) || true 463 @(test -f ../../include/uapi/linux/mman.h && ( \ 464 (diff -B -I "^#include <\(uapi/\)*asm/mman.h>$$" ../include/uapi/linux/mman.h ../../include/uapi/linux/mman.h >/dev/null) \ 465 || echo "Warning: tools/include/uapi/linux/mman.h differs from kernel" >&2 )) || true 466 $(Q)$(MAKE) $(build)=perf 467 468$(JEVENTS_IN): FORCE 469 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=jevents 470 471$(JEVENTS): $(JEVENTS_IN) 472 $(QUIET_LINK)$(HOSTCC) $(JEVENTS_IN) -o $@ 473 474$(PMU_EVENTS_IN): $(JEVENTS) FORCE 475 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=pmu-events obj=pmu-events 476 477$(OUTPUT)perf: $(PERFLIBS) $(PERF_IN) $(PMU_EVENTS_IN) $(LIBTRACEEVENT_DYNAMIC_LIST) 478 $(QUIET_LINK)$(CC) $(CFLAGS) $(LDFLAGS) $(LIBTRACEEVENT_DYNAMIC_LIST_LDFLAGS) \ 479 $(PERF_IN) $(PMU_EVENTS_IN) $(LIBS) -o $@ 480 481$(GTK_IN): fixdep FORCE 482 $(Q)$(MAKE) $(build)=gtk 483 484$(OUTPUT)libperf-gtk.so: $(GTK_IN) $(PERFLIBS) 485 $(QUIET_LINK)$(CC) -o $@ -shared $(LDFLAGS) $(filter %.o,$^) $(GTK_LIBS) 486 487$(OUTPUT)common-cmds.h: util/generate-cmdlist.sh command-list.txt 488 489$(OUTPUT)common-cmds.h: $(wildcard Documentation/perf-*.txt) 490 $(QUIET_GEN). util/generate-cmdlist.sh > $@+ && mv $@+ $@ 491 492$(SCRIPTS) : % : %.sh 493 $(QUIET_GEN)$(INSTALL) '[email protected]' '$(OUTPUT)$@' 494 495# These can record PERF_VERSION 496perf.spec $(SCRIPTS) \ 497 : $(OUTPUT)PERF-VERSION-FILE 498 499.SUFFIXES: 500 501# 502# If a target does not match any of the later rules then prefix it by $(OUTPUT) 503# This makes targets like 'make O=/tmp/perf perf.o' work in a natural way. 504# 505ifneq ($(OUTPUT),) 506%.o: $(OUTPUT)%.o 507 @echo " # Redirected target $@ => $(OUTPUT)$@" 508pmu-events/%.o: $(OUTPUT)pmu-events/%.o 509 @echo " # Redirected target $@ => $(OUTPUT)$@" 510util/%.o: $(OUTPUT)util/%.o 511 @echo " # Redirected target $@ => $(OUTPUT)$@" 512bench/%.o: $(OUTPUT)bench/%.o 513 @echo " # Redirected target $@ => $(OUTPUT)$@" 514tests/%.o: $(OUTPUT)tests/%.o 515 @echo " # Redirected target $@ => $(OUTPUT)$@" 516endif 517 518# These two need to be here so that when O= is not used they take precedence 519# over the general rule for .o 520 521# get relative building directory (to $(OUTPUT)) 522# and '.' if it's $(OUTPUT) itself 523__build-dir = $(subst $(OUTPUT),,$(dir $@)) 524build-dir = $(if $(__build-dir),$(__build-dir),.) 525 526prepare: $(OUTPUT)PERF-VERSION-FILE $(OUTPUT)common-cmds.h fixdep archheaders 527 528$(OUTPUT)%.o: %.c prepare FORCE 529 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 530 531$(OUTPUT)%.i: %.c prepare FORCE 532 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 533 534$(OUTPUT)%.s: %.c prepare FORCE 535 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 536 537$(OUTPUT)%-bison.o: %.c prepare FORCE 538 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 539 540$(OUTPUT)%-flex.o: %.c prepare FORCE 541 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 542 543$(OUTPUT)%.o: %.S prepare FORCE 544 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 545 546$(OUTPUT)%.i: %.S prepare FORCE 547 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=$(build-dir) $@ 548 549$(OUTPUT)perf-%: %.o $(PERFLIBS) 550 $(QUIET_LINK)$(CC) $(CFLAGS) -o $@ $(LDFLAGS) $(filter %.o,$^) $(LIBS) 551 552ifndef NO_PERF_READ_VDSO32 553$(OUTPUT)perf-read-vdso32: perf-read-vdso.c util/find-vdso-map.c 554 $(QUIET_CC)$(CC) -m32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c 555endif 556 557ifndef NO_PERF_READ_VDSOX32 558$(OUTPUT)perf-read-vdsox32: perf-read-vdso.c util/find-vdso-map.c 559 $(QUIET_CC)$(CC) -mx32 $(filter -static,$(LDFLAGS)) -Wall -Werror -o $@ perf-read-vdso.c 560endif 561 562ifndef NO_JVMTI 563LIBJVMTI_IN := $(OUTPUT)jvmti/jvmti-in.o 564 565$(LIBJVMTI_IN): FORCE 566 $(Q)$(MAKE) -f $(srctree)/tools/build/Makefile.build dir=jvmti obj=jvmti 567 568$(OUTPUT)$(LIBJVMTI): $(LIBJVMTI_IN) 569 $(QUIET_LINK)$(CC) -shared -Wl,-soname -Wl,$(LIBJVMTI) -o $@ $< -lelf -lrt 570endif 571 572$(patsubst perf-%,%.o,$(PROGRAMS)): $(wildcard */*.h) 573 574LIBPERF_IN := $(OUTPUT)libperf-in.o 575 576$(LIBPERF_IN): prepare fixdep FORCE 577 $(Q)$(MAKE) $(build)=libperf 578 579$(LIB_FILE): $(LIBPERF_IN) 580 $(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIBPERF_IN) $(LIB_OBJS) 581 582LIBTRACEEVENT_FLAGS += plugin_dir=$(plugindir_SQ) 583 584$(LIBTRACEEVENT): fixdep FORCE 585 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent.a 586 587libtraceevent_plugins: fixdep FORCE 588 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) plugins 589 590$(LIBTRACEEVENT_DYNAMIC_LIST): libtraceevent_plugins 591 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) $(OUTPUT)libtraceevent-dynamic-list 592 593$(LIBTRACEEVENT)-clean: 594 $(call QUIET_CLEAN, libtraceevent) 595 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) O=$(OUTPUT) clean >/dev/null 596 597install-traceevent-plugins: libtraceevent_plugins 598 $(Q)$(MAKE) -C $(TRACE_EVENT_DIR) $(LIBTRACEEVENT_FLAGS) O=$(OUTPUT) install_plugins 599 600$(LIBAPI): fixdep FORCE 601 $(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) $(OUTPUT)libapi.a 602 603$(LIBAPI)-clean: 604 $(call QUIET_CLEAN, libapi) 605 $(Q)$(MAKE) -C $(LIB_DIR) O=$(OUTPUT) clean >/dev/null 606 607$(LIBBPF): fixdep FORCE 608 $(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) $(OUTPUT)libbpf.a FEATURES_DUMP=$(FEATURE_DUMP_EXPORT) 609 610$(LIBBPF)-clean: 611 $(call QUIET_CLEAN, libbpf) 612 $(Q)$(MAKE) -C $(BPF_DIR) O=$(OUTPUT) clean >/dev/null 613 614$(LIBSUBCMD): fixdep FORCE 615 $(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) $(OUTPUT)libsubcmd.a 616 617$(LIBSUBCMD)-clean: 618 $(call QUIET_CLEAN, libsubcmd) 619 $(Q)$(MAKE) -C $(SUBCMD_DIR) O=$(OUTPUT) clean 620 621help: 622 @echo 'Perf make targets:' 623 @echo ' doc - make *all* documentation (see below)' 624 @echo ' man - make manpage documentation (access with man <foo>)' 625 @echo ' html - make html documentation' 626 @echo ' info - make GNU info documentation (access with info <foo>)' 627 @echo ' pdf - make pdf documentation' 628 @echo ' TAGS - use etags to make tag information for source browsing' 629 @echo ' tags - use ctags to make tag information for source browsing' 630 @echo ' cscope - use cscope to make interactive browsing database' 631 @echo '' 632 @echo 'Perf install targets:' 633 @echo ' NOTE: documentation build requires asciidoc, xmlto packages to be installed' 634 @echo ' HINT: use "prefix" or "DESTDIR" to install to a particular' 635 @echo ' path like "make prefix=/usr/local install install-doc"' 636 @echo ' install - install compiled binaries' 637 @echo ' install-doc - install *all* documentation' 638 @echo ' install-man - install manpage documentation' 639 @echo ' install-html - install html documentation' 640 @echo ' install-info - install GNU info documentation' 641 @echo ' install-pdf - install pdf documentation' 642 @echo '' 643 @echo ' quick-install-doc - alias for quick-install-man' 644 @echo ' quick-install-man - install the documentation quickly' 645 @echo ' quick-install-html - install the html documentation quickly' 646 @echo '' 647 @echo 'Perf maintainer targets:' 648 @echo ' clean - clean all binary objects and build output' 649 650 651DOC_TARGETS := doc man html info pdf 652 653INSTALL_DOC_TARGETS := $(patsubst %,install-%,$(DOC_TARGETS)) try-install-man 654INSTALL_DOC_TARGETS += quick-install-doc quick-install-man quick-install-html 655 656# 'make doc' should call 'make -C Documentation all' 657$(DOC_TARGETS): 658 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:doc=all) 659 660TAG_FOLDERS= . ../lib ../include 661TAG_FILES= ../../include/uapi/linux/perf_event.h 662 663TAGS: 664 $(QUIET_GEN)$(RM) TAGS; \ 665 $(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs etags -a $(TAG_FILES) 666 667tags: 668 $(QUIET_GEN)$(RM) tags; \ 669 $(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs ctags -a $(TAG_FILES) 670 671cscope: 672 $(QUIET_GEN)$(RM) cscope*; \ 673 $(FIND) $(TAG_FOLDERS) -name '*.[hcS]' -print | xargs cscope -b $(TAG_FILES) 674 675### Testing rules 676 677# GNU make supports exporting all variables by "export" without parameters. 678# However, the environment gets quite big, and some programs have problems 679# with that. 680 681check: $(OUTPUT)common-cmds.h 682 if sparse; \ 683 then \ 684 for i in *.c */*.c; \ 685 do \ 686 sparse $(CFLAGS) $(SPARSE_FLAGS) $$i || exit; \ 687 done; \ 688 else \ 689 exit 1; \ 690 fi 691 692### Installation rules 693 694install-gtk: 695 696install-tools: all install-gtk 697 $(call QUIET_INSTALL, binaries) \ 698 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(bindir_SQ)'; \ 699 $(INSTALL) $(OUTPUT)perf '$(DESTDIR_SQ)$(bindir_SQ)'; \ 700 $(LN) '$(DESTDIR_SQ)$(bindir_SQ)/perf' '$(DESTDIR_SQ)$(bindir_SQ)/trace' 701ifndef NO_PERF_READ_VDSO32 702 $(call QUIET_INSTALL, perf-read-vdso32) \ 703 $(INSTALL) $(OUTPUT)perf-read-vdso32 '$(DESTDIR_SQ)$(bindir_SQ)'; 704endif 705ifndef NO_PERF_READ_VDSOX32 706 $(call QUIET_INSTALL, perf-read-vdsox32) \ 707 $(INSTALL) $(OUTPUT)perf-read-vdsox32 '$(DESTDIR_SQ)$(bindir_SQ)'; 708endif 709ifndef NO_JVMTI 710 $(call QUIET_INSTALL, $(LIBJVMTI)) \ 711 $(INSTALL) $(OUTPUT)$(LIBJVMTI) '$(DESTDIR_SQ)$(libdir_SQ)'; 712endif 713 $(call QUIET_INSTALL, libexec) \ 714 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' 715 $(call QUIET_INSTALL, perf-archive) \ 716 $(INSTALL) $(OUTPUT)perf-archive -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' 717 $(call QUIET_INSTALL, perf-with-kcore) \ 718 $(INSTALL) $(OUTPUT)perf-with-kcore -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)' 719ifndef NO_LIBAUDIT 720 $(call QUIET_INSTALL, strace/groups) \ 721 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)'; \ 722 $(INSTALL) trace/strace/groups/* -t '$(DESTDIR_SQ)$(STRACE_GROUPS_INSTDIR_SQ)' 723endif 724ifndef NO_LIBPERL 725 $(call QUIET_INSTALL, perl-scripts) \ 726 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \ 727 $(INSTALL) scripts/perl/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/Perf-Trace-Util/lib/Perf/Trace'; \ 728 $(INSTALL) scripts/perl/*.pl -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl'; \ 729 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin'; \ 730 $(INSTALL) scripts/perl/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/perl/bin' 731endif 732ifndef NO_LIBPYTHON 733 $(call QUIET_INSTALL, python-scripts) \ 734 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \ 735 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin'; \ 736 $(INSTALL) scripts/python/Perf-Trace-Util/lib/Perf/Trace/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/Perf-Trace-Util/lib/Perf/Trace'; \ 737 $(INSTALL) scripts/python/*.py -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python'; \ 738 $(INSTALL) scripts/python/bin/* -t '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/scripts/python/bin' 739endif 740 $(call QUIET_INSTALL, perf_completion-script) \ 741 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d'; \ 742 $(INSTALL) perf-completion.sh '$(DESTDIR_SQ)$(sysconfdir_SQ)/bash_completion.d/perf' 743 $(call QUIET_INSTALL, perf-tip) \ 744 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(tip_instdir_SQ)'; \ 745 $(INSTALL) Documentation/tips.txt -t '$(DESTDIR_SQ)$(tip_instdir_SQ)' 746 747install-tests: all install-gtk 748 $(call QUIET_INSTALL, tests) \ 749 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \ 750 $(INSTALL) tests/attr.py '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests'; \ 751 $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr'; \ 752 $(INSTALL) tests/attr/* '$(DESTDIR_SQ)$(perfexec_instdir_SQ)/tests/attr' 753 754install-bin: install-tools install-tests 755 756install: install-bin try-install-man install-traceevent-plugins 757 758install-python_ext: 759 $(PYTHON_WORD) util/setup.py --quiet install --root='/$(DESTDIR_SQ)' 760 761# 'make install-doc' should call 'make -C Documentation install' 762$(INSTALL_DOC_TARGETS): 763 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) $(@:-doc=) 764 765### Cleaning rules 766 767# 768# This is here, not in Makefile.config, because Makefile.config does 769# not get included for the clean target: 770# 771config-clean: 772 $(call QUIET_CLEAN, config) 773 $(Q)$(MAKE) -C $(srctree)/tools/build/feature/ $(if $(OUTPUT),OUTPUT=$(OUTPUT)feature/,) clean >/dev/null 774 775clean:: $(LIBTRACEEVENT)-clean $(LIBAPI)-clean $(LIBBPF)-clean $(LIBSUBCMD)-clean config-clean 776 $(call QUIET_CLEAN, core-objs) $(RM) $(LIB_FILE) $(OUTPUT)perf-archive $(OUTPUT)perf-with-kcore $(LANG_BINDINGS) 777 $(Q)find $(if $(OUTPUT),$(OUTPUT),.) -name '*.o' -delete -o -name '\.*.cmd' -delete -o -name '\.*.d' -delete 778 $(Q)$(RM) $(OUTPUT).config-detected 779 $(call QUIET_CLEAN, core-progs) $(RM) $(ALL_PROGRAMS) perf perf-read-vdso32 perf-read-vdsox32 $(OUTPUT)pmu-events/jevents $(OUTPUT)$(LIBJVMTI).so 780 $(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* \ 781 $(OUTPUT)util/intel-pt-decoder/inat-tables.c $(OUTPUT)fixdep \ 782 $(OUTPUT)tests/llvm-src-{base,kbuild,prologue,relocation}.c \ 783 $(OUTPUT)pmu-events/pmu-events.c 784 $(QUIET_SUBDIR0)Documentation $(QUIET_SUBDIR1) clean 785 $(python-clean) 786 787# 788# To provide FEATURE-DUMP into $(FEATURE_DUMP_COPY) 789# file if defined, with no further action. 790feature-dump: 791ifdef FEATURE_DUMP_COPY 792 @cp $(OUTPUT)FEATURE-DUMP $(FEATURE_DUMP_COPY) 793 @echo "FEATURE-DUMP file copied into $(FEATURE_DUMP_COPY)" 794else 795 @echo "FEATURE-DUMP file available in $(OUTPUT)FEATURE-DUMP" 796endif 797 798# 799# Trick: if ../../.git does not exist - we are building out of tree for example, 800# then force version regeneration: 801# 802ifeq ($(wildcard ../../.git/HEAD),) 803 GIT-HEAD-PHONY = ../../.git/HEAD 804else 805 GIT-HEAD-PHONY = 806endif 807 808FORCE: 809 810.PHONY: all install clean config-clean strip install-gtk 811.PHONY: shell_compatibility_test please_set_SHELL_PATH_to_a_more_modern_shell 812.PHONY: $(GIT-HEAD-PHONY) TAGS tags cscope FORCE prepare 813.PHONY: libtraceevent_plugins archheaders 814 815