314 lines
11 KiB
Python
314 lines
11 KiB
Python
"""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": [],
|
|
}),
|
|
)
|