Files

103 lines
3.3 KiB
Plaintext
Raw Permalink Normal View History

2025-02-12 09:54:05 -05:00
template("xOS_static_library") {
assert(defined(invoker.sources),
"Need sources in $target_name to build static library")
lib_name = target_name
lib_build_name = lib_name + "_build"
lib_include_config_name = lib_name + "_include_config"
compiled_lib_output_name_base = "$root_out_dir/tmp/libs/"
compiled_lib_output_name = compiled_lib_output_name_base + lib_name
final_lib_output_name = "$root_out_dir/base/libs/" + lib_name + ".a"
building_deplib_bulders_list = []
linking_deplib_bulders_list = []
linking_deplib_list = []
includes = []
if (defined(invoker.include_dirs)) {
includes = invoker.include_dirs
}
if (defined(invoker.deplibs)) {
foreach(i, invoker.deplibs) {
fullname = "//libs/" + i + ":" + i
# To speed up compilation we have separate deps for builing and linking stages.
# The only library which is required to be a dependancy for building stage is libfreetype,
# since its header files might not be available initially (they are archived).
if (i == "libfreetype") {
building_deplib_bulders_list += [ fullname + "_build" ]
}
linking_deplib_bulders_list += [ fullname + "_build" ]
linking_deplib_list += [ compiled_lib_output_name_base +
get_label_info(fullname, "name") + ".a" ]
includes += [ "//libs/" + i + "/include" ]
# Also adding libc includes.
# Note to add libc after libcxx.
if (i == "libcxx") {
includes += [ "//libs/libc/include" ]
}
# LibAPI is a lightweight library to use shared headers with API between libs and apps.
if (i == "libui") {
includes += [ "//libs/libapi/include" ]
}
}
}
includes += [ "//libs/" + lib_name + "/include" ]
# The output library is passed at the end.
linking_deplib_list += [ compiled_lib_output_name + ".a" ]
linking_deplib_bulders_list += [ "//libs/" + lib_name + ":" + lib_build_name ]
# Use a strange __EMPTY_PATH_, empty string can't be passed as an arg.
path_to_bins = "__EMPTY_PATH_"
if (host == "llvm") {
path_to_bins = llvm_bin_path
}
script_args = [
"$target_arch",
"$host",
"$path_to_bins",
rebase_path("$final_lib_output_name", root_build_dir),
]
foreach(i, linking_deplib_list) {
script_args += [ rebase_path(i, root_build_dir) ]
}
config(lib_include_config_name) {
include_dirs = includes
}
# Create a build rule to compile only a lib with unresolved references from other libs
static_library(lib_build_name) {
output_name = "tmp/libs/" + lib_name
sources = invoker.sources
include_dirs = includes
deps = building_deplib_bulders_list
forward_variables_from(invoker,
[
"configs",
"cflags",
"cflags_c",
"cflags_cc",
"cflags_objc",
"cflags_objcc",
"asmflags",
"deps",
"public_deps",
])
}
action(lib_name) {
script = "//build/libs/merge_libs.py"
inputs = linking_deplib_list
outputs = [ "$final_lib_output_name" ]
deps = linking_deplib_bulders_list
args = script_args
}
}