Blame view

tools/build/Makefile.feature 4.5 KB
e6c76d620   Jiri Olsa   perf build: Move ...
1
  feature_dir := $(srctree)/tools/build/feature
970e87b33   Jiri Olsa   perf build: Make ...
2

0afc5cad3   Jiri Olsa   perf build: Separ...
3
  ifneq ($(OUTPUT),)
e6c76d620   Jiri Olsa   perf build: Move ...
4
    OUTPUT_FEATURES = $(OUTPUT)feature/
0afc5cad3   Jiri Olsa   perf build: Separ...
5
6
7
8
9
    $(shell mkdir -p $(OUTPUT_FEATURES))
  endif
  
  feature_check = $(eval $(feature_check_code))
  define feature_check_code
970e87b33   Jiri Olsa   perf build: Make ...
10
    feature-$(1) := $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS) $(FEATURE_CHECK_CFLAGS-$(1))" LDFLAGS="$(LDFLAGS) $(FEATURE_CHECK_LDFLAGS-$(1))" -C $(feature_dir) test-$1.bin >/dev/null 2>/dev/null && echo 1 || echo 0)
0afc5cad3   Jiri Olsa   perf build: Separ...
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  endef
  
  feature_set = $(eval $(feature_set_code))
  define feature_set_code
    feature-$(1) := 1
  endef
  
  #
  # Build the feature check binaries in parallel, ignore errors, ignore return value and suppress output:
  #
  
  #
  # Note that this is not a complete list of all feature tests, just
  # those that are typically built on a fully configured system.
  #
  # [ Feature tests not mentioned here have to be built explicitly in
  #   the rule that uses them - an example for that is the 'bionic'
  #   feature check. ]
  #
  FEATURE_TESTS =			\
  	backtrace			\
  	dwarf				\
  	fortify-source			\
  	sync-compare-and-swap		\
  	glibc				\
  	gtk2				\
  	gtk2-infobar			\
  	libaudit			\
  	libbfd				\
  	libelf				\
  	libelf-getphdrnum		\
  	libelf-mmap			\
  	libnuma				\
  	libperl				\
  	libpython			\
  	libpython-version		\
  	libslang			\
  	libunwind			\
  	pthread-attr-setaffinity-np	\
  	stackprotector-all		\
  	timerfd				\
  	libdw-dwarf-unwind		\
6c6f0f616   Jiri Olsa   tools build: Add ...
53
54
  	zlib				\
  	lzma
0afc5cad3   Jiri Olsa   perf build: Separ...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  
  FEATURE_DISPLAY =			\
  	dwarf				\
  	glibc				\
  	gtk2				\
  	libaudit			\
  	libbfd				\
  	libelf				\
  	libnuma				\
  	libperl				\
  	libpython			\
  	libslang			\
  	libunwind			\
  	libdw-dwarf-unwind		\
6c6f0f616   Jiri Olsa   tools build: Add ...
69
70
  	zlib				\
  	lzma
0afc5cad3   Jiri Olsa   perf build: Separ...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  
  # Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features.
  # If in the future we need per-feature checks/flags for features not
  # mentioned in this list we need to refactor this ;-).
  set_test_all_flags = $(eval $(set_test_all_flags_code))
  define set_test_all_flags_code
    FEATURE_CHECK_CFLAGS-all  += $(FEATURE_CHECK_CFLAGS-$(1))
    FEATURE_CHECK_LDFLAGS-all += $(FEATURE_CHECK_LDFLAGS-$(1))
  endef
  
  $(foreach feat,$(FEATURE_TESTS),$(call set_test_all_flags,$(feat)))
  
  #
  # Special fast-path for the 'all features are available' case:
  #
  $(call feature_check,all,$(MSG))
  
  #
  # Just in case the build freshly failed, make sure we print the
  # feature matrix:
  #
  ifeq ($(feature-all), 1)
    #
    # test-all.c passed - just set all the core feature flags to 1:
    #
    $(foreach feat,$(FEATURE_TESTS),$(call feature_set,$(feat)))
  else
970e87b33   Jiri Olsa   perf build: Make ...
98
    $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS)" LDFLAGS=$(LDFLAGS) -i -j -C $(feature_dir) $(addsuffix .bin,$(FEATURE_TESTS)) >/dev/null 2>&1)
0afc5cad3   Jiri Olsa   perf build: Separ...
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
    $(foreach feat,$(FEATURE_TESTS),$(call feature_check,$(feat)))
  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_text = $(eval $(feature_print_text_code)) $(info $(MSG))
  define feature_print_text_code
      MSG = $(shell printf '...%30s: %s' $(1) $(2))
  endef
  
  FEATURE_DUMP := $(foreach feat,$(FEATURE_DISPLAY),feature-$(feat)($(feature-$(feat))))
  FEATURE_DUMP_FILE := $(shell touch $(OUTPUT)FEATURE-DUMP; cat $(OUTPUT)FEATURE-DUMP)
  
  ifeq ($(dwarf-post-unwind),1)
    FEATURE_DUMP += dwarf-post-unwind($(dwarf-post-unwind-text))
  endif
  
  # The $(feature_display) controls the default detection message
  # output. It's set if:
  # - detected features differes from stored features from
  #   last build (in FEATURE-DUMP file)
  # - one of the $(FEATURE_DISPLAY) is not detected
  # - VF is enabled
  
  ifneq ("$(FEATURE_DUMP)","$(FEATURE_DUMP_FILE)")
    $(shell echo "$(FEATURE_DUMP)" > $(OUTPUT)FEATURE-DUMP)
    feature_display := 1
  endif
  
  feature_display_check = $(eval $(feature_check_code))
  define feature_display_check_code
    ifneq ($(feature-$(1)), 1)
      feature_display := 1
    endif
  endef
  
  $(foreach feat,$(FEATURE_DISPLAY),$(call feature_display_check,$(feat)))
  
  ifeq ($(VF),1)
    feature_display := 1
    feature_verbose := 1
  endif
  
  ifeq ($(feature_display),1)
    $(info )
    $(info Auto-detecting system features:)
    $(foreach feat,$(FEATURE_DISPLAY),$(call feature_print_status,$(feat),))
  
    ifeq ($(dwarf-post-unwind),1)
      $(call feature_print_text,"DWARF post unwind library", $(dwarf-post-unwind-text))
    endif
  
    ifneq ($(feature_verbose),1)
      $(info )
    endif
  endif
  
  ifeq ($(feature_verbose),1)
    TMP := $(filter-out $(FEATURE_DISPLAY),$(FEATURE_TESTS))
    $(foreach feat,$(TMP),$(call feature_print_status,$(feat),))
    $(info )
  endif