You've already forked ComputeLibrary
217 lines
7.1 KiB
Python
Executable File
217 lines
7.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# Copyright (c) 2023-2025 Arm Limited.
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
# of this software and associated documentation files (the "Software"), to
|
|
# deal in the Software without restriction, including without limitation the
|
|
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
# sell copies of the Software, and to permit persons to whom the Software is
|
|
# furnished to do so, subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be included in all
|
|
# copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
# SOFTWARE.
|
|
|
|
import argparse
|
|
import os
|
|
from jinja2 import Template
|
|
import datetime
|
|
|
|
# Paths to exclude
|
|
excluded_paths = ["build",
|
|
"docs/",
|
|
"documentation/",
|
|
"examples/",
|
|
"opencl-1.2-stubs/",
|
|
"release_repository/",
|
|
"opengles-3.1-stubs/",
|
|
"scripts/",
|
|
"tests/",
|
|
"/GLES_COMPUTE/",
|
|
"/graph/",
|
|
"/sve/",
|
|
"/SVE/",
|
|
"/sve2/",
|
|
"/SVE2/",
|
|
"/sme/",
|
|
"/sme2/",
|
|
"third_party",
|
|
]
|
|
|
|
excluded_files = ["TracePoint.cpp"]
|
|
|
|
# Android bp template to render
|
|
year = datetime.datetime.now().year
|
|
|
|
bp_tm = Template(
|
|
"""//
|
|
// Copyright © 2020-""" + str(year) + """ Arm Ltd. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
//
|
|
|
|
// OpenCL sources are NOT required by ArmNN or its Android NNAPI driver and are used for CI purposes only.
|
|
opencl_srcs = [
|
|
{% for cl_src in cl_srcs -%}
|
|
"{{ cl_src }}",
|
|
{% endfor %}
|
|
]
|
|
|
|
bootstrap_go_package {
|
|
name: "arm_compute_library_nn_driver",
|
|
pkgPath: "arm_compute_library_nn_driver",
|
|
deps: [
|
|
"blueprint",
|
|
"blueprint-pathtools",
|
|
"blueprint-proptools",
|
|
"soong",
|
|
"soong-android",
|
|
"soong-cc",
|
|
],
|
|
srcs: [
|
|
"scripts/arm_compute_library_nn_driver.go",
|
|
],
|
|
pluginFor: [ "soong_build" ],
|
|
}
|
|
|
|
arm_compute_library_defaults {
|
|
name: "acl-default-cppflags",
|
|
cppflags: [
|
|
"-std=c++14",
|
|
"-fexceptions",
|
|
"-DBOOST_NO_AUTO_PTR",
|
|
"-DEMBEDDED_KERNELS",
|
|
"-DARM_COMPUTE_ASSERTS_ENABLED",
|
|
"-DARM_COMPUTE_CPP_SCHEDULER",
|
|
"-DENABLE_NEON",
|
|
"-DARM_COMPUTE_ENABLE_NEON",
|
|
"-Wno-unused-parameter",
|
|
"-DNO_DOT_IN_TOOLCHAIN",
|
|
"-Wno-implicit-fallthrough"
|
|
],
|
|
// cflags are applied both to C and C++ code
|
|
cflags: [
|
|
"-fPIC"
|
|
],
|
|
rtti: true,
|
|
}
|
|
|
|
cc_library_static {
|
|
name: "arm_compute_library",
|
|
defaults: ["acl-default-cppflags"],
|
|
proprietary: true,
|
|
local_include_dirs: ["build/android-arm64v8a/src/core",
|
|
"build/android-arm64v8a/src/core/CL",
|
|
"src/core/common",
|
|
"src/core/helpers",
|
|
"src/core/NEON/kernels/arm_gemm",
|
|
"src/core/NEON/kernels/assembly",
|
|
"src/core/NEON/kernels/convolution/common",
|
|
"src/core/NEON/kernels/convolution/winograd",
|
|
"src/cpu/kernels/assembly",
|
|
"third_party/kleidiai"],
|
|
export_include_dirs: [".", "./include"],
|
|
srcs: [
|
|
{% for src in srcs -%}
|
|
"{{ src }}",
|
|
{% endfor %}
|
|
"third_party/kleidiai/kai/ukernels/matmul/matmul_clamp_f32_f32_f32p/kai_matmul_clamp_f32_f32_f32p8x1biasf32_6x8x4_neon_mla.c",
|
|
"third_party/kleidiai/kai/ukernels/matmul/pack/kai_rhs_pack_kxn_f32p8x1biasf32_f32_f32_neon.c",
|
|
],
|
|
arch: {
|
|
arm: {
|
|
srcs: [
|
|
{% for arm_src in arm_srcs -%}
|
|
"{{ arm_src }}",
|
|
{% endfor %}
|
|
],
|
|
},
|
|
arm64: {
|
|
srcs: [
|
|
{% for arm64_src in arm64_srcs -%}
|
|
"{{ arm64_src }}",
|
|
{% endfor %}
|
|
],
|
|
},
|
|
},
|
|
rtti: true,
|
|
}
|
|
""")
|
|
|
|
|
|
def generate_bp_file(cpp_files, opencl_files):
|
|
arm_files = [f for f in cpp_files if "a32_" in f]
|
|
arm64_files = [f for f in cpp_files if any(a64 in f for a64 in ["a64_", "sve_", 'sme_', 'sme2_'])]
|
|
gen_files = [x for x in cpp_files if x not in arm_files + arm64_files]
|
|
|
|
arm_files.sort()
|
|
arm64_files.sort()
|
|
gen_files.sort()
|
|
opencl_files.sort()
|
|
|
|
bp_file = bp_tm.render(srcs=gen_files,
|
|
arm_srcs=arm_files,
|
|
arm64_srcs=arm64_files,
|
|
cl_srcs=opencl_files)
|
|
return bp_file
|
|
|
|
|
|
def list_all_files(repo_path):
|
|
""" Gets the list of files to include to the Android.bp
|
|
|
|
:param repo_path: Path of the repository
|
|
:return: The filtered list of useful filess
|
|
"""
|
|
if not repo_path.endswith('/'):
|
|
repo_path = repo_path + "/"
|
|
|
|
# Get cpp files
|
|
cpp_files = []
|
|
cl_files = []
|
|
for path, subdirs, files in os.walk(repo_path):
|
|
for file in files:
|
|
if file.endswith(".cpp"):
|
|
cpp_files.append(os.path.join(path, file))
|
|
elif file.endswith(".cl"):
|
|
cl_files.append(os.path.join(path, file))
|
|
# Include CL headers
|
|
if "src/core/CL/cl_kernels" in path and file.endswith(".h"):
|
|
cl_files.append(os.path.join(path, file))
|
|
# Filter out unused cpp files
|
|
filtered_cpp_files = []
|
|
for cpp_file in cpp_files:
|
|
if any(ep in cpp_file for ep in excluded_paths) or any(ef in cpp_file for ef in excluded_files):
|
|
continue
|
|
filtered_cpp_files.append(cpp_file.replace(repo_path, ""))
|
|
# Filter out unused cl files
|
|
filtered_cl_files = []
|
|
for cl_file in cl_files:
|
|
if any(ep in cl_file for ep in excluded_paths):
|
|
continue
|
|
filtered_cl_files.append(cl_file.replace(repo_path, ""))
|
|
|
|
return filtered_cpp_files, filtered_cl_files
|
|
|
|
|
|
if __name__ == "__main__":
|
|
# Parse arguments
|
|
parser = argparse.ArgumentParser('Generate Android.bp file for ComputeLibrary')
|
|
parser.add_argument('--folder', default=".", metavar="folder", dest='folder', type=str, required=False, help='Compute Library source path')
|
|
parser.add_argument('--output_file', metavar="output_file", default='Android.bp', type=str, required=False, help='Specify Android bp output file')
|
|
args = parser.parse_args()
|
|
|
|
cpp_files, opencl_files = list_all_files(args.folder)
|
|
bp_file = generate_bp_file(cpp_files, opencl_files)
|
|
|
|
with open(args.output_file, 'w') as f:
|
|
f.write(bp_file)
|