blob: ff1dee803f15db94196babb12a5e782e16c174fa [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,
142 ":linux_aarch64": psimd_srcs + aarch64_srcs,
143 ":linux_armhf": psimd_srcs + aarch32_srcs,
144 ":macos_x86_64": psimd_srcs + x86_srcs,
Marat Dukhan10a38082020-04-17 03:58:35 -0700145 ":windows_x86_64_clang": psimd_srcs + x86_srcs,
146 ":windows_x86_64_mingw": psimd_srcs + x86_srcs,
147 ":windows_x86_64_msys": psimd_srcs + x86_srcs,
148 ":windows_x86_64": x86_srcs,
Marat Dukhan500b8892020-04-15 17:09:50 -0700149 ":android_armv7": psimd_srcs + aarch32_srcs,
150 ":android_arm64": psimd_srcs + aarch64_srcs,
151 ":android_x86": psimd_srcs + x86_srcs,
152 ":android_x86_64": psimd_srcs + x86_srcs,
153 ":ios_armv7": psimd_srcs + aarch32_srcs,
154 ":ios_arm64": psimd_srcs + aarch64_srcs,
155 ":ios_arm64e": psimd_srcs + aarch64_srcs,
156 ":ios_x86": psimd_srcs + x86_srcs,
157 ":ios_x86_64": psimd_srcs + x86_srcs,
158 ":watchos_armv7k": psimd_srcs + aarch32_srcs,
159 ":watchos_arm64_32": psimd_srcs + aarch64_srcs,
160 ":watchos_x86": psimd_srcs + x86_srcs,
161 ":watchos_x86_64": psimd_srcs + x86_srcs,
162 ":tvos_arm64": psimd_srcs + aarch64_srcs,
163 ":tvos_x86_64": psimd_srcs + x86_srcs,
Marat Dukhancf056b22019-10-07 10:26:29 -0700164 ":emscripten_asmjs": asmjs_srcs,
165 ":emscripten_wasm": wasm_srcs,
Marat Dukhan500b8892020-04-15 17:09:50 -0700166 ":emscripten_wasmsimd": psimd_srcs + wasmsimd_srcs,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700167 "//conditions:default": [],
168 }),
169 copts = [
170 "-Iinclude",
171 "-Isrc",
172 ] + copts + select({
Marat Dukhan10a38082020-04-17 03:58:35 -0700173 ":linux_k8": gcc_x86_copts,
Marat Dukhan4e45e662019-10-03 15:40:24 -0700174 ":linux_aarch64": aarch64_copts,
Terry Heo68eef3f2020-04-13 22:53:52 -0700175 ":linux_armhf": aarch32_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700176 ":macos_x86_64": gcc_x86_copts,
177 ":windows_x86_64_clang": ["/clang:" + opt for opt in gcc_x86_copts],
178 ":windows_x86_64_mingw": mingw_copts + gcc_x86_copts,
179 ":windows_x86_64_msys": msys_copts + gcc_x86_copts,
180 ":windows_x86_64": msvc_x86_64_copts,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700181 ":android_armv7": aarch32_copts,
182 ":android_arm64": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700183 ":android_x86": gcc_x86_copts,
184 ":android_x86_64": gcc_x86_copts,
Marat Dukhan1498d1d2020-02-11 20:00:05 -0800185 ":ios_armv7": aarch32_copts,
186 ":ios_arm64": aarch64_copts,
187 ":ios_arm64e": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700188 ":ios_x86": gcc_x86_copts,
189 ":ios_x86_64": gcc_x86_copts,
Marat Dukhan1498d1d2020-02-11 20:00:05 -0800190 ":watchos_armv7k": aarch32_copts,
191 ":watchos_arm64_32": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700192 ":watchos_x86": gcc_x86_copts,
193 ":watchos_x86_64": gcc_x86_copts,
Marat Dukhan1498d1d2020-02-11 20:00:05 -0800194 ":tvos_arm64": aarch64_copts,
Marat Dukhan10a38082020-04-17 03:58:35 -0700195 ":tvos_x86_64": gcc_x86_copts,
Marat Dukhancf056b22019-10-07 10:26:29 -0700196 ":emscripten_asmjs": asmjs_copts,
197 ":emscripten_wasm": wasm_copts,
198 ":emscripten_wasmsimd": wasmsimd_copts,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700199 "//conditions:default": [],
200 }) + select({
Marat Dukhan10a38082020-04-17 03:58:35 -0700201 ":windows_x86_64_clang": ["/clang:" + opt for opt in gcc_copts],
202 ":windows_x86_64_mingw": gcc_copts,
203 ":windows_x86_64_msys": gcc_copts,
204 ":windows_x86_64": msvc_copts,
205 "//conditions:default": gcc_copts,
206 }) + select({
Marat Dukhan08c4a432019-10-03 09:29:21 -0700207 ":optimized_build": optimized_copts,
208 "//conditions:default": [],
209 }),
Marat Dukhan10a38082020-04-17 03:58:35 -0700210 defines = defines,
211 deps = deps,
212 includes = ["include", "src"] + includes,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700213 linkstatic = True,
214 linkopts = select({
215 ":linux_k8": ["-lpthread"],
Marat Dukhan4e45e662019-10-03 15:40:24 -0700216 ":linux_aarch64": ["-lpthread"],
Terry Heo68eef3f2020-04-13 22:53:52 -0700217 ":linux_armhf": ["-lpthread"],
Marat Dukhan08c4a432019-10-03 09:29:21 -0700218 ":android": ["-lm"],
219 "//conditions:default": [],
220 }),
221 textual_hdrs = hdrs,
Marat Dukhan10a38082020-04-17 03:58:35 -0700222 visibility = visibility,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700223 )
224
225def xnnpack_aggregate_library(
226 name,
227 generic_deps = [],
Marat Dukhan500b8892020-04-15 17:09:50 -0700228 psimd_deps = [],
Marat Dukhan08c4a432019-10-03 09:29:21 -0700229 x86_deps = [],
230 aarch32_deps = [],
231 aarch64_deps = [],
232 wasm_deps = [],
233 wasmsimd_deps = []):
234 """Static library that aggregates architecture-specific dependencies.
235
236 Args:
237 name: The name of the library target to define.
238 generic_deps: The list of libraries to link on all architectures.
Marat Dukhan500b8892020-04-15 17:09:50 -0700239 psimd_deps: The list of libraries to link in psimd-enabled builds.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700240 x86_deps: The list of libraries to link in x86 and x86-64 builds.
241 aarch32_deps: The list of libraries to link in AArch32 builds.
242 aarch64_deps: The list of libraries to link in AArch32 builds.
243 wasm_deps: The list of libraries to link in WebAssembly (MVP) builds.
244 wasmsimd_deps: The list of libraries to link in WebAssembly SIMD builds.
245 """
246
247 native.cc_library(
248 name = name,
249 linkstatic = True,
250 deps = generic_deps + select({
Marat Dukhan500b8892020-04-15 17:09:50 -0700251 ":linux_k8": psimd_deps + x86_deps,
252 ":linux_aarch64": psimd_deps + aarch64_deps,
253 ":linux_armhf": psimd_deps + aarch32_deps,
254 ":macos_x86_64": psimd_deps + x86_deps,
Marat Dukhan10a38082020-04-17 03:58:35 -0700255 ":windows_x86_64_clang": psimd_deps + x86_deps,
256 ":windows_x86_64_mingw": psimd_deps + x86_deps,
257 ":windows_x86_64_msys": psimd_deps + x86_deps,
258 ":windows_x86_64": x86_deps,
Marat Dukhan500b8892020-04-15 17:09:50 -0700259 ":android_armv7": psimd_deps + aarch32_deps,
260 ":android_arm64": psimd_deps + aarch64_deps,
261 ":android_x86": psimd_deps + x86_deps,
262 ":android_x86_64": psimd_deps + x86_deps,
263 ":ios_armv7": psimd_deps + aarch32_deps,
264 ":ios_arm64": psimd_deps + aarch64_deps,
265 ":ios_arm64e": psimd_deps + aarch64_deps,
266 ":ios_x86": psimd_deps + x86_deps,
267 ":ios_x86_64": psimd_deps + x86_deps,
268 ":watchos_armv7k": psimd_deps + aarch32_deps,
269 ":watchos_arm64_32": psimd_deps + aarch64_deps,
270 ":watchos_x86": psimd_deps + x86_deps,
271 ":watchos_x86_64": psimd_deps + x86_deps,
272 ":tvos_arm64": psimd_deps + aarch64_deps,
273 ":tvos_x86_64": psimd_deps + x86_deps,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700274 ":emscripten_wasm": wasm_deps,
Marat Dukhan500b8892020-04-15 17:09:50 -0700275 ":emscripten_wasmsimd": psimd_deps + wasmsimd_deps,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700276 ":emscripten_asmjs": [],
277 }),
278 )
279
Marat Dukhan10a38082020-04-17 03:58:35 -0700280def xnnpack_unit_test(name, srcs, copts = [], mingw_copts = [], msys_copts = [], deps = []):
Marat Dukhan08c4a432019-10-03 09:29:21 -0700281 """Unit test binary based on Google Test.
282
283 Args:
284 name: The name of the test target to define.
285 srcs: The list of source and header files.
286 copts: The list of additional compiler flags for the target. -I flags
287 for include/ and src/ directories of XNNPACK are always prepended
288 before these user-specified flags.
Marat Dukhan10a38082020-04-17 03:58:35 -0700289 mingw_copts: The list of compiler flags to use with MinGW GCC compilers.
290 msys_copts: The list of compiler flags to use with MSYS (Cygwin) GCC compilers.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700291 deps: The list of additional libraries to be linked. Google Test library
292 (with main() function) is always added as a dependency and does not
293 need to be explicitly specified.
294 """
295
296 native.cc_test(
297 name = name,
298 srcs = srcs,
299 copts = xnnpack_std_cxxopts() + [
300 "-Iinclude",
301 "-Isrc",
Marat Dukhan10a38082020-04-17 03:58:35 -0700302 ] + copts + select({
303 ":windows_x86_64_mingw": mingw_copts,
304 ":windows_x86_64_msys": msys_copts,
305 "//conditions:default": [],
306 }),
Marat Dukhan08c4a432019-10-03 09:29:21 -0700307 linkopts = select({
308 ":emscripten": xnnpack_emscripten_test_linkopts(),
309 "//conditions:default": [],
310 }),
311 linkstatic = True,
312 deps = [
313 "@com_google_googletest//:gtest_main",
314 ] + deps + select({
315 ":emscripten": xnnpack_emscripten_deps(),
316 "//conditions:default": [],
317 }),
318 )
319
320def xnnpack_binary(name, srcs, copts = [], deps = []):
321 """Minimal binary
322
323 Args:
324 name: The name of the binary target to define.
325 srcs: The list of source and header files.
326 copts: The list of additional compiler flags for the target. -I flags
327 for include/ and src/ directories of XNNPACK are always prepended
328 before these user-specified flags.
329 deps: The list of libraries to be linked.
330 """
331 native.cc_binary(
332 name = name,
333 srcs = srcs,
334 copts = [
335 "-Iinclude",
336 "-Isrc",
337 ] + copts,
338 linkopts = select({
339 ":emscripten": xnnpack_emscripten_minimal_linkopts(),
340 "//conditions:default": [],
341 }),
342 linkstatic = True,
343 deps = deps,
344 )
345
Marat Dukhan8ea0b072020-04-23 16:12:18 -0700346def xnnpack_benchmark(name, srcs, copts = [], gcc_copts = [], msvc_copts = [], deps = [], tags = []):
Marat Dukhan08c4a432019-10-03 09:29:21 -0700347 """Microbenchmark binary based on Google Benchmark
348
349 Args:
350 name: The name of the binary target to define.
351 srcs: The list of source and header files.
352 copts: The list of additional compiler flags for the target. -I flags
353 for include/ and src/ directories of XNNPACK are always prepended
354 before these user-specified flags.
Marat Dukhan10a38082020-04-17 03:58:35 -0700355 gcc_copts: The list of compiler flags to use with GCC-like compilers.
356 msvc_copts: The list of compiler flags to use with MSVC compiler.
Marat Dukhan08c4a432019-10-03 09:29:21 -0700357 deps: The list of additional libraries to be linked. Google Benchmark
358 library is always added as a dependency and does not need to be
359 explicitly specified.
360 """
361 native.cc_binary(
362 name = name,
363 srcs = srcs,
364 copts = xnnpack_std_cxxopts() + [
365 "-Iinclude",
366 "-Isrc",
Marat Dukhan10a38082020-04-17 03:58:35 -0700367 ] + copts + select({
368 ":windows_x86_64_clang": ["/clang:" + opt for opt in gcc_copts],
369 ":windows_x86_64_mingw": gcc_copts,
370 ":windows_x86_64_msys": gcc_copts,
371 ":windows_x86_64": msvc_copts,
372 "//conditions:default": gcc_copts,
373 }),
Marat Dukhan08c4a432019-10-03 09:29:21 -0700374 linkopts = select({
375 ":emscripten": xnnpack_emscripten_benchmark_linkopts(),
Marat Dukhan10a38082020-04-17 03:58:35 -0700376 ":windows_x86_64_mingw": ["-lshlwapi"],
377 ":windows_x86_64_msys": ["-lshlwapi"],
Marat Dukhan08c4a432019-10-03 09:29:21 -0700378 "//conditions:default": [],
379 }),
380 linkstatic = True,
381 deps = [
382 "@com_google_benchmark//:benchmark",
383 ] + deps + select({
384 ":emscripten": xnnpack_emscripten_deps(),
385 "//conditions:default": [],
386 }),
Marat Dukhan8ea0b072020-04-23 16:12:18 -0700387 tags = tags,
Marat Dukhan08c4a432019-10-03 09:29:21 -0700388 )