Files
cariflex/tools/EVerest-main/modules/module.bzl
Eric F d398a6ced2 Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter
- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
2026-06-08 00:38:27 -04:00

143 lines
4.6 KiB
Python

load("@rules_cc//cc:defs.bzl", "cc_binary")
load("@rules_python//python:defs.bzl", "py_library")
# Rules for building Everest modules
def cc_everest_module(
name,
srcs = [],
deps = [],
impls = [],
data = [],
includes = [],
**cc_binary_kwargs
):
"""
Define C++ Everest module.
Args:
name: Name of the module.
srcs: List of source files, required files such as implemntations of
interfaces and the module main file are automatically included.
deps: List of dependencies. Libraries that are required to build the
module.
impls: List of implementations that the module has. It should match the
content of mainifest.yaml file.
data: List of data files that should be available at runtime.
"""
impl_srcs = []
for impl in impls:
impl_srcs += native.glob(["{}/*.cpp".format(impl), "{}/*.hpp".format(impl)])
module_srcs = [
name + ".cpp",
name + ".hpp",
]
binary = name + "__binary"
manifest = native.glob(["manifest.y*ml"], allow_empty = False)[0]
prefix = native.package_name().removeprefix("modules/")
native.genrule(
name = "ld-ev",
outs = [
"generated/modules/{}/ld-ev.hpp".format(name),
"generated/modules/{}/ld-ev.cpp".format(name),
],
srcs = [
manifest,
"//lib/everest/framework/schemas:schemas",
"//lib/everest/framework:dependencies.yaml",
"@everest-core//types:types",
"@everest-core//:MODULE.bazel",
"@everest-core//interfaces:interfaces",
],
tools = [
"//applications/utils/ev-dev-tools:ev-cli",
],
cmd = """
$(location //applications/utils/ev-dev-tools:ev-cli) module generate-loader \
--work-dir `dirname $(location @everest-core//:MODULE.bazel)` \
--schemas-dir `dirname $(location //lib/everest/framework:dependencies.yaml)`/schemas \
--disable-clang-format \
--output-dir `dirname $(location generated/modules/{module_name}/ld-ev.hpp)`/.. \
{prefix}
""".format(module_name = name, prefix = prefix)
)
cc_binary(
name = binary,
srcs = depset(srcs + impl_srcs + module_srcs + [
":ld-ev",
]).to_list(),
deps = deps + [
"@everest-core//interfaces:interfaces_lib",
"//lib/everest/framework:framework",
],
data = data, # Pass through data files to the binary
copts = ["-std=c++17"],
includes = [
".",
"generated/modules/" + name,
] + includes,
visibility = ["//visibility:public"],
# See https://github.com/HowardHinnant/date/issues/324
local_defines = [
"BUILD_TZ_LIB=ON",
"USE_SYSTEM_TZ_DB=ON",
"USE_OS_TZDB=1",
"USE_AUTOLOAD=0",
"HAS_REMOTE_API=0",
],
**cc_binary_kwargs,
)
native.genrule(
name = "copy_to_subdir",
srcs = [":" + binary, manifest],
outs = [
"{}/manifest.yaml".format(name),
"{}/{}".format(name, name),
],
cmd = "mkdir -p $(RULEDIR)/{} && ".format(name) +
"cp $(location {}) $(RULEDIR)/{}/{} && ".format(binary, name, name) +
"cp $(location {}) $(RULEDIR)/{}/".format(manifest, name),
)
native.filegroup(
name = name,
srcs = [
":copy_to_subdir",
] + data, # Include data files in the filegroup
data = [":" + binary], # Include the binary to get its runfiles
visibility = ["//visibility:public"],
)
def py_everest_module(
name,
deps = [],
interfaces_deps = [],
types_deps = [],
visibility = None):
"""Creates a Python-based Module for EVerest.
Package where this macro is used should contain a directory with the same name as the module.
All Python Files from that folder would be included in the module.
The `manifest.yaml` file from that module would be used as manifest for the module.
"""
py_library(
name = name,
srcs = native.glob(["**/*.py"]),
data = ["manifest.yaml"] + interfaces_deps + types_deps,
deps = deps + ["@everest-core//lib/everest/framework/everestpy/src:framework"],
visibility = ["//visibility:public"],
)
native.filegroup(
name = "{}_bundle".format(name),
srcs = [
":{}".format(name),
"manifest.yaml".format(name)
],
visibility = ["//visibility:public"],
)