我已经切换(或者正在切换)使用 bazel,尽管我是在 Windows 上这样做的。 我有兴趣从 Java 调用我的 Go 代码,所以我从 this tutorial 开始.
我能够使用与他们的 Github 示例相同的代码来完成这项工作,并且一切正常。我尝试将其适应我的 bazel 构建。如果我采用 go build -o Awesome.so -buildmode=c-shared Awesome.go
生成的 awesome.so
文件并将其作为资源包含到我的 java_library
,我可以让一切正常工作。
相关文件如下所示。
但是,理想情况下,我希望通过 bazel 生成所有内容,但尽管到目前为止我进行了所有尝试,我的 go_binary
规则始终输出 awesome.a
(并且 awesome.x
)。如果我切换到使用 //go:awesome
作为 java:client_lib
的资源,我可以成功看到 awesome.a
输出为一个资源,这表明让我的 go_binary
输出 awesome.so
是拼图的最后一 block ,但迄今为止我还没有找到正确的标志组合。
基本上,我只是想让我的 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 linked in the article (对图书馆的位置稍作调整)。
java/构建
package(default_visibility = ["//visibility:public"])
java_import(
name = "jna",
jars = ["jna.jar"],
)
java_library(
name = "client_lib",
srcs = glob(["*.java"]),
resources = [
# "//go:awesome", # I'd rather use this one.
"//go:prebuilt_awesome_resource",
],
deps = [
":jna",
],
)
java_binary(
name = "client",
main_class = "Client",
runtime_deps = [
":client_lib",
],
)
而且,因为让 go 运行起来很重要:
%programdata%/basel.bazelrc
startup --output_user_root="C:/_bazel_out"
build --compiler=mingw-gcc
最佳答案
好吧,我想我需要在耻辱立方里坐一会儿。
在我为编译器寻找的所有选项中,我错过了检查 go_binary
上的其他属性。具体来说,就是最明显的一个,out
。实际上对应于 go build
-o
标志
我将 out = "awesome.so"
添加到我的 go_binary
规则中,果然,一切正常。
好吧,这几个小时就被浪费了。感谢杰伊试图提供帮助,并抱歉问了一个愚蠢的问题。
关于java - 如何在Windows上的bazel中使用rules_go : generate . so文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64383458/