Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redesign JNI library rules #19

Merged
merged 1 commit into from
Oct 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 23 additions & 24 deletions docs/rules.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@



<a id="#java_native_headers"></a>
<a id="#jni_headers"></a>

## java_native_headers
## jni_headers

<pre>
java_native_headers(<a href="#java_native_headers-name">name</a>, <a href="#java_native_headers-lib">lib</a>)
jni_headers(<a href="#jni_headers-name">name</a>, <a href="#jni_headers-lib">lib</a>)
</pre>


Expand All @@ -31,14 +31,14 @@ This rule also directly exports the JNI header, which can be included via:
*Example:*

```starlark
load("@fmeum_rules_jni//jni:defs.bzl", "java_native_headers")
load("@fmeum_rules_jni//jni:defs.bzl", "jni_headers")

java_library(
name = "os_utils",
...
)

java_native_headers(
jni_headers(
name = "os_utils_hdrs",
lib = ":os_utils",
)
Expand All @@ -56,16 +56,16 @@ cc_library(

| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="java_native_headers-name"></a>name | A unique name for this target. | <a href="https://bazel.build/docs/build-ref.html#name">Name</a> | required | |
| <a id="java_native_headers-lib"></a>lib | The Java library for which native header files should be generated. | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | required | |
| <a id="jni_headers-name"></a>name | A unique name for this target. | <a href="https://bazel.build/docs/build-ref.html#name">Name</a> | required | |
| <a id="jni_headers-lib"></a>lib | The Java library for which native header files should be generated. | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | required | |


<a id="#java_library_with_native"></a>
<a id="#cc_jni_library"></a>

## java_library_with_native
## cc_jni_library

<pre>
java_library_with_native(<a href="#java_library_with_native-name">name</a>, <a href="#java_library_with_native-native_libs">native_libs</a>, <a href="#java_library_with_native-tags">tags</a>, <a href="#java_library_with_native-visibility">visibility</a>, <a href="#java_library_with_native-java_library_args">java_library_args</a>)
cc_jni_library(<a href="#cc_jni_library-name">name</a>, <a href="#cc_jni_library-platforms">platforms</a>, <a href="#cc_jni_library-tags">tags</a>, <a href="#cc_jni_library-visibility">visibility</a>, <a href="#cc_jni_library-cc_binary_args">cc_binary_args</a>)
</pre>


Expand All @@ -75,19 +75,19 @@ java_library_with_native(<a href="#java_library_with_native-name">name</a>, <a h

| Name | Description | Default Value |
| :------------- | :------------- | :------------- |
| <a id="java_library_with_native-name"></a>name | <p align="center"> - </p> | none |
| <a id="java_library_with_native-native_libs"></a>native_libs | <p align="center"> - </p> | <code>None</code> |
| <a id="java_library_with_native-tags"></a>tags | <p align="center"> - </p> | <code>None</code> |
| <a id="java_library_with_native-visibility"></a>visibility | <p align="center"> - </p> | <code>None</code> |
| <a id="java_library_with_native-java_library_args"></a>java_library_args | <p align="center"> - </p> | none |
| <a id="cc_jni_library-name"></a>name | <p align="center"> - </p> | none |
| <a id="cc_jni_library-platforms"></a>platforms | <p align="center"> - </p> | <code>None</code> |
| <a id="cc_jni_library-tags"></a>tags | <p align="center"> - </p> | <code>None</code> |
| <a id="cc_jni_library-visibility"></a>visibility | <p align="center"> - </p> | <code>None</code> |
| <a id="cc_jni_library-cc_binary_args"></a>cc_binary_args | <p align="center"> - </p> | none |


<a id="#java_native_library"></a>
<a id="#java_jni_library"></a>

## java_native_library
## java_jni_library

<pre>
java_native_library(<a href="#java_native_library-name">name</a>, <a href="#java_native_library-java_lib">java_lib</a>, <a href="#java_native_library-platforms">platforms</a>, <a href="#java_native_library-tags">tags</a>, <a href="#java_native_library-visibility">visibility</a>, <a href="#java_native_library-cc_binary_args">cc_binary_args</a>)
java_jni_library(<a href="#java_jni_library-name">name</a>, <a href="#java_jni_library-native_libs">native_libs</a>, <a href="#java_jni_library-tags">tags</a>, <a href="#java_jni_library-visibility">visibility</a>, <a href="#java_jni_library-java_library_args">java_library_args</a>)
</pre>


Expand All @@ -97,11 +97,10 @@ java_native_library(<a href="#java_native_library-name">name</a>, <a href="#java

| Name | Description | Default Value |
| :------------- | :------------- | :------------- |
| <a id="java_native_library-name"></a>name | <p align="center"> - </p> | none |
| <a id="java_native_library-java_lib"></a>java_lib | <p align="center"> - </p> | <code>None</code> |
| <a id="java_native_library-platforms"></a>platforms | <p align="center"> - </p> | <code>None</code> |
| <a id="java_native_library-tags"></a>tags | <p align="center"> - </p> | <code>None</code> |
| <a id="java_native_library-visibility"></a>visibility | <p align="center"> - </p> | <code>None</code> |
| <a id="java_native_library-cc_binary_args"></a>cc_binary_args | <p align="center"> - </p> | none |
| <a id="java_jni_library-name"></a>name | <p align="center"> - </p> | none |
| <a id="java_jni_library-native_libs"></a>native_libs | <p align="center"> - </p> | <code>None</code> |
| <a id="java_jni_library-tags"></a>tags | <p align="center"> - </p> | <code>None</code> |
| <a id="java_jni_library-visibility"></a>visibility | <p align="center"> - </p> | <code>None</code> |
| <a id="java_jni_library-java_library_args"></a>java_library_args | <p align="center"> - </p> | none |


12 changes: 6 additions & 6 deletions jni/defs.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,10 @@
# See the License for the specific language governing permissions and
# limitations under the License.

load("//jni/internal:java_library_with_native.bzl", _java_library_with_native = "java_library_with_native")
load("//jni/internal:java_native_headers.bzl", _java_native_headers = "java_native_headers")
load("//jni/internal:java_native_library.bzl", _java_native_library = "java_native_library")
load("//jni/internal:java_jni_library.bzl", _java_jni_library = "java_jni_library")
load("//jni/internal:jni_headers.bzl", _jni_headers = "jni_headers")
load("//jni/internal:cc_jni_library.bzl", _cc_jni_library = "cc_jni_library")

java_library_with_native = _java_library_with_native
java_native_headers = _java_native_headers
java_native_library = _java_native_library
java_jni_library = _java_jni_library
jni_headers = _jni_headers
cc_jni_library = _cc_jni_library
1 change: 0 additions & 1 deletion jni/internal/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ cc_library(
"@platforms//os:windows": ["windows"],
"//conditions:default": ["unix"],
}),
visibility = ["//jni:__pkg__"],
)

copy_file(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.

load(":common.bzl", "original_java_library_label")
load(":java_native_headers.bzl", "java_native_headers")
load(":jni_headers.bzl", "jni_headers")
load(":os_cpu_utils.bzl", "SELECT_TARGET_CPU", "SELECT_TARGET_OS")
load(":transitions.bzl", "multi_platform_transition")

SinglePlatformArtifactInfo = provider(
fields = ["cpu", "file", "os", "platform"],
Expand Down Expand Up @@ -62,35 +62,6 @@ _single_platform_artifact = rule(
provides = [SinglePlatformArtifactInfo],
)

_COMMAND_LINE_OPTION_PLATFORMS = "//command_line_option:platforms"
_SETTING_PRE_TRANSITION_PLATFORMS = "@fmeum_rules_jni//jni/internal:pre_transition_platforms"

def _multi_platform_transition_impl(settings, attrs):
if not attrs.platforms:
return {
_COMMAND_LINE_OPTION_PLATFORMS: settings[_COMMAND_LINE_OPTION_PLATFORMS],
_SETTING_PRE_TRANSITION_PLATFORMS: settings[_SETTING_PRE_TRANSITION_PLATFORMS],
}
return [
{
_COMMAND_LINE_OPTION_PLATFORMS: [target_platform],
_SETTING_PRE_TRANSITION_PLATFORMS: [str(label) for label in settings[_COMMAND_LINE_OPTION_PLATFORMS]],
}
for target_platform in attrs.platforms
]

_multi_platform_transition = transition(
implementation = _multi_platform_transition_impl,
inputs = [
_COMMAND_LINE_OPTION_PLATFORMS,
_SETTING_PRE_TRANSITION_PLATFORMS,
],
outputs = [
_COMMAND_LINE_OPTION_PLATFORMS,
_SETTING_PRE_TRANSITION_PLATFORMS,
],
)

_CONFLICTING_PLATFORMS_MESSAGE = """'{identifier}' is produced by multiple platforms:
{platform1}
{platform2}
Expand Down Expand Up @@ -131,7 +102,7 @@ _multi_platform_artifact = rule(
implementation = _multi_platform_artifact_impl,
attrs = {
"artifact": attr.label(
cfg = _multi_platform_transition,
cfg = multi_platform_transition,
mandatory = True,
providers = [SinglePlatformArtifactInfo],
),
Expand All @@ -145,51 +116,6 @@ _multi_platform_artifact = rule(
},
)

def _reset_platforms_transition_impl(settings, attrs):
if settings[_SETTING_PRE_TRANSITION_PLATFORMS]:
return {
_SETTING_PRE_TRANSITION_PLATFORMS: [],
_COMMAND_LINE_OPTION_PLATFORMS: settings[_SETTING_PRE_TRANSITION_PLATFORMS],
}
else:
return {
_SETTING_PRE_TRANSITION_PLATFORMS: settings[_SETTING_PRE_TRANSITION_PLATFORMS],
_COMMAND_LINE_OPTION_PLATFORMS: settings[_COMMAND_LINE_OPTION_PLATFORMS],
}

_reset_platforms_transition = transition(
implementation = _reset_platforms_transition_impl,
inputs = [
_COMMAND_LINE_OPTION_PLATFORMS,
_SETTING_PRE_TRANSITION_PLATFORMS,
],
outputs = [
_COMMAND_LINE_OPTION_PLATFORMS,
_SETTING_PRE_TRANSITION_PLATFORMS,
],
)

def _reset_platforms_impl(ctx):
return [
ctx.attr.target[0][DefaultInfo],
ctx.attr.target[0][CcInfo],
]

_reset_platforms = rule(
implementation = _reset_platforms_impl,
attrs = {
"target": attr.label(
cfg = _reset_platforms_transition,
mandatory = True,
providers = [CcInfo],
),
"_allowlist_function_transition": attr.label(
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
),
},
provides = [CcInfo],
)

def _maven_resource_prefix_if_present():
# The equivalent for src/*/native of:
# https://github.com/bazelbuild/bazel/blob/fad21dae0b01d5f9b2274542c89f4c8163c2ff36/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java#L652
Expand All @@ -199,40 +125,20 @@ def _maven_resource_prefix_if_present():
return "/".join(segments[:i + 3])
return None

def java_native_library(
def cc_jni_library(
name,
java_lib = None,
platforms = None,
tags = None,
visibility = None,
**cc_binary_args):
if java_lib:
headers_internal_name = "%s_headers_orig_" % name
headers_name = "%s_headers" % name
java_native_headers(
name = headers_internal_name,
lib = original_java_library_label(java_lib),
tags = ["manual"],
visibility = ["//visibility:private"],
)
_reset_platforms(
name = headers_name,
tags = ["manual"],
target = ":" + headers_internal_name,
visibility = visibility,
)

macos_library_name = "lib%s.dylib" % name
unix_library_name = "lib%s.so" % name
windows_library_name = "%s.dll" % name

cc_binary_args.setdefault("deps", [])

# Simple concatenation is compatible with select, append is not.
if java_lib:
cc_binary_args["deps"] += [":" + headers_name]
else:
cc_binary_args["deps"] += ["@fmeum_rules_jni//jni"]
cc_binary_args["deps"] += ["@fmeum_rules_jni//jni"]

native.cc_binary(
name = macos_library_name,
Expand Down
58 changes: 0 additions & 58 deletions jni/internal/common.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -54,64 +54,6 @@ merge_java_infos = rule(
provides = [JavaInfo],
)

def _parse_same_repo_label(label, current_pkg):
if label.startswith("//"):
pkg_end = label.find(":")
if pkg_end != -1:
pkg = label[len("//"):pkg_end]
name = label[pkg_end + len(":"):]
else:
pkg = label[len("//"):]
name = pkg.split("/")[-1]
else:
pkg = current_pkg
name = label.lstrip(":")

return pkg, name

def parse_label(label, current_repo, current_pkg):
if label.startswith("@"):
repo_end = label.find("//")
if repo_end != -1:
repo = label[len("@"):repo_end]
remainder = label[repo_end:]
else:
repo = label[len("@"):]
remainder = "//:" + repo
else:
repo = current_repo
remainder = label

pkg, name = _parse_same_repo_label(remainder, current_pkg)
return struct(
repo = repo,
pkg = pkg,
name = name,
)

def _stringify_label(label_struct):
return "@{repo}//{pkg}:{name}".format(
repo = label_struct.repo,
pkg = label_struct.pkg,
name = label_struct.name,
)

def original_java_library_name(name):
# TODO: Use java_common.stamp_jar to set the correct Target-Label attribute in the manifest.
return "%s_remove_this_part_" % name

def original_java_library_label(label_string):
label_struct = parse_label(
label_string,
current_repo = native.repository_name().lstrip("@"),
current_pkg = native.package_name(),
)
return _stringify_label(struct(
repo = label_struct.repo,
pkg = label_struct.pkg,
name = original_java_library_name(label_struct.name),
))

def make_root_relative(path, package = None):
segments = []
if native.repository_name() != "@":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,17 @@
# See the License for the specific language governing permissions and
# limitations under the License.

load(":common.bzl", "merge_java_infos", "original_java_library_name")
load(":common.bzl", "merge_java_infos")
load(":jni_headers.bzl", "jni_headers")

def java_library_with_native(
def java_jni_library(
name,
native_libs = None,
tags = None,
visibility = None,
**java_library_args):
original_name = original_java_library_name(name)
original_name = "%s_remove_this_part_" % name
headers_name = "%s.hdrs" % name

# Simple concatenation is compatible with select, append is not.
java_library_args.setdefault("deps", [])
Expand All @@ -29,10 +31,17 @@ def java_library_with_native(
native.java_library(
name = original_name,
tags = ["manual"],
visibility = visibility,
visibility = ["//visibility:private"],
**java_library_args
)

jni_headers(
name = headers_name,
lib = ":" + original_name,
tags = ["manual"],
visibility = visibility,
)

merge_java_infos(
name = name,
libs = [
Expand Down
Loading