Files
2026-07-13 13:17:40 +08:00

196 lines
6.4 KiB
Python

load("@bazel_common//tools/maven:pom_file.bzl", "pom_file")
load("@bazel_skylib//rules:copy_file.bzl", "copy_file")
load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_library_public")
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")
COPTS_TESTS = select({
"//:opt": ["-DBAZEL_OPT"],
"//conditions:default": [],
}) + select({
"@platforms//os:windows": [
# TODO(mehrdadn): (How to) support dynamic linking?
"-DRAY_STATIC",
# Prevent Windows.h from including WinSock.h, which conflicts with
# WinSock2.h used by Boost.Asio.
"-DWIN32_LEAN_AND_MEAN",
],
"//conditions:default": [
"-Wunused-result",
"-Wconversion-null",
"-Wno-misleading-indentation",
"-Wimplicit-fallthrough",
],
}) + select({
"//:clang-cl": [
"-Wno-builtin-macro-redefined", # To get rid of warnings caused by deterministic build macros (e.g. #define __DATE__ "redacted")
"-Wno-microsoft-unqualified-friend", # This shouldn't normally be enabled, but otherwise we get: google/protobuf/map_field.h: warning: unqualified friend declaration referring to type outside of the nearest enclosing namespace is a Microsoft extension; add a nested name specifier (for: friend class DynamicMessage)
],
"//conditions:default": [],
})
COPTS = COPTS_TESTS + select({
"@platforms//os:windows": [""],
"//conditions:default": ["-Wshadow"],
})
PYX_COPTS = select({
"//:msvc-cl": [],
"//conditions:default": [
# Ignore this warning since CPython and Cython have issue removing deprecated tp_print on MacOS
"-Wno-deprecated-declarations",
"-Wno-shadow",
"-Wno-implicit-fallthrough",
],
}) + select({
"@platforms//os:windows": [
"/FI" + "src/shims/windows/python-nondebug.h",
],
"//conditions:default": [],
})
PYX_SRCS = [] + select({
"@platforms//os:windows": [
"src/shims/windows/python-nondebug.h",
],
"//conditions:default": [],
})
def flatbuffer_py_library(name, srcs, outs, out_prefix, includes = [], include_paths = []):
flatbuffer_library_public(
name = name,
srcs = srcs,
outs = outs,
language_flag = "-p",
out_prefix = out_prefix,
include_paths = include_paths,
includes = includes,
)
def define_java_module(
name,
additional_srcs = [],
exclude_srcs = [],
additional_resources = [],
define_test_lib = False,
test_deps = [],
**kwargs):
"""
Defines a ray Java module with a pom file.
Args:
name: The base name of the module.
additional_srcs: Additional source files to include in the module.
exclude_srcs: Source files to exclude from the module.
additional_resources: Additional resources to include in the module.
define_test_lib: Whether to define a test library for the module.
test_deps: Dependencies for the test library; only used if define_test_lib is True.
**kwargs: Additional arguments to pass to the java_library rule.
"""
lib_name = "io_ray_ray_" + name
pom_file_targets = [lib_name]
native.java_library(
name = lib_name,
srcs = additional_srcs + native.glob(
[name + "/src/main/java/**/*.java"],
exclude = exclude_srcs,
),
resources = native.glob([name + "/src/main/resources/**"]) + additional_resources,
**kwargs
)
if define_test_lib:
test_lib_name = "io_ray_ray_" + name + "_test"
pom_file_targets.append(test_lib_name)
native.java_library(
name = test_lib_name,
srcs = native.glob([name + "/src/test/java/**/*.java"]),
deps = test_deps,
)
pom_file(
name = "io_ray_ray_" + name + "_pom",
targets = pom_file_targets,
template_file = name + "/pom_template.xml",
substitutions = {
"{auto_gen_header}": "<!-- This file is auto-generated by Bazel from pom_template.xml, do not modify it. -->",
},
)
def native_java_library(module_name, name, native_library_name):
"""Copy native library file to different path based on operating systems"""
copy_file(
name = name + "_darwin",
src = native_library_name,
out = module_name + "/src/main/resources/native/darwin/lib{}.dylib".format(name),
)
copy_file(
name = name + "_linux",
src = native_library_name,
out = module_name + "/src/main/resources/native/linux/lib{}.so".format(name),
)
native.filegroup(
name = name,
srcs = select({
"@platforms//os:osx": [name + "_darwin"],
"@platforms//os:windows": [],
"//conditions:default": [name + "_linux"],
}),
visibility = ["//visibility:public"],
)
def ray_cc_library(name, strip_include_prefix = "/src", copts = [], visibility = ["//visibility:public"], **kwargs):
cc_library(
name = name,
strip_include_prefix = strip_include_prefix,
copts = COPTS + copts,
visibility = visibility,
**kwargs
)
def ray_cc_test(name, deps = [], linkopts = [], copts = [], use_ray_gtest_main = True, **kwargs):
# By default, all `ray_cc_test` targets use `ray_gtest_main`.
# Some tests might need bespoke setup logic, so let them skip this dependency.
if use_ray_gtest_main:
deps = deps + ["//src/ray/common:ray_gtest_main"]
cc_test(
name = name,
deps = deps,
copts = COPTS_TESTS + copts,
linkopts = linkopts + ["-pie"],
**kwargs
)
def ray_cc_binary(name, linkopts = [], copts = [], **kwargs):
cc_binary(
name = name,
copts = COPTS + copts,
linkopts = linkopts + ["-pie"],
**kwargs
)
def _filter_files_with_suffix_impl(ctx):
suffix = ctx.attr.suffix
filtered_files = [f for f in ctx.files.srcs if f.basename.endswith(suffix)]
print(filtered_files)
return [
DefaultInfo(
files = depset(filtered_files),
),
]
filter_files_with_suffix = rule(
implementation = _filter_files_with_suffix_impl,
attrs = {
"srcs": attr.label_list(allow_files = True),
"suffix": attr.string(),
},
)
# It will be passed to the FlatBuffers compiler when defining flatbuffer_cc_library
FLATC_ARGS = [
"--gen-object-api",
"--gen-mutable",
"--scoped-enums",
]