blob: 89012351155a3904ddb81fe9294a5a9538499077 [file] [log] [blame]
Marat Dukhan08c4a432019-10-03 09:29:21 -07001"""Build definitions and rules for XNNPACK."""
2
3load(":emscripten.bzl", "xnnpack_emscripten_benchmark_linkopts", "xnnpack_emscripten_deps", "xnnpack_emscripten_minimal_linkopts", "xnnpack_emscripten_test_linkopts")
4
5def xnnpack_visibility():
6 """Visibility of :XNNPACK target.
7
8 All other targets have private visibility, and can not have external
9 dependencies.
10 """
Marat Dukhan9d056a42019-10-03 12:13:35 -070011 return ["//visibility:public"]
Marat Dukhan08c4a432019-10-03 09:29:21 -070012
13def xnnpack_min_size_copts():
14 """Compiler flags for size-optimized builds."""
15 return ["-Os"]
16
Marat Dukhan10a38082020-04-17 03:58:35 -070017def xnnpack_gcc_std_copts():
18 """GCC-like compiler flags to specify language standard for C sources."""
Marat Dukhan08c4a432019-10-03 09:29:21 -070019 return ["-std=c99"]
20
Marat Dukhan10a38082020-04-17 03:58:35 -070021def xnnpack_msvc_std_copts():
22 """MSVC compiler flags to specify language standard for C sources."""
23 return ["/Drestrict="]
24
Marat Dukhan08c4a432019-10-03 09:29:21 -070025def xnnpack_std_cxxopts():
26 """Compiler flags to specify language standard for C++ sources."""
27 return ["-std=gnu++11"]
28
29def xnnpack_optional_ruy_copts():
30 """Compiler flags to optionally enable Ruy benchmarks."""
31 return []
32
33def xnnpack_optional_gemmlowp_copts():
34 """Compiler flags to optionally enable Gemmlowp benchmarks."""
35 return []
36
37def xnnpack_optional_tflite_copts():
38 """Compiler flags to optionally enable TensorFlow Lite benchmarks."""
39 return []
40
41def xnnpack_optional_armcl_copts():
42 """Compiler flags to optionally enable ARM ComputeLibrary benchmarks."""
43 return []
44
Marat Dukhan8d3c6932020-03-06 20:27:27 -080045def xnnpack_optional_dnnl_copts():
46 """Compiler flags to optionally enable Intel DNNL benchmarks."""
47 return []
48
Marat Dukhan08c4a432019-10-03 09:29:21 -070049def xnnpack_optional_ruy_deps():
50 """Optional Ruy dependencies."""
51 return []
52
53def xnnpack_optional_gemmlowp_deps():
54 """Optional Gemmlowp dependencies."""
55 return []
56
57def xnnpack_optional_tflite_deps():
58 """Optional TensorFlow Lite dependencies."""
59 return []
60
61def xnnpack_optional_armcl_deps():
62 """Optional ARM ComputeLibrary dependencies."""
63 return []
64
Marat Dukhan8d3c6932020-03-06 20:27:27 -080065def xnnpack_optional_dnnl_deps():
66 """Optional Intel DNNL dependencies."""
67 return []
68
Marat Dukhan08c4a432019-10-03 09:29:21 -070069def xnnpack_cc_library(
70 name,
71 srcs = [],
Marat Dukhan10a38082020-04-17 03:58:35 -070072 psimd_srcs = [],
Marat Dukhan08c4a432019-10-03 09:29:21 -070073 x86_srcs = [],
74 aarch32_srcs = [],
75 aarch64_srcs = [],
Marat Dukhancf056b22019-10-07 10:26:29 -070076 asmjs_srcs = [],
77 wasm_srcs = [],
78 wasmsimd_srcs = [],
Marat Dukhan08c4a432019-10-03 09:29:21 -070079 copts = [],
Marat Dukhan10a38082020-04-17 03:58:35 -070080 gcc_copts = [],
81 msvc_copts = [],
82 mingw_copts = [],
83 msys_copts = [],
84 gcc_x86_copts = [],
85 msvc_x86_32_copts = [],
86 msvc_x86_64_copts = [],
Marat Dukhan08c4a432019-10-03 09:29:21 -070087 aarch32_copts = [],
88 aarch64_copts = [],
Marat Dukhancf056b22019-10-07 10:26:29 -070089 asmjs_copts = [],
90 wasm_copts = [],
91 wasmsimd_copts = [],
Marat Dukhan08c4a432019-10-03 09:29:21 -070092 optimized_copts = ["-O2"],
93 hdrs = [],
Marat Dukhan10a38082020-04-17 03:58:35 -070094 defines = [],
95 includes = [],
96 deps = [],
97 visibility = []):
Marat Dukhancf056b22019-10-07 10:26:29 -070098 """C/C++/assembly library with architecture-specific configuration.
Marat Dukhan08c4a432019-10-03 09:29:21 -070099
100 Define a static library with architecture- and instruction-specific
Marat Dukhancf056b22019-10-07 10:26:29 -0700101 source files and/or compiler flags.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700102
103 Args:
104 name: The name of the library target to define.
105 srcs: The list of architecture-independent source files.
Marat Dukhan500b8892020-04-15 17:09:50 -0700106 psimd_srcs: The list of psimd-specific source files.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700107 x86_srcs: The list of x86-specific source files.
108 aarch32_srcs: The list of AArch32-specific source files.
109 aarch64_srcs: The list of AArch64-specific source files.
Marat Dukhancf056b22019-10-07 10:26:29 -0700110 asmjs_srcs: The list of Asm.js-specific source files.
111 wasm_srcs: The list of WebAssembly/MVP-specific source files.
112 wasmsimd_srcs: The list of WebAssembly/SIMD-specific source files.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700113 copts: The list of compiler flags to use in all builds. -I flags for
114 include/ and src/ directories of XNNPACK are always prepended
115 before these user-specified flags.
Marat Dukhan10a38082020-04-17 03:58:35 -0700116 gcc_copts: The list of compiler flags to use with GCC-like compilers.
117 msvc_copts: The list of compiler flags to use with MSVC compiler.
118 mingw_copts: The list of compiler flags to use with MinGW GCC compilers.
119 msys_copts: The list of compiler flags to use with MSYS (Cygwin) GCC compilers.
120 gcc_x86_copts: The list of GCC-like compiler flags to use in x86 (32-bit and 64-bit) builds.
121 msvc_x86_32_copts: The list of MSVC compiler flags to use in x86 (32-bit) builds.
122 msvc_x86_64_copts: The list of MSVC compiler flags to use in x86 (64-bit) builds.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700123 aarch32_copts: The list of compiler flags to use in AArch32 builds.
124 aarch64_copts: The list of compiler flags to use in AArch64 builds.
Marat Dukhancf056b22019-10-07 10:26:29 -0700125 asmjs_copts: The list of compiler flags to use in Asm.js builds.
126 wasm_copts: The list of compiler flags to use in WebAssembly/MVP builds.
127 wasmsimd_copts: The list of compiler flags to use in WebAssembly/SIMD
128 builds.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700129 optimized_copts: The list of compiler flags to use in optimized builds.
130 Defaults to -O2.
131 hdrs: The list of header files published by this library to be textually
132 included by sources in dependent rules.
Marat Dukhan10a38082020-04-17 03:58:35 -0700133 defines: List of predefines macros to be added to the compile line.
134 includes: List of include dirs to be added to the compile line.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700135 deps: The list of other libraries to be linked.
Marat Dukhan10a38082020-04-17 03:58:35 -0700136 visibility: The list of packages that can depend on this target.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700137 """
138 native.cc_library(
139 name = name,
140 srcs = srcs + select({
Marat Dukhan500b8892020-04-15 17:09:50 -0700141 ":linux_k8": psimd_srcs + x86_srcs,
Marat Dukhan582094e2020-04-30 17:21:25 -0700142 ":linux_arm": psimd_srcs + aarch32_srcs,
Marat Dukhan500b8892020-04-15 17:09:50 -0700143 ":linux_armhf": psimd_srcs + aarch32_srcs,
Marat Dukhan582094e2020-04-30 17:21:25 -0700144 ":linux_aarch64": psimd_srcs + aarch64_srcs,
Marat Dukhan500b8892020-04-15 17:09:50 -0700145 ":macos_x86_64": psimd_srcs + x86_srcs,
Marat Dukhan10a38082020-04-17 03:58:35 -0700146 ":windows_x86_64_clang": psimd_srcs + x86_srcs,
147 ":windows_x86_64_mingw": psimd_srcs + x86_srcs,
148 ":windows_x86_64_msys": psimd_srcs + x86_srcs,
149 ":windows_x86_64": x86_srcs,
Marat Dukhan500b8892020-04-15 17:09:50 -0700150 ":android_armv7": psimd_srcs + aarch32_srcs,
151 ":android_arm64": psimd_srcs + aarch64_srcs,
152 ":android_x86": psimd_srcs + x86_srcs,
153 ":android_x86_64": psimd_srcs + x86_srcs,
154 ":ios_armv7": psimd_srcs + aarch32_srcs,
155 ":ios_arm64": psimd_srcs + aarch64_srcs,
156 ":ios_arm64e": psimd_srcs + aarch64_srcs,
157 ":ios_x86": psimd_srcs + x86_srcs,
158 ":ios_x86_64": psimd_srcs + x86_srcs,
159 ":watchos_armv7k": psimd_srcs + aarch32_srcs,
160 ":watchos_arm64_32": psimd_srcs + aarch64_srcs,
161 ":watchos_x86": psimd_srcs + x86_srcs,
162 ":watchos_x86_64": psimd_srcs + x86_srcs,
163 ":tvos_arm64": psimd_srcs + aarch64_srcs,
164 ":tvos_x86_64": psimd_srcs + x86_srcs,
Marat Dukhancf056b22019-10-07 10:26:29 -0700165 ":emscripten_asmjs": asmjs_srcs,
166 ":emscripten_wasm": wasm_srcs,
Marat Dukhan500b8892020-04-15 17:09:50 -0700167 ":emscripten_wasmsimd": psimd_srcs + wasmsimd_srcs,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700168 "//conditions:default": [],
169 }),
170 copts = [
171 "-Iinclude",
172 "-Isrc",
173 ] + copts + select({
Marat Dukhan10a38082020-04-17 03:58:35 -0700174 ":linux_k8": gcc_x86_copts,
Marat Dukhan582094e2020-04-30 17:21:25 -0700175 ":linux_arm": aarch32_copts,
Terry Heo68eef3f2020-04-13 22:53:52 -0700176 ":linux_armhf": aarch32_copts,
Marat Dukhan582094e2020-04-30 17:21:25 -0700177 ":linux_aarch64": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700178 ":macos_x86_64": gcc_x86_copts,
179 ":windows_x86_64_clang": ["/clang:" + opt for opt in gcc_x86_copts],
180 ":windows_x86_64_mingw": mingw_copts + gcc_x86_copts,
181 ":windows_x86_64_msys": msys_copts + gcc_x86_copts,
182 ":windows_x86_64": msvc_x86_64_copts,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700183 ":android_armv7": aarch32_copts,
184 ":android_arm64": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700185 ":android_x86": gcc_x86_copts,
186 ":android_x86_64": gcc_x86_copts,
Marat Dukhan1498d1d2020-02-11 20:00:05 -0800187 ":ios_armv7": aarch32_copts,
188 ":ios_arm64": aarch64_copts,
189 ":ios_arm64e": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700190 ":ios_x86": gcc_x86_copts,
191 ":ios_x86_64": gcc_x86_copts,
Marat Dukhan1498d1d2020-02-11 20:00:05 -0800192 ":watchos_armv7k": aarch32_copts,
193 ":watchos_arm64_32": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700194 ":watchos_x86": gcc_x86_copts,
195 ":watchos_x86_64": gcc_x86_copts,
Marat Dukhan1498d1d2020-02-11 20:00:05 -0800196 ":tvos_arm64": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700197 ":tvos_x86_64": gcc_x86_copts,
Marat Dukhancf056b22019-10-07 10:26:29 -0700198 ":emscripten_asmjs": asmjs_copts,
199 ":emscripten_wasm": wasm_copts,
200 ":emscripten_wasmsimd": wasmsimd_copts,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700201 "//conditions:default": [],
202 }) + select({
Marat Dukhan10a38082020-04-17 03:58:35 -0700203 ":windows_x86_64_clang": ["/clang:" + opt for opt in gcc_copts],
204 ":windows_x86_64_mingw": gcc_copts,
205 ":windows_x86_64_msys": gcc_copts,
206 ":windows_x86_64": msvc_copts,
207 "//conditions:default": gcc_copts,
208 }) + select({
Marat Dukhan08c4a432019-10-03 09:29:21 -0700209 ":optimized_build": optimized_copts,
210 "//conditions:default": [],
211 }),
Marat Dukhan10a38082020-04-17 03:58:35 -0700212 defines = defines,
213 deps = deps,
214 includes = ["include", "src"] + includes,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700215 linkstatic = True,
216 linkopts = select({
217 ":linux_k8": ["-lpthread"],
Marat Dukhan582094e2020-04-30 17:21:25 -0700218 ":linux_arm": ["-lpthread"],
Terry Heo68eef3f2020-04-13 22:53:52 -0700219 ":linux_armhf": ["-lpthread"],
Marat Dukhan582094e2020-04-30 17:21:25 -0700220 ":linux_aarch64": ["-lpthread"],
Marat Dukhan08c4a432019-10-03 09:29:21 -0700221 ":android": ["-lm"],
222 "//conditions:default": [],
223 }),
224 textual_hdrs = hdrs,
Marat Dukhan10a38082020-04-17 03:58:35 -0700225 visibility = visibility,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700226 )
227
228def xnnpack_aggregate_library(
229 name,
230 generic_deps = [],
Marat Dukhan500b8892020-04-15 17:09:50 -0700231 psimd_deps = [],
Marat Dukhan08c4a432019-10-03 09:29:21 -0700232 x86_deps = [],
233 aarch32_deps = [],
234 aarch64_deps = [],
235 wasm_deps = [],
236 wasmsimd_deps = []):
237 """Static library that aggregates architecture-specific dependencies.
238
239 Args:
240 name: The name of the library target to define.
241 generic_deps: The list of libraries to link on all architectures.
Marat Dukhan500b8892020-04-15 17:09:50 -0700242 psimd_deps: The list of libraries to link in psimd-enabled builds.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700243 x86_deps: The list of libraries to link in x86 and x86-64 builds.
244 aarch32_deps: The list of libraries to link in AArch32 builds.
245 aarch64_deps: The list of libraries to link in AArch32 builds.
246 wasm_deps: The list of libraries to link in WebAssembly (MVP) builds.
247 wasmsimd_deps: The list of libraries to link in WebAssembly SIMD builds.
248 """
249
250 native.cc_library(
251 name = name,
252 linkstatic = True,
253 deps = generic_deps + select({
Marat Dukhan500b8892020-04-15 17:09:50 -0700254 ":linux_k8": psimd_deps + x86_deps,
Marat Dukhan582094e2020-04-30 17:21:25 -0700255 ":linux_arm": psimd_deps + aarch32_deps,
Marat Dukhan500b8892020-04-15 17:09:50 -0700256 ":linux_armhf": psimd_deps + aarch32_deps,
Marat Dukhan582094e2020-04-30 17:21:25 -0700257 ":linux_aarch64": psimd_deps + aarch64_deps,
Marat Dukhan500b8892020-04-15 17:09:50 -0700258 ":macos_x86_64": psimd_deps + x86_deps,
Marat Dukhan10a38082020-04-17 03:58:35 -0700259 ":windows_x86_64_clang": psimd_deps + x86_deps,
260 ":windows_x86_64_mingw": psimd_deps + x86_deps,
261 ":windows_x86_64_msys": psimd_deps + x86_deps,
262 ":windows_x86_64": x86_deps,
Marat Dukhan500b8892020-04-15 17:09:50 -0700263 ":android_armv7": psimd_deps + aarch32_deps,
264 ":android_arm64": psimd_deps + aarch64_deps,
265 ":android_x86": psimd_deps + x86_deps,
266 ":android_x86_64": psimd_deps + x86_deps,
267 ":ios_armv7": psimd_deps + aarch32_deps,
268 ":ios_arm64": psimd_deps + aarch64_deps,
269 ":ios_arm64e": psimd_deps + aarch64_deps,
270 ":ios_x86": psimd_deps + x86_deps,
271 ":ios_x86_64": psimd_deps + x86_deps,
272 ":watchos_armv7k": psimd_deps + aarch32_deps,
273 ":watchos_arm64_32": psimd_deps + aarch64_deps,
274 ":watchos_x86": psimd_deps + x86_deps,
275 ":watchos_x86_64": psimd_deps + x86_deps,
276 ":tvos_arm64": psimd_deps + aarch64_deps,
277 ":tvos_x86_64": psimd_deps + x86_deps,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700278 ":emscripten_wasm": wasm_deps,
Marat Dukhan500b8892020-04-15 17:09:50 -0700279 ":emscripten_wasmsimd": psimd_deps + wasmsimd_deps,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700280 ":emscripten_asmjs": [],
281 }),
282 )
283
Marat Dukhan10a38082020-04-17 03:58:35 -0700284def xnnpack_unit_test(name, srcs, copts = [], mingw_copts = [], msys_copts = [], deps = []):
Marat Dukhan08c4a432019-10-03 09:29:21 -0700285 """Unit test binary based on Google Test.
286
287 Args:
288 name: The name of the test target to define.
289 srcs: The list of source and header files.
290 copts: The list of additional compiler flags for the target. -I flags
291 for include/ and src/ directories of XNNPACK are always prepended
292 before these user-specified flags.
Marat Dukhan10a38082020-04-17 03:58:35 -0700293 mingw_copts: The list of compiler flags to use with MinGW GCC compilers.
294 msys_copts: The list of compiler flags to use with MSYS (Cygwin) GCC compilers.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700295 deps: The list of additional libraries to be linked. Google Test library
296 (with main() function) is always added as a dependency and does not
297 need to be explicitly specified.
298 """
299
300 native.cc_test(
301 name = name,
302 srcs = srcs,
303 copts = xnnpack_std_cxxopts() + [
304 "-Iinclude",
305 "-Isrc",
Marat Dukhana98efa12020-05-04 17:07:49 -0700306 ] + select({
Marat Dukhan10a38082020-04-17 03:58:35 -0700307 ":windows_x86_64_mingw": mingw_copts,
308 ":windows_x86_64_msys": msys_copts,
309 "//conditions:default": [],
Marat Dukhana98efa12020-05-04 17:07:49 -0700310 }) + select({
311 ":windows_x86_64_clang": ["/clang:-Wno-unused-function"],
312 ":windows_x86_64_mingw": ["-Wno-unused-function"],
313 ":windows_x86_64_msys": ["-Wno-unused-function"],
314 ":windows_x86_64": [],
315 "//conditions:default": ["-Wno-unused-function"],
316 }) + copts,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700317 linkopts = select({
318 ":emscripten": xnnpack_emscripten_test_linkopts(),
319 "//conditions:default": [],
320 }),
321 linkstatic = True,
322 deps = [
323 "@com_google_googletest//:gtest_main",
324 ] + deps + select({
325 ":emscripten": xnnpack_emscripten_deps(),
326 "//conditions:default": [],
327 }),
328 )
329
330def xnnpack_binary(name, srcs, copts = [], deps = []):
331 """Minimal binary
332
333 Args:
334 name: The name of the binary target to define.
335 srcs: The list of source and header files.
336 copts: The list of additional compiler flags for the target. -I flags
337 for include/ and src/ directories of XNNPACK are always prepended
338 before these user-specified flags.
339 deps: The list of libraries to be linked.
340 """
341 native.cc_binary(
342 name = name,
343 srcs = srcs,
344 copts = [
345 "-Iinclude",
346 "-Isrc",
347 ] + copts,
348 linkopts = select({
349 ":emscripten": xnnpack_emscripten_minimal_linkopts(),
350 "//conditions:default": [],
351 }),
352 linkstatic = True,
353 deps = deps,
354 )
355
Marat Dukhana98efa12020-05-04 17:07:49 -0700356def xnnpack_benchmark(name, srcs, copts = [], deps = [], tags = []):
Marat Dukhan08c4a432019-10-03 09:29:21 -0700357 """Microbenchmark binary based on Google Benchmark
358
359 Args:
360 name: The name of the binary target to define.
361 srcs: The list of source and header files.
362 copts: The list of additional compiler flags for the target. -I flags
363 for include/ and src/ directories of XNNPACK are always prepended
364 before these user-specified flags.
365 deps: The list of additional libraries to be linked. Google Benchmark
366 library is always added as a dependency and does not need to be
367 explicitly specified.
368 """
369 native.cc_binary(
370 name = name,
371 srcs = srcs,
372 copts = xnnpack_std_cxxopts() + [
373 "-Iinclude",
374 "-Isrc",
Marat Dukhana98efa12020-05-04 17:07:49 -0700375 ] + select({
376 ":windows_x86_64_clang": ["/clang:-Wno-unused-function"],
377 ":windows_x86_64_mingw": ["-Wno-unused-function"],
378 ":windows_x86_64_msys": ["-Wno-unused-function"],
379 ":windows_x86_64": [],
380 "//conditions:default": ["-Wno-unused-function"],
381 }) + copts,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700382 linkopts = select({
383 ":emscripten": xnnpack_emscripten_benchmark_linkopts(),
Marat Dukhan10a38082020-04-17 03:58:35 -0700384 ":windows_x86_64_mingw": ["-lshlwapi"],
385 ":windows_x86_64_msys": ["-lshlwapi"],
Marat Dukhan08c4a432019-10-03 09:29:21 -0700386 "//conditions:default": [],
387 }),
388 linkstatic = True,
389 deps = [
390 "@com_google_benchmark//:benchmark",
391 ] + deps + select({
392 ":emscripten": xnnpack_emscripten_deps(),
393 "//conditions:default": [],
394 }),
Marat Dukhan8ea0b072020-04-23 16:12:18 -0700395 tags = tags,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700396 )