我已经切换(或正在切换)使用 bazel,尽管我在 Windows 上这样做。我有兴趣从 Java 调用我的 Go 代码,所以我从本教程开始。
我能够使用与他们的 Github 示例相同的代码来完成这项工作,并且一切正常。我尝试将其调整为我的 bazel 构建。如果我将awesome.so生成的文件go build -o awesome.so -buildmode=c-shared awesome.go作为资源包含到 myjava_library中,我可以让一切正常工作。
相关文件如下所示。
然而,理想情况下,我希望通过 bazel 生成所有内容,但尽管到目前为止我做了所有尝试,但我的go_binary规则始终输出awesome.a(and awesome.x)。如果我切换到使用//go:awesome作为资源,java:client_lib我能够成功地将awesome.a输出视为资源,这表明让我go_binary的输出awesome.so是拼图的最后一块,但迄今为止我还没有正确组合标志。
基本上我只想让我的go_binary规则具有与运行相同的行为go build -o awesome.so --buildmode=c-shared awesome.go。
从理论上讲,如果我需要另一个规则来弥合差距,我没问题,但是由于我在 Windows 上并且到目前为止 bash 已经被击中或错过,因此genrule用作中间体目前看起来并不乐观。
请指教,谢谢!
工作空间
...
# bazelbuild/rules_go for golang support.
http_archive(
name = "io_bazel_rules_go",
sha256 = "b725e6497741d7fc2d55fcc29a276627d10e43fa5d0bb692692890ae30d98d00",
urls = [
"https://mirror.bazel.build/github.com/bazelbuild/rules_go/releases/download/v0.24.3/rules_go-v0.24.3.tar.gz",
"https://github.com/bazelbuild/rules_go/releases/download/v0.24.3/rules_go-v0.24.3.tar.gz",
],
)
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
go_rules_dependencies()
go_register_toolchains()
...
go/awesome.go 是从文章中复制而来的。
去/建立
load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
package(default_visibility = ["//visibility:public"])
go_binary(
name = "awesome",
srcs = glob(["*.go"]),
cgo = True,
copts = [
"-fPIC", # I tried adding this after some other reading about .a->.so
],
gc_linkopts = [
"-shared", # I think this is equivalent to the linkmode=c-shared below, but... <shrug>
],
linkmode = "c-shared",
static = "off",
)
# This one uses the pre-built awesome.so, and this works.
filegroup(
name = "prebuilt_awesome_resource",
srcs = ["awesome.so"],
)
java/Client.java 是从文章中链接的 github repo复制而来的(对库的位置稍作调整)。
爪哇/构建
package(default_visibility = ["//visibility:public"])
java_import(
name = "jna",
jars = ["jna.jar"],
)
宝慕林4294392
慕哥9229398
慕姐4208626
随时随地看视频慕课网APP
相关分类