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