| """Build definitions and rules for XNNPACK.""" |
| |
| load(":emscripten.bzl", "xnnpack_emscripten_benchmark_linkopts", "xnnpack_emscripten_deps", "xnnpack_emscripten_minimal_linkopts", "xnnpack_emscripten_test_linkopts") |
| |
| def xnnpack_visibility(): |
| """Visibility of :XNNPACK target. |
| |
| All other targets have private visibility, and can not have external |
| dependencies. |
| """ |
| return ["//visibility:public"] |
| |
| def xnnpack_min_size_copts(): |
| """Compiler flags for size-optimized builds.""" |
| return ["-Os"] |
| |
| def xnnpack_std_copts(): |
| """Compiler flags to specify language standard for C sources.""" |
| return ["-std=c99"] |
| |
| def xnnpack_std_cxxopts(): |
| """Compiler flags to specify language standard for C++ sources.""" |
| return ["-std=gnu++11"] |
| |
| def xnnpack_optional_ruy_copts(): |
| """Compiler flags to optionally enable Ruy benchmarks.""" |
| return [] |
| |
| def xnnpack_optional_gemmlowp_copts(): |
| """Compiler flags to optionally enable Gemmlowp benchmarks.""" |
| return [] |
| |
| def xnnpack_optional_tflite_copts(): |
| """Compiler flags to optionally enable TensorFlow Lite benchmarks.""" |
| return [] |
| |
| def xnnpack_optional_armcl_copts(): |
| """Compiler flags to optionally enable ARM ComputeLibrary benchmarks.""" |
| return [] |
| |
| def xnnpack_optional_ruy_deps(): |
| """Optional Ruy dependencies.""" |
| return [] |
| |
| def xnnpack_optional_gemmlowp_deps(): |
| """Optional Gemmlowp dependencies.""" |
| return [] |
| |
| def xnnpack_optional_tflite_deps(): |
| """Optional TensorFlow Lite dependencies.""" |
| return [] |
| |
| def xnnpack_optional_armcl_deps(): |
| """Optional ARM ComputeLibrary dependencies.""" |
| return [] |
| |
| def xnnpack_cc_library( |
| name, |
| srcs = [], |
| x86_srcs = [], |
| aarch32_srcs = [], |
| aarch64_srcs = [], |
| asmjs_srcs = [], |
| wasm_srcs = [], |
| wasmsimd_srcs = [], |
| copts = [], |
| x86_copts = [], |
| aarch32_copts = [], |
| aarch64_copts = [], |
| asmjs_copts = [], |
| wasm_copts = [], |
| wasmsimd_copts = [], |
| optimized_copts = ["-O2"], |
| hdrs = [], |
| deps = []): |
| """C/C++/assembly library with architecture-specific configuration. |
| |
| Define a static library with architecture- and instruction-specific |
| source files and/or compiler flags. |
| |
| Args: |
| name: The name of the library target to define. |
| srcs: The list of architecture-independent source files. |
| x86_srcs: The list of x86-specific source files. |
| aarch32_srcs: The list of AArch32-specific source files. |
| aarch64_srcs: The list of AArch64-specific source files. |
| asmjs_srcs: The list of Asm.js-specific source files. |
| wasm_srcs: The list of WebAssembly/MVP-specific source files. |
| wasmsimd_srcs: The list of WebAssembly/SIMD-specific source files. |
| copts: The list of compiler flags to use in all builds. -I flags for |
| include/ and src/ directories of XNNPACK are always prepended |
| before these user-specified flags. |
| x86_copts: The list of compiler flags to use in x86 builds. |
| aarch32_copts: The list of compiler flags to use in AArch32 builds. |
| aarch64_copts: The list of compiler flags to use in AArch64 builds. |
| asmjs_copts: The list of compiler flags to use in Asm.js builds. |
| wasm_copts: The list of compiler flags to use in WebAssembly/MVP builds. |
| wasmsimd_copts: The list of compiler flags to use in WebAssembly/SIMD |
| builds. |
| optimized_copts: The list of compiler flags to use in optimized builds. |
| Defaults to -O2. |
| hdrs: The list of header files published by this library to be textually |
| included by sources in dependent rules. |
| deps: The list of other libraries to be linked. |
| """ |
| native.cc_library( |
| name = name, |
| srcs = srcs + select({ |
| ":linux_k8": x86_srcs, |
| ":linux_aarch64": aarch64_srcs, |
| ":macos_x86_64": x86_srcs, |
| ":android_armv7": aarch32_srcs, |
| ":android_arm64": aarch64_srcs, |
| ":android_x86": x86_srcs, |
| ":android_x86_64": x86_srcs, |
| ":ios_armv7": aarch32_srcs, |
| ":ios_arm64": aarch64_srcs, |
| ":ios_arm64e": aarch64_srcs, |
| ":ios_x86": x86_srcs, |
| ":ios_x86_64": x86_srcs, |
| ":watchos_armv7k": aarch32_srcs, |
| ":watchos_arm64_32": aarch64_srcs, |
| ":watchos_x86": x86_srcs, |
| ":watchos_x86_64": x86_srcs, |
| ":tvos_arm64": aarch64_srcs, |
| ":tvos_x86_64": x86_srcs, |
| ":emscripten_asmjs": asmjs_srcs, |
| ":emscripten_wasm": wasm_srcs, |
| ":emscripten_wasmsimd": wasmsimd_srcs, |
| "//conditions:default": [], |
| }), |
| copts = [ |
| "-Iinclude", |
| "-Isrc", |
| ] + copts + select({ |
| ":linux_k8": x86_copts, |
| ":linux_aarch64": aarch64_copts, |
| ":macos_x86_64": x86_copts, |
| ":android_armv7": aarch32_copts, |
| ":android_arm64": aarch64_copts, |
| ":android_x86": x86_copts, |
| ":android_x86_64": x86_copts, |
| ":ios_armv7": aarch32_copts, |
| ":ios_arm64": aarch64_copts, |
| ":ios_arm64e": aarch64_copts, |
| ":ios_x86": x86_copts, |
| ":ios_x86_64": x86_copts, |
| ":watchos_armv7k": aarch32_copts, |
| ":watchos_arm64_32": aarch64_copts, |
| ":watchos_x86": x86_copts, |
| ":watchos_x86_64": x86_copts, |
| ":tvos_arm64": aarch64_copts, |
| ":tvos_x86_64": x86_copts, |
| ":emscripten_asmjs": asmjs_copts, |
| ":emscripten_wasm": wasm_copts, |
| ":emscripten_wasmsimd": wasmsimd_copts, |
| "//conditions:default": [], |
| }) + select({ |
| ":optimized_build": optimized_copts, |
| "//conditions:default": [], |
| }), |
| includes = ["include", "src"], |
| linkstatic = True, |
| linkopts = select({ |
| ":linux_k8": ["-lpthread"], |
| ":linux_aarch64": ["-lpthread"], |
| ":android": ["-lm"], |
| "//conditions:default": [], |
| }), |
| textual_hdrs = hdrs, |
| deps = deps, |
| ) |
| |
| def xnnpack_aggregate_library( |
| name, |
| generic_deps = [], |
| x86_deps = [], |
| aarch32_deps = [], |
| aarch64_deps = [], |
| wasm_deps = [], |
| wasmsimd_deps = []): |
| """Static library that aggregates architecture-specific dependencies. |
| |
| Args: |
| name: The name of the library target to define. |
| generic_deps: The list of libraries to link on all architectures. |
| x86_deps: The list of libraries to link in x86 and x86-64 builds. |
| aarch32_deps: The list of libraries to link in AArch32 builds. |
| aarch64_deps: The list of libraries to link in AArch32 builds. |
| wasm_deps: The list of libraries to link in WebAssembly (MVP) builds. |
| wasmsimd_deps: The list of libraries to link in WebAssembly SIMD builds. |
| """ |
| |
| native.cc_library( |
| name = name, |
| linkstatic = True, |
| deps = generic_deps + select({ |
| ":linux_k8": x86_deps, |
| ":linux_aarch64": aarch64_deps, |
| ":macos_x86_64": x86_deps, |
| ":android_armv7": aarch32_deps, |
| ":android_arm64": aarch64_deps, |
| ":android_x86": x86_deps, |
| ":android_x86_64": x86_deps, |
| ":ios_armv7": aarch32_deps, |
| ":ios_arm64": aarch64_deps, |
| ":ios_arm64e": aarch64_deps, |
| ":ios_x86": x86_deps, |
| ":ios_x86_64": x86_deps, |
| ":watchos_armv7k": aarch32_deps, |
| ":watchos_arm64_32": aarch64_deps, |
| ":watchos_x86": x86_deps, |
| ":watchos_x86_64": x86_deps, |
| ":tvos_arm64": aarch64_deps, |
| ":tvos_x86_64": x86_deps, |
| ":emscripten_wasm": wasm_deps, |
| ":emscripten_wasmsimd": wasmsimd_deps, |
| ":emscripten_asmjs": [], |
| }), |
| ) |
| |
| def xnnpack_unit_test(name, srcs, copts = [], deps = []): |
| """Unit test binary based on Google Test. |
| |
| Args: |
| name: The name of the test target to define. |
| srcs: The list of source and header files. |
| copts: The list of additional compiler flags for the target. -I flags |
| for include/ and src/ directories of XNNPACK are always prepended |
| before these user-specified flags. |
| deps: The list of additional libraries to be linked. Google Test library |
| (with main() function) is always added as a dependency and does not |
| need to be explicitly specified. |
| """ |
| |
| native.cc_test( |
| name = name, |
| srcs = srcs, |
| copts = xnnpack_std_cxxopts() + [ |
| "-Iinclude", |
| "-Isrc", |
| ] + copts, |
| linkopts = select({ |
| ":emscripten": xnnpack_emscripten_test_linkopts(), |
| "//conditions:default": [], |
| }), |
| linkstatic = True, |
| deps = [ |
| "@com_google_googletest//:gtest_main", |
| ] + deps + select({ |
| ":emscripten": xnnpack_emscripten_deps(), |
| "//conditions:default": [], |
| }), |
| ) |
| |
| def xnnpack_binary(name, srcs, copts = [], deps = []): |
| """Minimal binary |
| |
| Args: |
| name: The name of the binary target to define. |
| srcs: The list of source and header files. |
| copts: The list of additional compiler flags for the target. -I flags |
| for include/ and src/ directories of XNNPACK are always prepended |
| before these user-specified flags. |
| deps: The list of libraries to be linked. |
| """ |
| native.cc_binary( |
| name = name, |
| srcs = srcs, |
| copts = [ |
| "-Iinclude", |
| "-Isrc", |
| ] + copts, |
| linkopts = select({ |
| ":emscripten": xnnpack_emscripten_minimal_linkopts(), |
| "//conditions:default": [], |
| }), |
| linkstatic = True, |
| deps = deps, |
| ) |
| |
| def xnnpack_benchmark(name, srcs, copts = [], deps = []): |
| """Microbenchmark binary based on Google Benchmark |
| |
| Args: |
| name: The name of the binary target to define. |
| srcs: The list of source and header files. |
| copts: The list of additional compiler flags for the target. -I flags |
| for include/ and src/ directories of XNNPACK are always prepended |
| before these user-specified flags. |
| deps: The list of additional libraries to be linked. Google Benchmark |
| library is always added as a dependency and does not need to be |
| explicitly specified. |
| """ |
| native.cc_binary( |
| name = name, |
| srcs = srcs, |
| copts = xnnpack_std_cxxopts() + [ |
| "-Iinclude", |
| "-Isrc", |
| ] + copts, |
| linkopts = select({ |
| ":emscripten": xnnpack_emscripten_benchmark_linkopts(), |
| "//conditions:default": [], |
| }), |
| linkstatic = True, |
| deps = [ |
| "@com_google_benchmark//:benchmark", |
| ] + deps + select({ |
| ":emscripten": xnnpack_emscripten_deps(), |
| "//conditions:default": [], |
| }), |
| ) |