blob: 8baaf9797101c34e862e21398178104e81d1d4d9 [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001
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
14$(shell printf "" > $(OUTPUT).config-detected)
15detected = $(shell echo "$(1)=y" >> $(OUTPUT).config-detected)
16detected_var = $(shell echo "$(1)=$($(1))" >> $(OUTPUT).config-detected)
17
18CFLAGS := $(EXTRA_CFLAGS) $(EXTRA_WARNINGS)
19
20include $(srctree)/tools/scripts/Makefile.arch
21
22$(call detected_var,SRCARCH)
23
24NO_PERF_REGS := 1
25
26# Additional ARCH settings for ppc
27ifeq ($(SRCARCH),powerpc)
28 NO_PERF_REGS := 0
29 LIBUNWIND_LIBS := -lunwind -lunwind-ppc64
30endif
31
32# Additional ARCH settings for x86
33ifeq ($(SRCARCH),x86)
34 $(call detected,CONFIG_X86)
35 ifeq (${IS_64_BIT}, 1)
36 CFLAGS += -DHAVE_ARCH_X86_64_SUPPORT -DHAVE_SYSCALL_TABLE -I$(OUTPUT)arch/x86/include/generated
37 ARCH_INCLUDE = ../../arch/x86/lib/memcpy_64.S ../../arch/x86/lib/memset_64.S
38 LIBUNWIND_LIBS = -lunwind-x86_64 -lunwind -llzma
39 $(call detected,CONFIG_X86_64)
40 else
41 LIBUNWIND_LIBS = -lunwind-x86 -llzma -lunwind
42 endif
43 NO_PERF_REGS := 0
44endif
45
46ifeq ($(SRCARCH),arm)
47 NO_PERF_REGS := 0
48 LIBUNWIND_LIBS = -lunwind -lunwind-arm
49endif
50
51ifeq ($(SRCARCH),arm64)
52 NO_PERF_REGS := 0
53 LIBUNWIND_LIBS = -lunwind -lunwind-aarch64
54endif
55
56ifeq ($(NO_PERF_REGS),0)
57 $(call detected,CONFIG_PERF_REGS)
58endif
59
60# So far there's only x86 and arm libdw unwind support merged in perf.
61# Disable it on all other architectures in case libdw unwind
62# support is detected in system. Add supported architectures
63# to the check.
64ifneq ($(SRCARCH),$(filter $(SRCARCH),x86 arm powerpc))
65 NO_LIBDW_DWARF_UNWIND := 1
66endif
67
68ifeq ($(LIBUNWIND_LIBS),)
69 NO_LIBUNWIND := 1
70endif
71#
72# For linking with debug library, run like:
73#
74# make DEBUG=1 LIBUNWIND_DIR=/opt/libunwind/
75#
76
77libunwind_arch_set_flags = $(eval $(libunwind_arch_set_flags_code))
78define libunwind_arch_set_flags_code
79 FEATURE_CHECK_CFLAGS-libunwind-$(1) = -I$(LIBUNWIND_DIR)/include
80 FEATURE_CHECK_LDFLAGS-libunwind-$(1) = -L$(LIBUNWIND_DIR)/lib
81endef
82
83ifdef LIBUNWIND_DIR
84 LIBUNWIND_CFLAGS = -I$(LIBUNWIND_DIR)/include
85 LIBUNWIND_LDFLAGS = -L$(LIBUNWIND_DIR)/lib
86 LIBUNWIND_ARCHS = x86 x86_64 arm aarch64 debug-frame-arm debug-frame-aarch64
87 $(foreach libunwind_arch,$(LIBUNWIND_ARCHS),$(call libunwind_arch_set_flags,$(libunwind_arch)))
88endif
89
90# Set per-feature check compilation flags
91FEATURE_CHECK_CFLAGS-libunwind = $(LIBUNWIND_CFLAGS)
92FEATURE_CHECK_LDFLAGS-libunwind = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
93FEATURE_CHECK_CFLAGS-libunwind-debug-frame = $(LIBUNWIND_CFLAGS)
94FEATURE_CHECK_LDFLAGS-libunwind-debug-frame = $(LIBUNWIND_LDFLAGS) $(LIBUNWIND_LIBS)
95
96ifeq ($(NO_PERF_REGS),0)
97 CFLAGS += -DHAVE_PERF_REGS_SUPPORT
98endif
99
100# for linking with debug library, run like:
101# make DEBUG=1 LIBDW_DIR=/opt/libdw/
102ifdef LIBDW_DIR
103 LIBDW_CFLAGS := -I$(LIBDW_DIR)/include
104 LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib
105endif
106DWARFLIBS := -ldw
107ifeq ($(findstring -static,${LDFLAGS}),-static)
108 DWARFLIBS += -lelf -lebl -ldl -lz -llzma -lbz2
109endif
110FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS)
111FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) $(DWARFLIBS)
112
113# for linking with debug library, run like:
114# make DEBUG=1 LIBBABELTRACE_DIR=/opt/libbabeltrace/
115ifdef LIBBABELTRACE_DIR
116 LIBBABELTRACE_CFLAGS := -I$(LIBBABELTRACE_DIR)/include
117 LIBBABELTRACE_LDFLAGS := -L$(LIBBABELTRACE_DIR)/lib
118endif
119FEATURE_CHECK_CFLAGS-libbabeltrace := $(LIBBABELTRACE_CFLAGS)
120FEATURE_CHECK_LDFLAGS-libbabeltrace := $(LIBBABELTRACE_LDFLAGS) -lbabeltrace-ctf
121
122FEATURE_CHECK_CFLAGS-bpf = -I. -I$(srctree)/tools/include -I$(srctree)/tools/arch/$(SRCARCH)/include/uapi -I$(srctree)/tools/include/uapi
123# include ARCH specific config
124-include $(src-perf)/arch/$(SRCARCH)/Makefile
125
126ifdef PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
127 CFLAGS += -DHAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
128endif
129
130include $(srctree)/tools/scripts/utilities.mak
131
132ifeq ($(call get-executable,$(FLEX)),)
133 dummy := $(error Error: $(FLEX) is missing on this system, please install it)
134endif
135
136ifeq ($(call get-executable,$(BISON)),)
137 dummy := $(error Error: $(BISON) is missing on this system, please install it)
138endif
139
140# Treat warnings as errors unless directed not to
141ifneq ($(WERROR),0)
142 CFLAGS += -Werror
143 CXXFLAGS += -Werror
144endif
145
146ifndef DEBUG
147 DEBUG := 0
148endif
149
150ifeq ($(DEBUG),0)
151ifeq ($(CC_NO_CLANG), 0)
152 CFLAGS += -O3
153else
154 CFLAGS += -O6
155endif
156endif
157
158ifdef PARSER_DEBUG
159 PARSER_DEBUG_BISON := -t
160 PARSER_DEBUG_FLEX := -d
161 CFLAGS += -DPARSER_DEBUG
162 $(call detected_var,PARSER_DEBUG_BISON)
163 $(call detected_var,PARSER_DEBUG_FLEX)
164endif
165
166# Try different combinations to accommodate systems that only have
167# python[2][-config] in weird combinations but always preferring
168# python2 and python2-config as per pep-0394. If we catch a
169# python[-config] in version 3, the version check will kill it.
170PYTHON2 := $(if $(call get-executable,python2),python2,python)
171override PYTHON := $(call get-executable-or-default,PYTHON,$(PYTHON2))
172PYTHON2_CONFIG := \
173 $(if $(call get-executable,$(PYTHON)-config),$(PYTHON)-config,python-config)
174override PYTHON_CONFIG := \
175 $(call get-executable-or-default,PYTHON_CONFIG,$(PYTHON2_CONFIG))
176
177grep-libs = $(filter -l%,$(1))
178strip-libs = $(filter-out -l%,$(1))
179
180PYTHON_CONFIG_SQ := $(call shell-sq,$(PYTHON_CONFIG))
181
182# Python 3.8 changed the output of `python-config --ldflags` to not include the
183# '-lpythonX.Y' flag unless '--embed' is also passed. The feature check for
184# libpython fails if that flag is not included in LDFLAGS
185ifeq ($(shell $(PYTHON_CONFIG_SQ) --ldflags --embed 2>&1 1>/dev/null; echo $$?), 0)
186 PYTHON_CONFIG_LDFLAGS := --ldflags --embed
187else
188 PYTHON_CONFIG_LDFLAGS := --ldflags
189endif
190
191ifdef PYTHON_CONFIG
192 PYTHON_EMBED_LDOPTS := $(shell $(PYTHON_CONFIG_SQ) $(PYTHON_CONFIG_LDFLAGS) 2>/dev/null)
193 PYTHON_EMBED_LDFLAGS := $(call strip-libs,$(PYTHON_EMBED_LDOPTS))
194 PYTHON_EMBED_LIBADD := $(call grep-libs,$(PYTHON_EMBED_LDOPTS)) -lutil
195 PYTHON_EMBED_CCOPTS := $(shell $(PYTHON_CONFIG_SQ) --cflags 2>/dev/null)
196 ifeq ($(CC_NO_CLANG), 1)
197 PYTHON_EMBED_CCOPTS := $(filter-out -specs=%,$(PYTHON_EMBED_CCOPTS))
198 endif
199 FLAGS_PYTHON_EMBED := $(PYTHON_EMBED_CCOPTS) $(PYTHON_EMBED_LDOPTS)
200endif
201
202FEATURE_CHECK_CFLAGS-libpython := $(PYTHON_EMBED_CCOPTS)
203FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS)
204FEATURE_CHECK_CFLAGS-libpython-version := $(PYTHON_EMBED_CCOPTS)
205FEATURE_CHECK_LDFLAGS-libpython-version := $(PYTHON_EMBED_LDOPTS)
206
207CFLAGS += -fno-omit-frame-pointer
208CFLAGS += -ggdb3
209CFLAGS += -funwind-tables
210CFLAGS += -Wall
211CFLAGS += -Wextra
212CFLAGS += -std=gnu99
213
214CXXFLAGS += -std=gnu++11 -fno-exceptions -fno-rtti
215CXXFLAGS += -Wall
216CXXFLAGS += -fno-omit-frame-pointer
217CXXFLAGS += -ggdb3
218CXXFLAGS += -funwind-tables
219CXXFLAGS += -Wno-strict-aliasing
220
221# Enforce a non-executable stack, as we may regress (again) in the future by
222# adding assembler files missing the .GNU-stack linker note.
223LDFLAGS += -Wl,-z,noexecstack
224
225EXTLIBS = -lpthread -lrt -lm -ldl
226
227ifeq ($(FEATURES_DUMP),)
228include $(srctree)/tools/build/Makefile.feature
229else
230include $(FEATURES_DUMP)
231endif
232
233ifeq ($(feature-stackprotector-all), 1)
234 CFLAGS += -fstack-protector-all
235endif
236
237ifeq ($(DEBUG),0)
238 ifeq ($(feature-fortify-source), 1)
239 CFLAGS += -D_FORTIFY_SOURCE=2
240 endif
241endif
242
243INC_FLAGS += -I$(src-perf)/util/include
244INC_FLAGS += -I$(src-perf)/arch/$(SRCARCH)/include
245INC_FLAGS += -I$(srctree)/tools/include/uapi
246INC_FLAGS += -I$(srctree)/tools/include/
247INC_FLAGS += -I$(srctree)/tools/arch/$(SRCARCH)/include/uapi
248INC_FLAGS += -I$(srctree)/tools/arch/$(SRCARCH)/include/
249INC_FLAGS += -I$(srctree)/tools/arch/$(SRCARCH)/
250
251# $(obj-perf) for generated common-cmds.h
252# $(obj-perf)/util for generated bison/flex headers
253ifneq ($(OUTPUT),)
254INC_FLAGS += -I$(obj-perf)/util
255INC_FLAGS += -I$(obj-perf)
256endif
257
258INC_FLAGS += -I$(src-perf)/util
259INC_FLAGS += -I$(src-perf)
260INC_FLAGS += -I$(srctree)/tools/lib/
261
262CFLAGS += $(INC_FLAGS)
263CXXFLAGS += $(INC_FLAGS)
264
265CFLAGS += -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
266
267ifeq ($(feature-sync-compare-and-swap), 1)
268 CFLAGS += -DHAVE_SYNC_COMPARE_AND_SWAP_SUPPORT
269endif
270
271ifeq ($(feature-pthread-attr-setaffinity-np), 1)
272 CFLAGS += -DHAVE_PTHREAD_ATTR_SETAFFINITY_NP
273endif
274
275ifndef NO_BIONIC
276 $(call feature_check,bionic)
277 ifeq ($(feature-bionic), 1)
278 BIONIC := 1
279 EXTLIBS := $(filter-out -lrt,$(EXTLIBS))
280 EXTLIBS := $(filter-out -lpthread,$(EXTLIBS))
281 endif
282endif
283
284ifdef NO_LIBELF
285 NO_DWARF := 1
286 NO_DEMANGLE := 1
287 NO_LIBUNWIND := 1
288 NO_LIBDW_DWARF_UNWIND := 1
289 NO_LIBBPF := 1
290 NO_JVMTI := 1
291else
292 ifeq ($(feature-libelf), 0)
293 ifeq ($(feature-glibc), 1)
294 LIBC_SUPPORT := 1
295 endif
296 ifeq ($(BIONIC),1)
297 LIBC_SUPPORT := 1
298 endif
299 ifeq ($(LIBC_SUPPORT),1)
300 msg := $(warning No libelf found. Disables 'probe' tool, jvmti and BPF support in 'perf record'. Please install libelf-dev, libelf-devel or elfutils-libelf-devel);
301
302 NO_LIBELF := 1
303 NO_DWARF := 1
304 NO_DEMANGLE := 1
305 NO_LIBUNWIND := 1
306 NO_LIBDW_DWARF_UNWIND := 1
307 NO_LIBBPF := 1
308 NO_JVMTI := 1
309 else
310 ifneq ($(filter s% -static%,$(LDFLAGS),),)
311 msg := $(error No static glibc found, please install glibc-static);
312 else
313 msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]);
314 endif
315 endif
316 else
317 ifndef NO_LIBDW_DWARF_UNWIND
318 ifneq ($(feature-libdw-dwarf-unwind),1)
319 NO_LIBDW_DWARF_UNWIND := 1
320 msg := $(warning No libdw DWARF unwind found, Please install elfutils-devel/libdw-dev >= 0.158 and/or set LIBDW_DIR);
321 endif
322 endif
323 ifneq ($(feature-dwarf), 1)
324 ifndef NO_DWARF
325 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);
326 NO_DWARF := 1
327 endif
328 else
329 ifneq ($(feature-dwarf_getlocations), 1)
330 msg := $(warning Old libdw.h, finding variables at given 'perf probe' point will not work, install elfutils-devel/libdw-dev >= 0.157);
331 else
332 CFLAGS += -DHAVE_DWARF_GETLOCATIONS
333 endif # dwarf_getlocations
334 endif # Dwarf support
335 endif # libelf support
336endif # NO_LIBELF
337
338ifdef NO_DWARF
339 NO_LIBDW_DWARF_UNWIND := 1
340endif
341
342ifeq ($(feature-sched_getcpu), 1)
343 CFLAGS += -DHAVE_SCHED_GETCPU_SUPPORT
344endif
345
346ifeq ($(feature-setns), 1)
347 CFLAGS += -DHAVE_SETNS_SUPPORT
348 $(call detected,CONFIG_SETNS)
349endif
350
351ifndef NO_LIBELF
352 CFLAGS += -DHAVE_LIBELF_SUPPORT
353 EXTLIBS += -lelf
354 $(call detected,CONFIG_LIBELF)
355
356 ifeq ($(feature-libelf-mmap), 1)
357 CFLAGS += -DHAVE_LIBELF_MMAP_SUPPORT
358 endif
359
360 ifeq ($(feature-libelf-getphdrnum), 1)
361 CFLAGS += -DHAVE_ELF_GETPHDRNUM_SUPPORT
362 endif
363
364 ifeq ($(feature-libelf-gelf_getnote), 1)
365 CFLAGS += -DHAVE_GELF_GETNOTE_SUPPORT
366 else
367 msg := $(warning gelf_getnote() not found on libelf, SDT support disabled);
368 endif
369
370 ifeq ($(feature-libelf-getshdrstrndx), 1)
371 CFLAGS += -DHAVE_ELF_GETSHDRSTRNDX_SUPPORT
372 endif
373
374 ifndef NO_DWARF
375 ifeq ($(origin PERF_HAVE_DWARF_REGS), undefined)
376 msg := $(warning DWARF register mappings have not been defined for architecture $(SRCARCH), DWARF support disabled);
377 NO_DWARF := 1
378 else
379 CFLAGS += -DHAVE_DWARF_SUPPORT $(LIBDW_CFLAGS)
380 LDFLAGS += $(LIBDW_LDFLAGS)
381 EXTLIBS += ${DWARFLIBS}
382 $(call detected,CONFIG_DWARF)
383 endif # PERF_HAVE_DWARF_REGS
384 endif # NO_DWARF
385
386 ifndef NO_LIBBPF
387 ifeq ($(feature-bpf), 1)
388 CFLAGS += -DHAVE_LIBBPF_SUPPORT
389 $(call detected,CONFIG_LIBBPF)
390 endif
391
392 ifndef NO_DWARF
393 ifdef PERF_HAVE_ARCH_REGS_QUERY_REGISTER_OFFSET
394 CFLAGS += -DHAVE_BPF_PROLOGUE
395 $(call detected,CONFIG_BPF_PROLOGUE)
396 else
397 msg := $(warning BPF prologue is not supported by architecture $(SRCARCH), missing regs_query_register_offset());
398 endif
399 else
400 msg := $(warning DWARF support is off, BPF prologue is disabled);
401 endif
402
403 endif # NO_LIBBPF
404endif # NO_LIBELF
405
406ifndef NO_SDT
407 ifneq ($(feature-sdt), 1)
408 msg := $(warning No sys/sdt.h found, no SDT events are defined, please install systemtap-sdt-devel or systemtap-sdt-dev);
409 NO_SDT := 1;
410 else
411 CFLAGS += -DHAVE_SDT_EVENT
412 $(call detected,CONFIG_SDT_EVENT)
413 endif
414endif
415
416ifdef PERF_HAVE_JITDUMP
417 ifndef NO_LIBELF
418 $(call detected,CONFIG_JITDUMP)
419 CFLAGS += -DHAVE_JITDUMP
420 endif
421endif
422
423ifeq ($(SRCARCH),powerpc)
424 ifndef NO_DWARF
425 CFLAGS += -DHAVE_SKIP_CALLCHAIN_IDX
426 endif
427endif
428
429ifndef NO_LIBUNWIND
430 have_libunwind :=
431
432 ifeq ($(feature-libunwind-x86), 1)
433 $(call detected,CONFIG_LIBUNWIND_X86)
434 CFLAGS += -DHAVE_LIBUNWIND_X86_SUPPORT
435 LDFLAGS += -lunwind-x86
436 EXTLIBS_LIBUNWIND += -lunwind-x86
437 have_libunwind = 1
438 endif
439
440 ifeq ($(feature-libunwind-aarch64), 1)
441 $(call detected,CONFIG_LIBUNWIND_AARCH64)
442 CFLAGS += -DHAVE_LIBUNWIND_AARCH64_SUPPORT
443 LDFLAGS += -lunwind-aarch64
444 EXTLIBS_LIBUNWIND += -lunwind-aarch64
445 have_libunwind = 1
446 $(call feature_check,libunwind-debug-frame-aarch64)
447 ifneq ($(feature-libunwind-debug-frame-aarch64), 1)
448 msg := $(warning No debug_frame support found in libunwind-aarch64);
449 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME_AARCH64
450 endif
451 endif
452
453 ifneq ($(feature-libunwind), 1)
454 msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
455 NO_LOCAL_LIBUNWIND := 1
456 else
457 have_libunwind := 1
458 $(call detected,CONFIG_LOCAL_LIBUNWIND)
459 endif
460
461 ifneq ($(have_libunwind), 1)
462 NO_LIBUNWIND := 1
463 endif
464else
465 NO_LOCAL_LIBUNWIND := 1
466endif
467
468ifndef NO_LIBBPF
469 ifneq ($(feature-bpf), 1)
470 msg := $(warning BPF API too old. Please install recent kernel headers. BPF support in 'perf record' is disabled.)
471 NO_LIBBPF := 1
472 endif
473endif
474
475dwarf-post-unwind := 1
476dwarf-post-unwind-text := BUG
477
478# setup DWARF post unwinder
479ifdef NO_LIBUNWIND
480 ifdef NO_LIBDW_DWARF_UNWIND
481 msg := $(warning Disabling post unwind, no support found.);
482 dwarf-post-unwind := 0
483 else
484 dwarf-post-unwind-text := libdw
485 $(call detected,CONFIG_LIBDW_DWARF_UNWIND)
486 endif
487else
488 dwarf-post-unwind-text := libunwind
489 $(call detected,CONFIG_LIBUNWIND)
490 # Enable libunwind support by default.
491 ifndef NO_LIBDW_DWARF_UNWIND
492 NO_LIBDW_DWARF_UNWIND := 1
493 endif
494endif
495
496ifeq ($(dwarf-post-unwind),1)
497 CFLAGS += -DHAVE_DWARF_UNWIND_SUPPORT
498 $(call detected,CONFIG_DWARF_UNWIND)
499else
500 NO_DWARF_UNWIND := 1
501endif
502
503ifndef NO_LOCAL_LIBUNWIND
504 ifeq ($(SRCARCH),$(filter $(SRCARCH),arm arm64))
505 $(call feature_check,libunwind-debug-frame)
506 ifneq ($(feature-libunwind-debug-frame), 1)
507 msg := $(warning No debug_frame support found in libunwind);
508 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
509 endif
510 else
511 # non-ARM has no dwarf_find_debug_frame() function:
512 CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
513 endif
514 EXTLIBS += $(LIBUNWIND_LIBS)
515 LDFLAGS += $(LIBUNWIND_LIBS)
516endif
517ifeq ($(findstring -static,${LDFLAGS}),-static)
518 # gcc -static links libgcc_eh which contans piece of libunwind
519 LIBUNWIND_LDFLAGS += -Wl,--allow-multiple-definition
520endif
521
522ifndef NO_LIBUNWIND
523 CFLAGS += -DHAVE_LIBUNWIND_SUPPORT
524 CFLAGS += $(LIBUNWIND_CFLAGS)
525 LDFLAGS += $(LIBUNWIND_LDFLAGS)
526 EXTLIBS += $(EXTLIBS_LIBUNWIND)
527endif
528
529ifndef NO_LIBAUDIT
530 ifneq ($(feature-libaudit), 1)
531 msg := $(warning No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev);
532 NO_LIBAUDIT := 1
533 else
534 CFLAGS += -DHAVE_LIBAUDIT_SUPPORT
535 EXTLIBS += -laudit
536 $(call detected,CONFIG_AUDIT)
537 endif
538endif
539
540ifndef NO_LIBCRYPTO
541 ifneq ($(feature-libcrypto), 1)
542 msg := $(warning No libcrypto.h found, disables jitted code injection, please install libssl-devel or libssl-dev);
543 NO_LIBCRYPTO := 1
544 else
545 CFLAGS += -DHAVE_LIBCRYPTO_SUPPORT
546 EXTLIBS += -lcrypto
547 $(call detected,CONFIG_CRYPTO)
548 endif
549endif
550
551ifdef NO_NEWT
552 NO_SLANG=1
553endif
554
555ifndef NO_SLANG
556 ifneq ($(feature-libslang), 1)
557 msg := $(warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev);
558 NO_SLANG := 1
559 else
560 # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h
561 CFLAGS += -I/usr/include/slang
562 CFLAGS += -DHAVE_SLANG_SUPPORT
563 EXTLIBS += -lslang
564 $(call detected,CONFIG_SLANG)
565 endif
566endif
567
568ifndef NO_GTK2
569 FLAGS_GTK2=$(CFLAGS) $(LDFLAGS) $(EXTLIBS) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null)
570 ifneq ($(feature-gtk2), 1)
571 msg := $(warning GTK2 not found, disables GTK2 support. Please install gtk2-devel or libgtk2.0-dev);
572 NO_GTK2 := 1
573 else
574 ifeq ($(feature-gtk2-infobar), 1)
575 GTK_CFLAGS := -DHAVE_GTK_INFO_BAR_SUPPORT
576 endif
577 CFLAGS += -DHAVE_GTK2_SUPPORT
578 GTK_CFLAGS += $(shell $(PKG_CONFIG) --cflags gtk+-2.0 2>/dev/null)
579 GTK_LIBS := $(shell $(PKG_CONFIG) --libs gtk+-2.0 2>/dev/null)
580 EXTLIBS += -ldl
581 endif
582endif
583
584
585ifdef NO_LIBPERL
586 CFLAGS += -DNO_LIBPERL
587else
588 PERL_EMBED_LDOPTS = $(shell perl -MExtUtils::Embed -e ldopts 2>/dev/null)
589 PERL_EMBED_LDFLAGS = $(call strip-libs,$(PERL_EMBED_LDOPTS))
590 PERL_EMBED_LIBADD = $(call grep-libs,$(PERL_EMBED_LDOPTS))
591 PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null`
592 FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS)
593
594 ifneq ($(feature-libperl), 1)
595 CFLAGS += -DNO_LIBPERL
596 NO_LIBPERL := 1
597 msg := $(warning Missing perl devel files. Disabling perl scripting support, please install perl-ExtUtils-Embed/libperl-dev);
598 else
599 LDFLAGS += $(PERL_EMBED_LDFLAGS)
600 EXTLIBS += $(PERL_EMBED_LIBADD)
601 $(call detected,CONFIG_LIBPERL)
602 endif
603endif
604
605ifeq ($(feature-timerfd), 1)
606 CFLAGS += -DHAVE_TIMERFD_SUPPORT
607else
608 msg := $(warning No timerfd support. Disables 'perf kvm stat live');
609endif
610
611disable-python = $(eval $(disable-python_code))
612define disable-python_code
613 CFLAGS += -DNO_LIBPYTHON
614 $(warning $1)
615 NO_LIBPYTHON := 1
616endef
617
618ifdef NO_LIBPYTHON
619 $(call disable-python,Python support disabled by user)
620else
621
622 ifndef PYTHON
623 $(call disable-python,No python interpreter was found: disables Python support - please install python-devel/python-dev)
624 else
625 PYTHON_WORD := $(call shell-wordify,$(PYTHON))
626
627 ifndef PYTHON_CONFIG
628 $(call disable-python,No 'python-config' tool was found: disables Python support - please install python-devel/python-dev)
629 else
630
631 ifneq ($(feature-libpython), 1)
632 $(call disable-python,No 'Python.h' (for Python 2.x support) was found: disables Python support - please install python-devel/python-dev)
633 else
634 ifneq ($(feature-libpython-version), 1)
635 $(warning Python 3 is not yet supported; please set)
636 $(warning PYTHON and/or PYTHON_CONFIG appropriately.)
637 $(warning If you also have Python 2 installed, then)
638 $(warning try something like:)
639 $(warning $(and ,))
640 $(warning $(and ,) make PYTHON=python2)
641 $(warning $(and ,))
642 $(warning Otherwise, disable Python support entirely:)
643 $(warning $(and ,))
644 $(warning $(and ,) make NO_LIBPYTHON=1)
645 $(warning $(and ,))
646 $(error $(and ,))
647 else
648 LDFLAGS += $(PYTHON_EMBED_LDFLAGS)
649 EXTLIBS += $(PYTHON_EMBED_LIBADD)
650 LANG_BINDINGS += $(obj-perf)python/perf.so
651 $(call detected,CONFIG_LIBPYTHON)
652 endif
653 endif
654 endif
655 endif
656endif
657
658ifeq ($(feature-libbfd), 1)
659 EXTLIBS += -lbfd
660
661 # call all detections now so we get correct
662 # status in VF output
663 $(call feature_check,liberty)
664 $(call feature_check,liberty-z)
665 $(call feature_check,cplus-demangle)
666
667 ifeq ($(feature-liberty), 1)
668 EXTLIBS += -liberty
669 else
670 ifeq ($(feature-liberty-z), 1)
671 EXTLIBS += -liberty -lz
672 endif
673 endif
674endif
675
676ifdef NO_DEMANGLE
677 CFLAGS += -DNO_DEMANGLE
678else
679 ifdef HAVE_CPLUS_DEMANGLE_SUPPORT
680 EXTLIBS += -liberty
681 CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
682 else
683 ifneq ($(feature-libbfd), 1)
684 ifneq ($(feature-liberty), 1)
685 ifneq ($(feature-liberty-z), 1)
686 # we dont have neither HAVE_CPLUS_DEMANGLE_SUPPORT
687 # or any of 'bfd iberty z' trinity
688 ifeq ($(feature-cplus-demangle), 1)
689 EXTLIBS += -liberty
690 CFLAGS += -DHAVE_CPLUS_DEMANGLE_SUPPORT
691 else
692 msg := $(warning No bfd.h/libbfd found, please install binutils-dev[el]/zlib-static/libiberty-dev to gain symbol demangling)
693 CFLAGS += -DNO_DEMANGLE
694 endif
695 endif
696 endif
697 endif
698 endif
699endif
700
701ifneq ($(filter -lbfd,$(EXTLIBS)),)
702 CFLAGS += -DHAVE_LIBBFD_SUPPORT
703endif
704
705ifndef NO_ZLIB
706 ifeq ($(feature-zlib), 1)
707 CFLAGS += -DHAVE_ZLIB_SUPPORT
708 EXTLIBS += -lz
709 $(call detected,CONFIG_ZLIB)
710 else
711 NO_ZLIB := 1
712 endif
713endif
714
715ifndef NO_LZMA
716 ifeq ($(feature-lzma), 1)
717 CFLAGS += -DHAVE_LZMA_SUPPORT
718 EXTLIBS += -llzma
719 $(call detected,CONFIG_LZMA)
720 else
721 msg := $(warning No liblzma found, disables xz kernel module decompression, please install xz-devel/liblzma-dev);
722 NO_LZMA := 1
723 endif
724endif
725
726ifndef NO_BACKTRACE
727 ifeq ($(feature-backtrace), 1)
728 CFLAGS += -DHAVE_BACKTRACE_SUPPORT
729 endif
730endif
731
732ifndef NO_LIBNUMA
733 ifeq ($(feature-libnuma), 0)
734 msg := $(warning No numa.h found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev);
735 NO_LIBNUMA := 1
736 else
737 ifeq ($(feature-numa_num_possible_cpus), 0)
738 msg := $(warning Old numa library found, disables 'perf bench numa mem' benchmark, please install numactl-devel/libnuma-devel/libnuma-dev >= 2.0.8);
739 NO_LIBNUMA := 1
740 else
741 CFLAGS += -DHAVE_LIBNUMA_SUPPORT
742 EXTLIBS += -lnuma
743 $(call detected,CONFIG_NUMA)
744 endif
745 endif
746endif
747
748ifdef HAVE_KVM_STAT_SUPPORT
749 CFLAGS += -DHAVE_KVM_STAT_SUPPORT
750endif
751
752ifeq (${IS_64_BIT}, 1)
753 ifndef NO_PERF_READ_VDSO32
754 $(call feature_check,compile-32)
755 ifeq ($(feature-compile-32), 1)
756 CFLAGS += -DHAVE_PERF_READ_VDSO32
757 else
758 NO_PERF_READ_VDSO32 := 1
759 endif
760 endif
761 ifneq ($(SRCARCH), x86)
762 NO_PERF_READ_VDSOX32 := 1
763 endif
764 ifndef NO_PERF_READ_VDSOX32
765 $(call feature_check,compile-x32)
766 ifeq ($(feature-compile-x32), 1)
767 CFLAGS += -DHAVE_PERF_READ_VDSOX32
768 else
769 NO_PERF_READ_VDSOX32 := 1
770 endif
771 endif
772else
773 NO_PERF_READ_VDSO32 := 1
774 NO_PERF_READ_VDSOX32 := 1
775endif
776
777ifdef LIBBABELTRACE
778 $(call feature_check,libbabeltrace)
779 ifeq ($(feature-libbabeltrace), 1)
780 CFLAGS += -DHAVE_LIBBABELTRACE_SUPPORT $(LIBBABELTRACE_CFLAGS)
781 LDFLAGS += $(LIBBABELTRACE_LDFLAGS)
782 EXTLIBS += -lbabeltrace-ctf
783 $(call detected,CONFIG_LIBBABELTRACE)
784 else
785 msg := $(warning No libbabeltrace found, disables 'perf data' CTF format support, please install libbabeltrace-dev[el]/libbabeltrace-ctf-dev);
786 endif
787endif
788
789ifndef NO_AUXTRACE
790 ifeq ($(SRCARCH),x86)
791 ifeq ($(feature-get_cpuid), 0)
792 msg := $(warning Your gcc lacks the __get_cpuid() builtin, disables support for auxtrace/Intel PT, please install a newer gcc);
793 NO_AUXTRACE := 1
794 endif
795 endif
796 ifndef NO_AUXTRACE
797 $(call detected,CONFIG_AUXTRACE)
798 CFLAGS += -DHAVE_AUXTRACE_SUPPORT
799 endif
800endif
801
802ifndef NO_JVMTI
803 ifneq (,$(wildcard /usr/sbin/update-java-alternatives))
804 JDIR=$(shell /usr/sbin/update-java-alternatives -l | head -1 | awk '{print $$3}')
805 else
806 ifneq (,$(wildcard /usr/sbin/alternatives))
807 JDIR=$(shell /usr/sbin/alternatives --display java | tail -1 | cut -d' ' -f 5 | sed -e 's%/jre/bin/java.%%g' -e 's%/bin/java.%%g')
808 endif
809 endif
810 ifndef JDIR
811 $(warning No alternatives command found, you need to set JDIR= to point to the root of your Java directory)
812 NO_JVMTI := 1
813 endif
814endif
815
816ifndef NO_JVMTI
817 FEATURE_CHECK_CFLAGS-jvmti := -I$(JDIR)/include -I$(JDIR)/include/linux
818 $(call feature_check,jvmti)
819 ifeq ($(feature-jvmti), 1)
820 $(call detected_var,JDIR)
821 else
822 $(warning No openjdk development package found, please install JDK package)
823 NO_JVMTI := 1
824 endif
825endif
826
827USE_CXX = 0
828USE_CLANGLLVM = 0
829ifdef LIBCLANGLLVM
830 $(call feature_check,cxx)
831 ifneq ($(feature-cxx), 1)
832 msg := $(warning No g++ found, disable clang and llvm support. Please install g++)
833 else
834 $(call feature_check,llvm)
835 $(call feature_check,llvm-version)
836 ifneq ($(feature-llvm), 1)
837 msg := $(warning No suitable libLLVM found, disabling builtin clang and LLVM support. Please install llvm-dev(el) (>= 3.9.0))
838 else
839 $(call feature_check,clang)
840 ifneq ($(feature-clang), 1)
841 msg := $(warning No suitable libclang found, disabling builtin clang and LLVM support. Please install libclang-dev(el) (>= 3.9.0))
842 else
843 CFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT
844 CXXFLAGS += -DHAVE_LIBCLANGLLVM_SUPPORT -I$(shell $(LLVM_CONFIG) --includedir)
845 $(call detected,CONFIG_CXX)
846 $(call detected,CONFIG_CLANGLLVM)
847 USE_CXX = 1
848 USE_LLVM = 1
849 USE_CLANG = 1
850 ifneq ($(feature-llvm-version),1)
851 msg := $(warning This version of LLVM is not tested. May cause build errors)
852 endif
853 endif
854 endif
855 endif
856endif
857
858# Among the variables below, these:
859# perfexecdir
860# template_dir
861# mandir
862# infodir
863# htmldir
864# ETC_PERFCONFIG (but not sysconfdir)
865# can be specified as a relative path some/where/else;
866# this is interpreted as relative to $(prefix) and "perf" at
867# runtime figures out where they are based on the path to the executable.
868# This can help installing the suite in a relocatable way.
869
870# Make the path relative to DESTDIR, not to prefix
871ifndef DESTDIR
872prefix ?= $(HOME)
873endif
874bindir_relative = bin
875bindir = $(abspath $(prefix)/$(bindir_relative))
876mandir = share/man
877infodir = share/info
878perfexecdir = libexec/perf-core
879sharedir = $(prefix)/share
880template_dir = share/perf-core/templates
881STRACE_GROUPS_DIR = share/perf-core/strace/groups
882htmldir = share/doc/perf-doc
883tipdir = share/doc/perf-tip
884srcdir = $(srctree)/tools/perf
885ifeq ($(prefix),/usr)
886sysconfdir = /etc
887ETC_PERFCONFIG = $(sysconfdir)/perfconfig
888else
889sysconfdir = $(prefix)/etc
890ETC_PERFCONFIG = etc/perfconfig
891endif
892ifndef lib
893ifeq ($(SRCARCH)$(IS_64_BIT), x861)
894lib = lib64
895else
896lib = lib
897endif
898endif # lib
899libdir = $(prefix)/$(lib)
900
901# Shell quote (do not use $(call) to accommodate ancient setups);
902ETC_PERFCONFIG_SQ = $(subst ','\'',$(ETC_PERFCONFIG))
903STRACE_GROUPS_DIR_SQ = $(subst ','\'',$(STRACE_GROUPS_DIR))
904DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
905bindir_SQ = $(subst ','\'',$(bindir))
906mandir_SQ = $(subst ','\'',$(mandir))
907infodir_SQ = $(subst ','\'',$(infodir))
908perfexecdir_SQ = $(subst ','\'',$(perfexecdir))
909template_dir_SQ = $(subst ','\'',$(template_dir))
910htmldir_SQ = $(subst ','\'',$(htmldir))
911tipdir_SQ = $(subst ','\'',$(tipdir))
912prefix_SQ = $(subst ','\'',$(prefix))
913sysconfdir_SQ = $(subst ','\'',$(sysconfdir))
914libdir_SQ = $(subst ','\'',$(libdir))
915srcdir_SQ = $(subst ','\'',$(srcdir))
916
917ifneq ($(filter /%,$(firstword $(perfexecdir))),)
918perfexec_instdir = $(perfexecdir)
919STRACE_GROUPS_INSTDIR = $(STRACE_GROUPS_DIR)
920tip_instdir = $(tipdir)
921else
922perfexec_instdir = $(prefix)/$(perfexecdir)
923STRACE_GROUPS_INSTDIR = $(prefix)/$(STRACE_GROUPS_DIR)
924tip_instdir = $(prefix)/$(tipdir)
925endif
926perfexec_instdir_SQ = $(subst ','\'',$(perfexec_instdir))
927STRACE_GROUPS_INSTDIR_SQ = $(subst ','\'',$(STRACE_GROUPS_INSTDIR))
928tip_instdir_SQ = $(subst ','\'',$(tip_instdir))
929
930# If we install to $(HOME) we keep the traceevent default:
931# $(HOME)/.traceevent/plugins
932# Otherwise we install plugins into the global $(libdir).
933ifdef DESTDIR
934plugindir=$(libdir)/traceevent/plugins
935plugindir_SQ= $(subst ','\'',$(plugindir))
936endif
937
938print_var = $(eval $(print_var_code)) $(info $(MSG))
939define print_var_code
940 MSG = $(shell printf '...%30s: %s' $(1) $($(1)))
941endef
942
943ifeq ($(VF),1)
944 $(call print_var,prefix)
945 $(call print_var,bindir)
946 $(call print_var,libdir)
947 $(call print_var,sysconfdir)
948 $(call print_var,LIBUNWIND_DIR)
949 $(call print_var,LIBDW_DIR)
950 $(call print_var,JDIR)
951
952 ifeq ($(dwarf-post-unwind),1)
953 $(call feature_print_text,"DWARF post unwind library", $(dwarf-post-unwind-text))
954 endif
955 $(info )
956endif
957
958$(call detected_var,bindir_SQ)
959$(call detected_var,PYTHON_WORD)
960ifneq ($(OUTPUT),)
961$(call detected_var,OUTPUT)
962endif
963$(call detected_var,htmldir_SQ)
964$(call detected_var,infodir_SQ)
965$(call detected_var,mandir_SQ)
966$(call detected_var,ETC_PERFCONFIG_SQ)
967$(call detected_var,STRACE_GROUPS_DIR_SQ)
968$(call detected_var,prefix_SQ)
969$(call detected_var,perfexecdir_SQ)
970$(call detected_var,tipdir_SQ)
971$(call detected_var,srcdir_SQ)
972$(call detected_var,LIBDIR)
973$(call detected_var,GTK_CFLAGS)
974$(call detected_var,PERL_EMBED_CCOPTS)
975$(call detected_var,PYTHON_EMBED_CCOPTS)