diff options
author | Jiri Olsa <jolsa@kernel.org> | 2015-03-01 15:19:44 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2015-03-21 13:53:35 -0400 |
commit | e6c76d620379fd65fc0310aee1785ff7b1b10236 (patch) | |
tree | 223fe9d9a8e528c69b0545b371555b6218de50d5 /tools/build | |
parent | 970e87b33820205b31306dfb734771842874767c (diff) |
perf build: Move feature checks code under tools/build
Moving feature checks code under tools/build directory.
Changing also $feature_dir to point to new feature directory location
and perf Makefiles to include Makefile.feature from new location.
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: David Ahern <david.ahern@oracle.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/n/tip-3lamtb30dhf4wo99y1n8kxg0@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/build')
33 files changed, 783 insertions, 0 deletions
diff --git a/tools/build/Makefile.feature b/tools/build/Makefile.feature new file mode 100644 index 000000000000..c6f44894d4a1 --- /dev/null +++ b/tools/build/Makefile.feature | |||
@@ -0,0 +1,169 @@ | |||
1 | feature_dir := $(srctree)/tools/build/feature | ||
2 | |||
3 | ifneq ($(OUTPUT),) | ||
4 | OUTPUT_FEATURES = $(OUTPUT)feature/ | ||
5 | $(shell mkdir -p $(OUTPUT_FEATURES)) | ||
6 | endif | ||
7 | |||
8 | feature_check = $(eval $(feature_check_code)) | ||
9 | define feature_check_code | ||
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) | ||
11 | endef | ||
12 | |||
13 | feature_set = $(eval $(feature_set_code)) | ||
14 | define feature_set_code | ||
15 | feature-$(1) := 1 | ||
16 | endef | ||
17 | |||
18 | # | ||
19 | # Build the feature check binaries in parallel, ignore errors, ignore return value and suppress output: | ||
20 | # | ||
21 | |||
22 | # | ||
23 | # Note that this is not a complete list of all feature tests, just | ||
24 | # those that are typically built on a fully configured system. | ||
25 | # | ||
26 | # [ Feature tests not mentioned here have to be built explicitly in | ||
27 | # the rule that uses them - an example for that is the 'bionic' | ||
28 | # feature check. ] | ||
29 | # | ||
30 | FEATURE_TESTS = \ | ||
31 | backtrace \ | ||
32 | dwarf \ | ||
33 | fortify-source \ | ||
34 | sync-compare-and-swap \ | ||
35 | glibc \ | ||
36 | gtk2 \ | ||
37 | gtk2-infobar \ | ||
38 | libaudit \ | ||
39 | libbfd \ | ||
40 | libelf \ | ||
41 | libelf-getphdrnum \ | ||
42 | libelf-mmap \ | ||
43 | libnuma \ | ||
44 | libperl \ | ||
45 | libpython \ | ||
46 | libpython-version \ | ||
47 | libslang \ | ||
48 | libunwind \ | ||
49 | pthread-attr-setaffinity-np \ | ||
50 | stackprotector-all \ | ||
51 | timerfd \ | ||
52 | libdw-dwarf-unwind \ | ||
53 | zlib | ||
54 | |||
55 | FEATURE_DISPLAY = \ | ||
56 | dwarf \ | ||
57 | glibc \ | ||
58 | gtk2 \ | ||
59 | libaudit \ | ||
60 | libbfd \ | ||
61 | libelf \ | ||
62 | libnuma \ | ||
63 | libperl \ | ||
64 | libpython \ | ||
65 | libslang \ | ||
66 | libunwind \ | ||
67 | libdw-dwarf-unwind \ | ||
68 | zlib | ||
69 | |||
70 | # Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features. | ||
71 | # If in the future we need per-feature checks/flags for features not | ||
72 | # mentioned in this list we need to refactor this ;-). | ||
73 | set_test_all_flags = $(eval $(set_test_all_flags_code)) | ||
74 | define set_test_all_flags_code | ||
75 | FEATURE_CHECK_CFLAGS-all += $(FEATURE_CHECK_CFLAGS-$(1)) | ||
76 | FEATURE_CHECK_LDFLAGS-all += $(FEATURE_CHECK_LDFLAGS-$(1)) | ||
77 | endef | ||
78 | |||
79 | $(foreach feat,$(FEATURE_TESTS),$(call set_test_all_flags,$(feat))) | ||
80 | |||
81 | # | ||
82 | # Special fast-path for the 'all features are available' case: | ||
83 | # | ||
84 | $(call feature_check,all,$(MSG)) | ||
85 | |||
86 | # | ||
87 | # Just in case the build freshly failed, make sure we print the | ||
88 | # feature matrix: | ||
89 | # | ||
90 | ifeq ($(feature-all), 1) | ||
91 | # | ||
92 | # test-all.c passed - just set all the core feature flags to 1: | ||
93 | # | ||
94 | $(foreach feat,$(FEATURE_TESTS),$(call feature_set,$(feat))) | ||
95 | else | ||
96 | $(shell $(MAKE) OUTPUT=$(OUTPUT_FEATURES) CFLAGS="$(EXTRA_CFLAGS)" LDFLAGS=$(LDFLAGS) -i -j -C $(feature_dir) $(addsuffix .bin,$(FEATURE_TESTS)) >/dev/null 2>&1) | ||
97 | $(foreach feat,$(FEATURE_TESTS),$(call feature_check,$(feat))) | ||
98 | endif | ||
99 | |||
100 | # | ||
101 | # Print the result of the feature test: | ||
102 | # | ||
103 | feature_print_status = $(eval $(feature_print_status_code)) $(info $(MSG)) | ||
104 | |||
105 | define feature_print_status_code | ||
106 | ifeq ($(feature-$(1)), 1) | ||
107 | MSG = $(shell printf '...%30s: [ \033[32mon\033[m ]' $(1)) | ||
108 | else | ||
109 | MSG = $(shell printf '...%30s: [ \033[31mOFF\033[m ]' $(1)) | ||
110 | endif | ||
111 | endef | ||
112 | |||
113 | feature_print_text = $(eval $(feature_print_text_code)) $(info $(MSG)) | ||
114 | define feature_print_text_code | ||
115 | MSG = $(shell printf '...%30s: %s' $(1) $(2)) | ||
116 | endef | ||
117 | |||
118 | FEATURE_DUMP := $(foreach feat,$(FEATURE_DISPLAY),feature-$(feat)($(feature-$(feat)))) | ||
119 | FEATURE_DUMP_FILE := $(shell touch $(OUTPUT)FEATURE-DUMP; cat $(OUTPUT)FEATURE-DUMP) | ||
120 | |||
121 | ifeq ($(dwarf-post-unwind),1) | ||
122 | FEATURE_DUMP += dwarf-post-unwind($(dwarf-post-unwind-text)) | ||
123 | endif | ||
124 | |||
125 | # The $(feature_display) controls the default detection message | ||
126 | # output. It's set if: | ||
127 | # - detected features differes from stored features from | ||
128 | # last build (in FEATURE-DUMP file) | ||
129 | # - one of the $(FEATURE_DISPLAY) is not detected | ||
130 | # - VF is enabled | ||
131 | |||
132 | ifneq ("$(FEATURE_DUMP)","$(FEATURE_DUMP_FILE)") | ||
133 | $(shell echo "$(FEATURE_DUMP)" > $(OUTPUT)FEATURE-DUMP) | ||
134 | feature_display := 1 | ||
135 | endif | ||
136 | |||
137 | feature_display_check = $(eval $(feature_check_code)) | ||
138 | define feature_display_check_code | ||
139 | ifneq ($(feature-$(1)), 1) | ||
140 | feature_display := 1 | ||
141 | endif | ||
142 | endef | ||
143 | |||
144 | $(foreach feat,$(FEATURE_DISPLAY),$(call feature_display_check,$(feat))) | ||
145 | |||
146 | ifeq ($(VF),1) | ||
147 | feature_display := 1 | ||
148 | feature_verbose := 1 | ||
149 | endif | ||
150 | |||
151 | ifeq ($(feature_display),1) | ||
152 | $(info ) | ||
153 | $(info Auto-detecting system features:) | ||
154 | $(foreach feat,$(FEATURE_DISPLAY),$(call feature_print_status,$(feat),)) | ||
155 | |||
156 | ifeq ($(dwarf-post-unwind),1) | ||
157 | $(call feature_print_text,"DWARF post unwind library", $(dwarf-post-unwind-text)) | ||
158 | endif | ||
159 | |||
160 | ifneq ($(feature_verbose),1) | ||
161 | $(info ) | ||
162 | endif | ||
163 | endif | ||
164 | |||
165 | ifeq ($(feature_verbose),1) | ||
166 | TMP := $(filter-out $(FEATURE_DISPLAY),$(FEATURE_TESTS)) | ||
167 | $(foreach feat,$(TMP),$(call feature_print_status,$(feat),)) | ||
168 | $(info ) | ||
169 | endif | ||
diff --git a/tools/build/feature/.gitignore b/tools/build/feature/.gitignore new file mode 100644 index 000000000000..09b335b98842 --- /dev/null +++ b/tools/build/feature/.gitignore | |||
@@ -0,0 +1,3 @@ | |||
1 | *.d | ||
2 | *.bin | ||
3 | *.output | ||
diff --git a/tools/build/feature/Makefile b/tools/build/feature/Makefile new file mode 100644 index 000000000000..0d694a94cda2 --- /dev/null +++ b/tools/build/feature/Makefile | |||
@@ -0,0 +1,160 @@ | |||
1 | |||
2 | FILES= \ | ||
3 | test-all.bin \ | ||
4 | test-backtrace.bin \ | ||
5 | test-bionic.bin \ | ||
6 | test-dwarf.bin \ | ||
7 | test-fortify-source.bin \ | ||
8 | test-sync-compare-and-swap.bin \ | ||
9 | test-glibc.bin \ | ||
10 | test-gtk2.bin \ | ||
11 | test-gtk2-infobar.bin \ | ||
12 | test-hello.bin \ | ||
13 | test-libaudit.bin \ | ||
14 | test-libbfd.bin \ | ||
15 | test-liberty.bin \ | ||
16 | test-liberty-z.bin \ | ||
17 | test-cplus-demangle.bin \ | ||
18 | test-libelf.bin \ | ||
19 | test-libelf-getphdrnum.bin \ | ||
20 | test-libelf-mmap.bin \ | ||
21 | test-libnuma.bin \ | ||
22 | test-libperl.bin \ | ||
23 | test-libpython.bin \ | ||
24 | test-libpython-version.bin \ | ||
25 | test-libslang.bin \ | ||
26 | test-libunwind.bin \ | ||
27 | test-libunwind-debug-frame.bin \ | ||
28 | test-pthread-attr-setaffinity-np.bin \ | ||
29 | test-stackprotector-all.bin \ | ||
30 | test-timerfd.bin \ | ||
31 | test-libdw-dwarf-unwind.bin \ | ||
32 | test-libbabeltrace.bin \ | ||
33 | test-compile-32.bin \ | ||
34 | test-compile-x32.bin \ | ||
35 | test-zlib.bin | ||
36 | |||
37 | CC := $(CROSS_COMPILE)gcc -MD | ||
38 | PKG_CONFIG := $(CROSS_COMPILE)pkg-config | ||
39 | |||
40 | all: $(FILES) | ||
41 | |||
42 | __BUILD = $(CC) $(CFLAGS) -Wall -Werror -o $(OUTPUT)$@ $(patsubst %.bin,%.c,$@) $(LDFLAGS) | ||
43 | BUILD = $(__BUILD) > $(OUTPUT)$(@:.bin=.make.output) 2>&1 | ||
44 | |||
45 | ############################### | ||
46 | |||
47 | test-all.bin: | ||
48 | $(BUILD) -fstack-protector-all -O2 -D_FORTIFY_SOURCE=2 -ldw -lelf -lnuma -lelf -laudit -I/usr/include/slang -lslang $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) $(FLAGS_PERL_EMBED) $(FLAGS_PYTHON_EMBED) -DPACKAGE='"perf"' -lbfd -ldl -lz | ||
49 | |||
50 | test-hello.bin: | ||
51 | $(BUILD) | ||
52 | |||
53 | test-pthread-attr-setaffinity-np.bin: | ||
54 | $(BUILD) -D_GNU_SOURCE -lpthread | ||
55 | |||
56 | test-stackprotector-all.bin: | ||
57 | $(BUILD) -fstack-protector-all | ||
58 | |||
59 | test-fortify-source.bin: | ||
60 | $(BUILD) -O2 -D_FORTIFY_SOURCE=2 | ||
61 | |||
62 | test-bionic.bin: | ||
63 | $(BUILD) | ||
64 | |||
65 | test-libelf.bin: | ||
66 | $(BUILD) -lelf | ||
67 | |||
68 | test-glibc.bin: | ||
69 | $(BUILD) | ||
70 | |||
71 | test-dwarf.bin: | ||
72 | $(BUILD) -ldw | ||
73 | |||
74 | test-libelf-mmap.bin: | ||
75 | $(BUILD) -lelf | ||
76 | |||
77 | test-libelf-getphdrnum.bin: | ||
78 | $(BUILD) -lelf | ||
79 | |||
80 | test-libnuma.bin: | ||
81 | $(BUILD) -lnuma | ||
82 | |||
83 | test-libunwind.bin: | ||
84 | $(BUILD) -lelf | ||
85 | |||
86 | test-libunwind-debug-frame.bin: | ||
87 | $(BUILD) -lelf | ||
88 | |||
89 | test-libaudit.bin: | ||
90 | $(BUILD) -laudit | ||
91 | |||
92 | test-libslang.bin: | ||
93 | $(BUILD) -I/usr/include/slang -lslang | ||
94 | |||
95 | test-gtk2.bin: | ||
96 | $(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) | ||
97 | |||
98 | test-gtk2-infobar.bin: | ||
99 | $(BUILD) $(shell $(PKG_CONFIG) --libs --cflags gtk+-2.0 2>/dev/null) | ||
100 | |||
101 | grep-libs = $(filter -l%,$(1)) | ||
102 | strip-libs = $(filter-out -l%,$(1)) | ||
103 | |||
104 | PERL_EMBED_LDOPTS = $(shell perl -MExtUtils::Embed -e ldopts 2>/dev/null) | ||
105 | PERL_EMBED_LDFLAGS = $(call strip-libs,$(PERL_EMBED_LDOPTS)) | ||
106 | PERL_EMBED_LIBADD = $(call grep-libs,$(PERL_EMBED_LDOPTS)) | ||
107 | PERL_EMBED_CCOPTS = `perl -MExtUtils::Embed -e ccopts 2>/dev/null` | ||
108 | FLAGS_PERL_EMBED=$(PERL_EMBED_CCOPTS) $(PERL_EMBED_LDOPTS) | ||
109 | |||
110 | test-libperl.bin: | ||
111 | $(BUILD) $(FLAGS_PERL_EMBED) | ||
112 | |||
113 | test-libpython.bin: | ||
114 | $(BUILD) | ||
115 | |||
116 | test-libpython-version.bin: | ||
117 | $(BUILD) | ||
118 | |||
119 | test-libbfd.bin: | ||
120 | $(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl | ||
121 | |||
122 | test-liberty.bin: | ||
123 | $(CC) -Wall -Werror -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty | ||
124 | |||
125 | test-liberty-z.bin: | ||
126 | $(CC) -Wall -Werror -o $(OUTPUT)$@ test-libbfd.c -DPACKAGE='"perf"' -lbfd -ldl -liberty -lz | ||
127 | |||
128 | test-cplus-demangle.bin: | ||
129 | $(BUILD) -liberty | ||
130 | |||
131 | test-backtrace.bin: | ||
132 | $(BUILD) | ||
133 | |||
134 | test-timerfd.bin: | ||
135 | $(BUILD) | ||
136 | |||
137 | test-libdw-dwarf-unwind.bin: | ||
138 | $(BUILD) # -ldw provided by $(FEATURE_CHECK_LDFLAGS-libdw-dwarf-unwind) | ||
139 | |||
140 | test-libbabeltrace.bin: | ||
141 | $(BUILD) # -lbabeltrace provided by $(FEATURE_CHECK_LDFLAGS-libbabeltrace) | ||
142 | |||
143 | test-sync-compare-and-swap.bin: | ||
144 | $(BUILD) | ||
145 | |||
146 | test-compile-32.bin: | ||
147 | $(CC) -m32 -o $(OUTPUT)$@ test-compile.c | ||
148 | |||
149 | test-compile-x32.bin: | ||
150 | $(CC) -mx32 -o $(OUTPUT)$@ test-compile.c | ||
151 | |||
152 | test-zlib.bin: | ||
153 | $(BUILD) -lz | ||
154 | |||
155 | -include *.d | ||
156 | |||
157 | ############################### | ||
158 | |||
159 | clean: | ||
160 | rm -f $(FILES) *.d $(FILES:.bin=.make.output) | ||
diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c new file mode 100644 index 000000000000..a61c20456705 --- /dev/null +++ b/tools/build/feature/test-all.c | |||
@@ -0,0 +1,143 @@ | |||
1 | /* | ||
2 | * test-all.c: Try to build all the main testcases at once. | ||
3 | * | ||
4 | * A well-configured system will have all the prereqs installed, so we can speed | ||
5 | * up auto-detection on such systems. | ||
6 | */ | ||
7 | |||
8 | /* | ||
9 | * Quirk: Python and Perl headers cannot be in arbitrary places, so keep | ||
10 | * these 3 testcases at the top: | ||
11 | */ | ||
12 | #define main main_test_libpython | ||
13 | # include "test-libpython.c" | ||
14 | #undef main | ||
15 | |||
16 | #define main main_test_libpython_version | ||
17 | # include "test-libpython-version.c" | ||
18 | #undef main | ||
19 | |||
20 | #define main main_test_libperl | ||
21 | # include "test-libperl.c" | ||
22 | #undef main | ||
23 | |||
24 | #define main main_test_hello | ||
25 | # include "test-hello.c" | ||
26 | #undef main | ||
27 | |||
28 | #define main main_test_libelf | ||
29 | # include "test-libelf.c" | ||
30 | #undef main | ||
31 | |||
32 | #define main main_test_libelf_mmap | ||
33 | # include "test-libelf-mmap.c" | ||
34 | #undef main | ||
35 | |||
36 | #define main main_test_glibc | ||
37 | # include "test-glibc.c" | ||
38 | #undef main | ||
39 | |||
40 | #define main main_test_dwarf | ||
41 | # include "test-dwarf.c" | ||
42 | #undef main | ||
43 | |||
44 | #define main main_test_libelf_getphdrnum | ||
45 | # include "test-libelf-getphdrnum.c" | ||
46 | #undef main | ||
47 | |||
48 | #define main main_test_libunwind | ||
49 | # include "test-libunwind.c" | ||
50 | #undef main | ||
51 | |||
52 | #define main main_test_libaudit | ||
53 | # include "test-libaudit.c" | ||
54 | #undef main | ||
55 | |||
56 | #define main main_test_libslang | ||
57 | # include "test-libslang.c" | ||
58 | #undef main | ||
59 | |||
60 | #define main main_test_gtk2 | ||
61 | # include "test-gtk2.c" | ||
62 | #undef main | ||
63 | |||
64 | #define main main_test_gtk2_infobar | ||
65 | # include "test-gtk2-infobar.c" | ||
66 | #undef main | ||
67 | |||
68 | #define main main_test_libbfd | ||
69 | # include "test-libbfd.c" | ||
70 | #undef main | ||
71 | |||
72 | #define main main_test_backtrace | ||
73 | # include "test-backtrace.c" | ||
74 | #undef main | ||
75 | |||
76 | #define main main_test_libnuma | ||
77 | # include "test-libnuma.c" | ||
78 | #undef main | ||
79 | |||
80 | #define main main_test_timerfd | ||
81 | # include "test-timerfd.c" | ||
82 | #undef main | ||
83 | |||
84 | #define main main_test_stackprotector_all | ||
85 | # include "test-stackprotector-all.c" | ||
86 | #undef main | ||
87 | |||
88 | #define main main_test_libdw_dwarf_unwind | ||
89 | # include "test-libdw-dwarf-unwind.c" | ||
90 | #undef main | ||
91 | |||
92 | #define main main_test_sync_compare_and_swap | ||
93 | # include "test-sync-compare-and-swap.c" | ||
94 | #undef main | ||
95 | |||
96 | #define main main_test_zlib | ||
97 | # include "test-zlib.c" | ||
98 | #undef main | ||
99 | |||
100 | #define main main_test_pthread_attr_setaffinity_np | ||
101 | # include "test-pthread-attr-setaffinity-np.c" | ||
102 | #undef main | ||
103 | |||
104 | # if 0 | ||
105 | /* | ||
106 | * Disable libbabeltrace check for test-all, because the requested | ||
107 | * library version is not released yet in most distributions. Will | ||
108 | * reenable later. | ||
109 | */ | ||
110 | |||
111 | #define main main_test_libbabeltrace | ||
112 | # include "test-libbabeltrace.c" | ||
113 | #undef main | ||
114 | #endif | ||
115 | |||
116 | int main(int argc, char *argv[]) | ||
117 | { | ||
118 | main_test_libpython(); | ||
119 | main_test_libpython_version(); | ||
120 | main_test_libperl(); | ||
121 | main_test_hello(); | ||
122 | main_test_libelf(); | ||
123 | main_test_libelf_mmap(); | ||
124 | main_test_glibc(); | ||
125 | main_test_dwarf(); | ||
126 | main_test_libelf_getphdrnum(); | ||
127 | main_test_libunwind(); | ||
128 | main_test_libaudit(); | ||
129 | main_test_libslang(); | ||
130 | main_test_gtk2(argc, argv); | ||
131 | main_test_gtk2_infobar(argc, argv); | ||
132 | main_test_libbfd(); | ||
133 | main_test_backtrace(); | ||
134 | main_test_libnuma(); | ||
135 | main_test_timerfd(); | ||
136 | main_test_stackprotector_all(); | ||
137 | main_test_libdw_dwarf_unwind(); | ||
138 | main_test_sync_compare_and_swap(argc, argv); | ||
139 | main_test_zlib(); | ||
140 | main_test_pthread_attr_setaffinity_np(); | ||
141 | |||
142 | return 0; | ||
143 | } | ||
diff --git a/tools/build/feature/test-backtrace.c b/tools/build/feature/test-backtrace.c new file mode 100644 index 000000000000..7124aa1dc8fb --- /dev/null +++ b/tools/build/feature/test-backtrace.c | |||
@@ -0,0 +1,13 @@ | |||
1 | #include <execinfo.h> | ||
2 | #include <stdio.h> | ||
3 | |||
4 | int main(void) | ||
5 | { | ||
6 | void *backtrace_fns[10]; | ||
7 | size_t entries; | ||
8 | |||
9 | entries = backtrace(backtrace_fns, 10); | ||
10 | backtrace_symbols_fd(backtrace_fns, entries, 1); | ||
11 | |||
12 | return 0; | ||
13 | } | ||
diff --git a/tools/build/feature/test-bionic.c b/tools/build/feature/test-bionic.c new file mode 100644 index 000000000000..eac24e9513eb --- /dev/null +++ b/tools/build/feature/test-bionic.c | |||
@@ -0,0 +1,6 @@ | |||
1 | #include <android/api-level.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | return __ANDROID_API__; | ||
6 | } | ||
diff --git a/tools/build/feature/test-compile.c b/tools/build/feature/test-compile.c new file mode 100644 index 000000000000..31dbf45bf99c --- /dev/null +++ b/tools/build/feature/test-compile.c | |||
@@ -0,0 +1,4 @@ | |||
1 | int main(void) | ||
2 | { | ||
3 | return 0; | ||
4 | } | ||
diff --git a/tools/build/feature/test-cplus-demangle.c b/tools/build/feature/test-cplus-demangle.c new file mode 100644 index 000000000000..610c686e0009 --- /dev/null +++ b/tools/build/feature/test-cplus-demangle.c | |||
@@ -0,0 +1,14 @@ | |||
1 | extern int printf(const char *format, ...); | ||
2 | extern char *cplus_demangle(const char *, int); | ||
3 | |||
4 | int main(void) | ||
5 | { | ||
6 | char symbol[4096] = "FieldName__9ClassNameFd"; | ||
7 | char *tmp; | ||
8 | |||
9 | tmp = cplus_demangle(symbol, 0); | ||
10 | |||
11 | printf("demangled symbol: {%s}\n", tmp); | ||
12 | |||
13 | return 0; | ||
14 | } | ||
diff --git a/tools/build/feature/test-dwarf.c b/tools/build/feature/test-dwarf.c new file mode 100644 index 000000000000..3fc1801ce4a9 --- /dev/null +++ b/tools/build/feature/test-dwarf.c | |||
@@ -0,0 +1,10 @@ | |||
1 | #include <dwarf.h> | ||
2 | #include <elfutils/libdw.h> | ||
3 | #include <elfutils/version.h> | ||
4 | |||
5 | int main(void) | ||
6 | { | ||
7 | Dwarf *dbg = dwarf_begin(0, DWARF_C_READ); | ||
8 | |||
9 | return (long)dbg; | ||
10 | } | ||
diff --git a/tools/build/feature/test-fortify-source.c b/tools/build/feature/test-fortify-source.c new file mode 100644 index 000000000000..c9f398d87868 --- /dev/null +++ b/tools/build/feature/test-fortify-source.c | |||
@@ -0,0 +1,6 @@ | |||
1 | #include <stdio.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | return puts("hi"); | ||
6 | } | ||
diff --git a/tools/build/feature/test-glibc.c b/tools/build/feature/test-glibc.c new file mode 100644 index 000000000000..b0820345cd98 --- /dev/null +++ b/tools/build/feature/test-glibc.c | |||
@@ -0,0 +1,8 @@ | |||
1 | #include <gnu/libc-version.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | const char *version = gnu_get_libc_version(); | ||
6 | |||
7 | return (long)version; | ||
8 | } | ||
diff --git a/tools/build/feature/test-gtk2-infobar.c b/tools/build/feature/test-gtk2-infobar.c new file mode 100644 index 000000000000..397b4646d066 --- /dev/null +++ b/tools/build/feature/test-gtk2-infobar.c | |||
@@ -0,0 +1,11 @@ | |||
1 | #pragma GCC diagnostic ignored "-Wstrict-prototypes" | ||
2 | #include <gtk/gtk.h> | ||
3 | #pragma GCC diagnostic error "-Wstrict-prototypes" | ||
4 | |||
5 | int main(int argc, char *argv[]) | ||
6 | { | ||
7 | gtk_init(&argc, &argv); | ||
8 | gtk_info_bar_new(); | ||
9 | |||
10 | return 0; | ||
11 | } | ||
diff --git a/tools/build/feature/test-gtk2.c b/tools/build/feature/test-gtk2.c new file mode 100644 index 000000000000..6bd80e509439 --- /dev/null +++ b/tools/build/feature/test-gtk2.c | |||
@@ -0,0 +1,10 @@ | |||
1 | #pragma GCC diagnostic ignored "-Wstrict-prototypes" | ||
2 | #include <gtk/gtk.h> | ||
3 | #pragma GCC diagnostic error "-Wstrict-prototypes" | ||
4 | |||
5 | int main(int argc, char *argv[]) | ||
6 | { | ||
7 | gtk_init(&argc, &argv); | ||
8 | |||
9 | return 0; | ||
10 | } | ||
diff --git a/tools/build/feature/test-hello.c b/tools/build/feature/test-hello.c new file mode 100644 index 000000000000..c9f398d87868 --- /dev/null +++ b/tools/build/feature/test-hello.c | |||
@@ -0,0 +1,6 @@ | |||
1 | #include <stdio.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | return puts("hi"); | ||
6 | } | ||
diff --git a/tools/build/feature/test-libaudit.c b/tools/build/feature/test-libaudit.c new file mode 100644 index 000000000000..afc019f08641 --- /dev/null +++ b/tools/build/feature/test-libaudit.c | |||
@@ -0,0 +1,10 @@ | |||
1 | #include <libaudit.h> | ||
2 | |||
3 | extern int printf(const char *format, ...); | ||
4 | |||
5 | int main(void) | ||
6 | { | ||
7 | printf("error message: %s\n", audit_errno_to_name(0)); | ||
8 | |||
9 | return audit_open(); | ||
10 | } | ||
diff --git a/tools/build/feature/test-libbabeltrace.c b/tools/build/feature/test-libbabeltrace.c new file mode 100644 index 000000000000..9cf802a04885 --- /dev/null +++ b/tools/build/feature/test-libbabeltrace.c | |||
@@ -0,0 +1,9 @@ | |||
1 | |||
2 | #include <babeltrace/ctf-writer/writer.h> | ||
3 | #include <babeltrace/ctf-ir/stream-class.h> | ||
4 | |||
5 | int main(void) | ||
6 | { | ||
7 | bt_ctf_stream_class_get_packet_context_type((void *) 0); | ||
8 | return 0; | ||
9 | } | ||
diff --git a/tools/build/feature/test-libbfd.c b/tools/build/feature/test-libbfd.c new file mode 100644 index 000000000000..24059907e990 --- /dev/null +++ b/tools/build/feature/test-libbfd.c | |||
@@ -0,0 +1,15 @@ | |||
1 | #include <bfd.h> | ||
2 | |||
3 | extern int printf(const char *format, ...); | ||
4 | |||
5 | int main(void) | ||
6 | { | ||
7 | char symbol[4096] = "FieldName__9ClassNameFd"; | ||
8 | char *tmp; | ||
9 | |||
10 | tmp = bfd_demangle(0, symbol, 0); | ||
11 | |||
12 | printf("demangled symbol: {%s}\n", tmp); | ||
13 | |||
14 | return 0; | ||
15 | } | ||
diff --git a/tools/build/feature/test-libdw-dwarf-unwind.c b/tools/build/feature/test-libdw-dwarf-unwind.c new file mode 100644 index 000000000000..f676a3ff442a --- /dev/null +++ b/tools/build/feature/test-libdw-dwarf-unwind.c | |||
@@ -0,0 +1,13 @@ | |||
1 | |||
2 | #include <elfutils/libdwfl.h> | ||
3 | |||
4 | int main(void) | ||
5 | { | ||
6 | /* | ||
7 | * This function is guarded via: __nonnull_attribute__ (1, 2). | ||
8 | * Passing '1' as arguments value. This code is never executed, | ||
9 | * only compiled. | ||
10 | */ | ||
11 | dwfl_thread_getframes((void *) 1, (void *) 1, NULL); | ||
12 | return 0; | ||
13 | } | ||
diff --git a/tools/build/feature/test-libelf-getphdrnum.c b/tools/build/feature/test-libelf-getphdrnum.c new file mode 100644 index 000000000000..d710459306c3 --- /dev/null +++ b/tools/build/feature/test-libelf-getphdrnum.c | |||
@@ -0,0 +1,8 @@ | |||
1 | #include <libelf.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | size_t dst; | ||
6 | |||
7 | return elf_getphdrnum(0, &dst); | ||
8 | } | ||
diff --git a/tools/build/feature/test-libelf-mmap.c b/tools/build/feature/test-libelf-mmap.c new file mode 100644 index 000000000000..564427d7ef18 --- /dev/null +++ b/tools/build/feature/test-libelf-mmap.c | |||
@@ -0,0 +1,8 @@ | |||
1 | #include <libelf.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | Elf *elf = elf_begin(0, ELF_C_READ_MMAP, 0); | ||
6 | |||
7 | return (long)elf; | ||
8 | } | ||
diff --git a/tools/build/feature/test-libelf.c b/tools/build/feature/test-libelf.c new file mode 100644 index 000000000000..08db322d8957 --- /dev/null +++ b/tools/build/feature/test-libelf.c | |||
@@ -0,0 +1,8 @@ | |||
1 | #include <libelf.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | Elf *elf = elf_begin(0, ELF_C_READ, 0); | ||
6 | |||
7 | return (long)elf; | ||
8 | } | ||
diff --git a/tools/build/feature/test-libnuma.c b/tools/build/feature/test-libnuma.c new file mode 100644 index 000000000000..4763d9cd587d --- /dev/null +++ b/tools/build/feature/test-libnuma.c | |||
@@ -0,0 +1,9 @@ | |||
1 | #include <numa.h> | ||
2 | #include <numaif.h> | ||
3 | |||
4 | int main(void) | ||
5 | { | ||
6 | numa_available(); | ||
7 | |||
8 | return 0; | ||
9 | } | ||
diff --git a/tools/build/feature/test-libperl.c b/tools/build/feature/test-libperl.c new file mode 100644 index 000000000000..8871f6a0fdb4 --- /dev/null +++ b/tools/build/feature/test-libperl.c | |||
@@ -0,0 +1,9 @@ | |||
1 | #include <EXTERN.h> | ||
2 | #include <perl.h> | ||
3 | |||
4 | int main(void) | ||
5 | { | ||
6 | perl_alloc(); | ||
7 | |||
8 | return 0; | ||
9 | } | ||
diff --git a/tools/build/feature/test-libpython-version.c b/tools/build/feature/test-libpython-version.c new file mode 100644 index 000000000000..facea122d812 --- /dev/null +++ b/tools/build/feature/test-libpython-version.c | |||
@@ -0,0 +1,10 @@ | |||
1 | #include <Python.h> | ||
2 | |||
3 | #if PY_VERSION_HEX >= 0x03000000 | ||
4 | #error | ||
5 | #endif | ||
6 | |||
7 | int main(void) | ||
8 | { | ||
9 | return 0; | ||
10 | } | ||
diff --git a/tools/build/feature/test-libpython.c b/tools/build/feature/test-libpython.c new file mode 100644 index 000000000000..b24b28ad6324 --- /dev/null +++ b/tools/build/feature/test-libpython.c | |||
@@ -0,0 +1,8 @@ | |||
1 | #include <Python.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | Py_Initialize(); | ||
6 | |||
7 | return 0; | ||
8 | } | ||
diff --git a/tools/build/feature/test-libslang.c b/tools/build/feature/test-libslang.c new file mode 100644 index 000000000000..22ff22ed94d1 --- /dev/null +++ b/tools/build/feature/test-libslang.c | |||
@@ -0,0 +1,6 @@ | |||
1 | #include <slang.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | return SLsmg_init_smg(); | ||
6 | } | ||
diff --git a/tools/build/feature/test-libunwind-debug-frame.c b/tools/build/feature/test-libunwind-debug-frame.c new file mode 100644 index 000000000000..0ef8087a104a --- /dev/null +++ b/tools/build/feature/test-libunwind-debug-frame.c | |||
@@ -0,0 +1,16 @@ | |||
1 | #include <libunwind.h> | ||
2 | #include <stdlib.h> | ||
3 | |||
4 | extern int | ||
5 | UNW_OBJ(dwarf_find_debug_frame) (int found, unw_dyn_info_t *di_debug, | ||
6 | unw_word_t ip, unw_word_t segbase, | ||
7 | const char *obj_name, unw_word_t start, | ||
8 | unw_word_t end); | ||
9 | |||
10 | #define dwarf_find_debug_frame UNW_OBJ(dwarf_find_debug_frame) | ||
11 | |||
12 | int main(void) | ||
13 | { | ||
14 | dwarf_find_debug_frame(0, NULL, 0, 0, NULL, 0, 0); | ||
15 | return 0; | ||
16 | } | ||
diff --git a/tools/build/feature/test-libunwind.c b/tools/build/feature/test-libunwind.c new file mode 100644 index 000000000000..43b9369bcab7 --- /dev/null +++ b/tools/build/feature/test-libunwind.c | |||
@@ -0,0 +1,27 @@ | |||
1 | #include <libunwind.h> | ||
2 | #include <stdlib.h> | ||
3 | |||
4 | extern int UNW_OBJ(dwarf_search_unwind_table) (unw_addr_space_t as, | ||
5 | unw_word_t ip, | ||
6 | unw_dyn_info_t *di, | ||
7 | unw_proc_info_t *pi, | ||
8 | int need_unwind_info, void *arg); | ||
9 | |||
10 | |||
11 | #define dwarf_search_unwind_table UNW_OBJ(dwarf_search_unwind_table) | ||
12 | |||
13 | static unw_accessors_t accessors; | ||
14 | |||
15 | int main(void) | ||
16 | { | ||
17 | unw_addr_space_t addr_space; | ||
18 | |||
19 | addr_space = unw_create_addr_space(&accessors, 0); | ||
20 | if (addr_space) | ||
21 | return 0; | ||
22 | |||
23 | unw_init_remote(NULL, addr_space, NULL); | ||
24 | dwarf_search_unwind_table(addr_space, 0, NULL, NULL, 0, NULL); | ||
25 | |||
26 | return 0; | ||
27 | } | ||
diff --git a/tools/build/feature/test-pthread-attr-setaffinity-np.c b/tools/build/feature/test-pthread-attr-setaffinity-np.c new file mode 100644 index 000000000000..fdada5e8d454 --- /dev/null +++ b/tools/build/feature/test-pthread-attr-setaffinity-np.c | |||
@@ -0,0 +1,17 @@ | |||
1 | #include <stdint.h> | ||
2 | #include <pthread.h> | ||
3 | #include <sched.h> | ||
4 | |||
5 | int main(void) | ||
6 | { | ||
7 | int ret = 0; | ||
8 | pthread_attr_t thread_attr; | ||
9 | cpu_set_t cs; | ||
10 | |||
11 | pthread_attr_init(&thread_attr); | ||
12 | CPU_ZERO(&cs); | ||
13 | |||
14 | ret = pthread_attr_setaffinity_np(&thread_attr, sizeof(cs), &cs); | ||
15 | |||
16 | return ret; | ||
17 | } | ||
diff --git a/tools/build/feature/test-stackprotector-all.c b/tools/build/feature/test-stackprotector-all.c new file mode 100644 index 000000000000..c9f398d87868 --- /dev/null +++ b/tools/build/feature/test-stackprotector-all.c | |||
@@ -0,0 +1,6 @@ | |||
1 | #include <stdio.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | return puts("hi"); | ||
6 | } | ||
diff --git a/tools/build/feature/test-sync-compare-and-swap.c b/tools/build/feature/test-sync-compare-and-swap.c new file mode 100644 index 000000000000..c34d4ca4af56 --- /dev/null +++ b/tools/build/feature/test-sync-compare-and-swap.c | |||
@@ -0,0 +1,14 @@ | |||
1 | #include <stdint.h> | ||
2 | |||
3 | volatile uint64_t x; | ||
4 | |||
5 | int main(int argc, char *argv[]) | ||
6 | { | ||
7 | uint64_t old, new = argc; | ||
8 | |||
9 | argv = argv; | ||
10 | do { | ||
11 | old = __sync_val_compare_and_swap(&x, 0, 0); | ||
12 | } while (!__sync_bool_compare_and_swap(&x, old, new)); | ||
13 | return old == new; | ||
14 | } | ||
diff --git a/tools/build/feature/test-timerfd.c b/tools/build/feature/test-timerfd.c new file mode 100644 index 000000000000..8c5c083b4d3c --- /dev/null +++ b/tools/build/feature/test-timerfd.c | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * test for timerfd functions used by perf-kvm-stat-live | ||
3 | */ | ||
4 | #include <sys/timerfd.h> | ||
5 | |||
6 | int main(void) | ||
7 | { | ||
8 | struct itimerspec new_value; | ||
9 | |||
10 | int fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK); | ||
11 | if (fd < 0) | ||
12 | return 1; | ||
13 | |||
14 | if (timerfd_settime(fd, 0, &new_value, NULL) != 0) | ||
15 | return 1; | ||
16 | |||
17 | return 0; | ||
18 | } | ||
diff --git a/tools/build/feature/test-zlib.c b/tools/build/feature/test-zlib.c new file mode 100644 index 000000000000..e111fff6240e --- /dev/null +++ b/tools/build/feature/test-zlib.c | |||
@@ -0,0 +1,9 @@ | |||
1 | #include <zlib.h> | ||
2 | |||
3 | int main(void) | ||
4 | { | ||
5 | z_stream zs; | ||
6 | |||
7 | inflateInit(&zs); | ||
8 | return 0; | ||
9 | } | ||