|
@@ -59,6 +59,18 @@ ifeq ($(NO_PERF_REGS),0)
|
|
|
CFLAGS += -DHAVE_PERF_REGS_SUPPORT
|
|
|
endif
|
|
|
|
|
|
+ifndef NO_LIBELF
|
|
|
+ # for linking with debug library, run like:
|
|
|
+ # make DEBUG=1 LIBDW_DIR=/opt/libdw/
|
|
|
+ ifdef LIBDW_DIR
|
|
|
+ LIBDW_CFLAGS := -I$(LIBDW_DIR)/include
|
|
|
+ LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib
|
|
|
+
|
|
|
+ FEATURE_CHECK_CFLAGS-libdw-dwarf-unwind := $(LIBDW_CFLAGS)
|
|
|
+ FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind := $(LIBDW_LDFLAGS) -ldw
|
|
|
+ endif
|
|
|
+endif
|
|
|
+
|
|
|
# include ARCH specific config
|
|
|
-include $(src-perf)/arch/$(ARCH)/Makefile
|
|
|
|
|
@@ -147,7 +159,35 @@ CORE_FEATURE_TESTS = \
|
|
|
libunwind \
|
|
|
on-exit \
|
|
|
stackprotector-all \
|
|
|
- timerfd
|
|
|
+ timerfd \
|
|
|
+ libdw-dwarf-unwind
|
|
|
+
|
|
|
+LIB_FEATURE_TESTS = \
|
|
|
+ dwarf \
|
|
|
+ glibc \
|
|
|
+ gtk2 \
|
|
|
+ libaudit \
|
|
|
+ libbfd \
|
|
|
+ libelf \
|
|
|
+ libnuma \
|
|
|
+ libperl \
|
|
|
+ libpython \
|
|
|
+ libslang \
|
|
|
+ libunwind \
|
|
|
+ libdw-dwarf-unwind
|
|
|
+
|
|
|
+VF_FEATURE_TESTS = \
|
|
|
+ backtrace \
|
|
|
+ fortify-source \
|
|
|
+ gtk2-infobar \
|
|
|
+ libelf-getphdrnum \
|
|
|
+ libelf-mmap \
|
|
|
+ libpython-version \
|
|
|
+ on-exit \
|
|
|
+ stackprotector-all \
|
|
|
+ timerfd \
|
|
|
+ libunwind-debug-frame \
|
|
|
+ bionic
|
|
|
|
|
|
# Set FEATURE_CHECK_(C|LD)FLAGS-all for all CORE_FEATURE_TESTS features.
|
|
|
# If in the future we need per-feature checks/flags for features not
|
|
@@ -160,17 +200,6 @@ endef
|
|
|
|
|
|
$(foreach feat,$(CORE_FEATURE_TESTS),$(call set_test_all_flags,$(feat)))
|
|
|
|
|
|
-#
|
|
|
-# So here we detect whether test-all was rebuilt, to be able
|
|
|
-# to skip the print-out of the long features list if the file
|
|
|
-# existed before and after it was built:
|
|
|
-#
|
|
|
-ifeq ($(wildcard $(OUTPUT)config/feature-checks/test-all.bin),)
|
|
|
- test-all-failed := 1
|
|
|
-else
|
|
|
- test-all-failed := 0
|
|
|
-endif
|
|
|
-
|
|
|
#
|
|
|
# Special fast-path for the 'all features are available' case:
|
|
|
#
|
|
@@ -180,15 +209,6 @@ $(call feature_check,all,$(MSG))
|
|
|
# Just in case the build freshly failed, make sure we print the
|
|
|
# feature matrix:
|
|
|
#
|
|
|
-ifeq ($(feature-all), 0)
|
|
|
- test-all-failed := 1
|
|
|
-endif
|
|
|
-
|
|
|
-ifeq ($(test-all-failed),1)
|
|
|
- $(info )
|
|
|
- $(info Auto-detecting system features:)
|
|
|
-endif
|
|
|
-
|
|
|
ifeq ($(feature-all), 1)
|
|
|
#
|
|
|
# test-all.c passed - just set all the core feature flags to 1:
|
|
@@ -199,27 +219,6 @@ else
|
|
|
$(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_check,$(feat)))
|
|
|
endif
|
|
|
|
|
|
-#
|
|
|
-# Print the result of the feature test:
|
|
|
-#
|
|
|
-feature_print = $(eval $(feature_print_code)) $(info $(MSG))
|
|
|
-
|
|
|
-define feature_print_code
|
|
|
- ifeq ($(feature-$(1)), 1)
|
|
|
- MSG = $(shell printf '...%30s: [ \033[32mon\033[m ]' $(1))
|
|
|
- else
|
|
|
- MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(1))
|
|
|
- endif
|
|
|
-endef
|
|
|
-
|
|
|
-#
|
|
|
-# Only print out our features if we rebuilt the testcases or if a test failed:
|
|
|
-#
|
|
|
-ifeq ($(test-all-failed), 1)
|
|
|
- $(foreach feat,$(CORE_FEATURE_TESTS),$(call feature_print,$(feat)))
|
|
|
- $(info )
|
|
|
-endif
|
|
|
-
|
|
|
ifeq ($(feature-stackprotector-all), 1)
|
|
|
CFLAGS += -fstack-protector-all
|
|
|
endif
|
|
@@ -264,6 +263,7 @@ ifdef NO_LIBELF
|
|
|
NO_DWARF := 1
|
|
|
NO_DEMANGLE := 1
|
|
|
NO_LIBUNWIND := 1
|
|
|
+ NO_LIBDW_DWARF_UNWIND := 1
|
|
|
else
|
|
|
ifeq ($(feature-libelf), 0)
|
|
|
ifeq ($(feature-glibc), 1)
|
|
@@ -282,13 +282,12 @@ else
|
|
|
msg := $(error No gnu/libc-version.h found, please install glibc-dev[el]/glibc-static);
|
|
|
endif
|
|
|
else
|
|
|
- # for linking with debug library, run like:
|
|
|
- # make DEBUG=1 LIBDW_DIR=/opt/libdw/
|
|
|
- ifdef LIBDW_DIR
|
|
|
- LIBDW_CFLAGS := -I$(LIBDW_DIR)/include
|
|
|
- LIBDW_LDFLAGS := -L$(LIBDW_DIR)/lib
|
|
|
+ ifndef NO_LIBDW_DWARF_UNWIND
|
|
|
+ ifneq ($(feature-libdw-dwarf-unwind),1)
|
|
|
+ NO_LIBDW_DWARF_UNWIND := 1
|
|
|
+ msg := $(warning No libdw DWARF unwind found, Please install elfutils-devel/libdw-dev >= 0.158 and/or set LIBDW_DIR);
|
|
|
+ endif
|
|
|
endif
|
|
|
-
|
|
|
ifneq ($(feature-dwarf), 1)
|
|
|
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);
|
|
|
NO_DWARF := 1
|
|
@@ -324,25 +323,51 @@ endif # NO_LIBELF
|
|
|
|
|
|
ifndef NO_LIBUNWIND
|
|
|
ifneq ($(feature-libunwind), 1)
|
|
|
- msg := $(warning No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 1.1);
|
|
|
+ msg := $(warning No libunwind found. Please install libunwind-dev[el] >= 1.1 and/or set LIBUNWIND_DIR);
|
|
|
NO_LIBUNWIND := 1
|
|
|
+ endif
|
|
|
+endif
|
|
|
+
|
|
|
+dwarf-post-unwind := 1
|
|
|
+dwarf-post-unwind-text := BUG
|
|
|
+
|
|
|
+# setup DWARF post unwinder
|
|
|
+ifdef NO_LIBUNWIND
|
|
|
+ ifdef NO_LIBDW_DWARF_UNWIND
|
|
|
+ msg := $(warning Disabling post unwind, no support found.);
|
|
|
+ dwarf-post-unwind := 0
|
|
|
else
|
|
|
- ifeq ($(ARCH),arm)
|
|
|
- $(call feature_check,libunwind-debug-frame)
|
|
|
- ifneq ($(feature-libunwind-debug-frame), 1)
|
|
|
- msg := $(warning No debug_frame support found in libunwind);
|
|
|
- CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
|
|
|
- endif
|
|
|
- else
|
|
|
- # non-ARM has no dwarf_find_debug_frame() function:
|
|
|
+ dwarf-post-unwind-text := libdw
|
|
|
+ endif
|
|
|
+else
|
|
|
+ dwarf-post-unwind-text := libunwind
|
|
|
+ # Enable libunwind support by default.
|
|
|
+ ifndef NO_LIBDW_DWARF_UNWIND
|
|
|
+ NO_LIBDW_DWARF_UNWIND := 1
|
|
|
+ endif
|
|
|
+endif
|
|
|
+
|
|
|
+ifeq ($(dwarf-post-unwind),1)
|
|
|
+ CFLAGS += -DHAVE_DWARF_UNWIND_SUPPORT
|
|
|
+else
|
|
|
+ NO_DWARF_UNWIND := 1
|
|
|
+endif
|
|
|
+
|
|
|
+ifndef NO_LIBUNWIND
|
|
|
+ ifeq ($(ARCH),arm)
|
|
|
+ $(call feature_check,libunwind-debug-frame)
|
|
|
+ ifneq ($(feature-libunwind-debug-frame), 1)
|
|
|
+ msg := $(warning No debug_frame support found in libunwind);
|
|
|
CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
|
|
|
endif
|
|
|
-
|
|
|
- CFLAGS += -DHAVE_DWARF_UNWIND_SUPPORT -DHAVE_LIBUNWIND_SUPPORT
|
|
|
- EXTLIBS += $(LIBUNWIND_LIBS)
|
|
|
- CFLAGS += $(LIBUNWIND_CFLAGS)
|
|
|
- LDFLAGS += $(LIBUNWIND_LDFLAGS)
|
|
|
- endif # ifneq ($(feature-libunwind), 1)
|
|
|
+ else
|
|
|
+ # non-ARM has no dwarf_find_debug_frame() function:
|
|
|
+ CFLAGS += -DNO_LIBUNWIND_DEBUG_FRAME
|
|
|
+ endif
|
|
|
+ CFLAGS += -DHAVE_LIBUNWIND_SUPPORT
|
|
|
+ EXTLIBS += $(LIBUNWIND_LIBS)
|
|
|
+ CFLAGS += $(LIBUNWIND_CFLAGS)
|
|
|
+ LDFLAGS += $(LIBUNWIND_LDFLAGS)
|
|
|
endif
|
|
|
|
|
|
ifndef NO_LIBAUDIT
|
|
@@ -602,3 +627,84 @@ ifdef DESTDIR
|
|
|
plugindir=$(libdir)/traceevent/plugins
|
|
|
plugindir_SQ= $(subst ','\'',$(plugindir))
|
|
|
endif
|
|
|
+
|
|
|
+#
|
|
|
+# Print the result of the feature test:
|
|
|
+#
|
|
|
+feature_print_status = $(eval $(feature_print_status_code)) $(info $(MSG))
|
|
|
+
|
|
|
+define feature_print_status_code
|
|
|
+ ifeq ($(feature-$(1)), 1)
|
|
|
+ MSG = $(shell printf '...%30s: [ \033[32mon\033[m ]' $(1))
|
|
|
+ else
|
|
|
+ MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(1))
|
|
|
+ endif
|
|
|
+endef
|
|
|
+
|
|
|
+feature_print_var = $(eval $(feature_print_var_code)) $(info $(MSG))
|
|
|
+define feature_print_var_code
|
|
|
+ MSG = $(shell printf '...%30s: %s' $(1) $($(1)))
|
|
|
+endef
|
|
|
+
|
|
|
+feature_print_text = $(eval $(feature_print_text_code)) $(info $(MSG))
|
|
|
+define feature_print_text_code
|
|
|
+ MSG = $(shell printf '...%30s: %s' $(1) $(2))
|
|
|
+endef
|
|
|
+
|
|
|
+PERF_FEATURES := $(foreach feat,$(LIB_FEATURE_TESTS),feature-$(feat)($(feature-$(feat))))
|
|
|
+PERF_FEATURES_FILE := $(shell touch $(OUTPUT)PERF-FEATURES; cat $(OUTPUT)PERF-FEATURES)
|
|
|
+
|
|
|
+ifeq ($(dwarf-post-unwind),1)
|
|
|
+ PERF_FEATURES += dwarf-post-unwind($(dwarf-post-unwind-text))
|
|
|
+endif
|
|
|
+
|
|
|
+# The $(display_lib) controls the default detection message
|
|
|
+# output. It's set if:
|
|
|
+# - detected features differes from stored features from
|
|
|
+# last build (in PERF-FEATURES file)
|
|
|
+# - one of the $(LIB_FEATURE_TESTS) is not detected
|
|
|
+# - VF is enabled
|
|
|
+
|
|
|
+ifneq ("$(PERF_FEATURES)","$(PERF_FEATURES_FILE)")
|
|
|
+ $(shell echo "$(PERF_FEATURES)" > $(OUTPUT)PERF-FEATURES)
|
|
|
+ display_lib := 1
|
|
|
+endif
|
|
|
+
|
|
|
+feature_check = $(eval $(feature_check_code))
|
|
|
+define feature_check_code
|
|
|
+ ifneq ($(feature-$(1)), 1)
|
|
|
+ display_lib := 1
|
|
|
+ endif
|
|
|
+endef
|
|
|
+
|
|
|
+$(foreach feat,$(LIB_FEATURE_TESTS),$(call feature_check,$(feat)))
|
|
|
+
|
|
|
+ifeq ($(VF),1)
|
|
|
+ display_lib := 1
|
|
|
+ display_vf := 1
|
|
|
+endif
|
|
|
+
|
|
|
+ifeq ($(display_lib),1)
|
|
|
+ $(info )
|
|
|
+ $(info Auto-detecting system features:)
|
|
|
+ $(foreach feat,$(LIB_FEATURE_TESTS),$(call feature_print_status,$(feat),))
|
|
|
+
|
|
|
+ ifeq ($(dwarf-post-unwind),1)
|
|
|
+ $(call feature_print_text,"DWARF post unwind library", $(dwarf-post-unwind-text))
|
|
|
+ endif
|
|
|
+endif
|
|
|
+
|
|
|
+ifeq ($(display_vf),1)
|
|
|
+ $(foreach feat,$(VF_FEATURE_TESTS),$(call feature_print_status,$(feat),))
|
|
|
+ $(info )
|
|
|
+ $(call feature_print_var,prefix)
|
|
|
+ $(call feature_print_var,bindir)
|
|
|
+ $(call feature_print_var,libdir)
|
|
|
+ $(call feature_print_var,sysconfdir)
|
|
|
+ $(call feature_print_var,LIBUNWIND_DIR)
|
|
|
+ $(call feature_print_var,LIBDW_DIR)
|
|
|
+endif
|
|
|
+
|
|
|
+ifeq ($(display_lib),1)
|
|
|
+ $(info )
|
|
|
+endif
|