java - 如何在Windows上的bazel中使用rules_go : generate . so文件

标签 java go bazel cgo

我已经切换(或者正在切换)使用 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/

相关文章:

caching - 从并发可访问的结构中检索数据类型后,哪些数据类型可以安全地读取和写入?

Bazel 构建工件列表

java - 为什么 main 不会收到我的返回 int 值 java

java - 字符串不包含实体,但显示它,并且表示在替换时不会改变

go - 为什么 nsqlookupd 包使用上下文?

go - 如何在Go中打开进程并正确记录stdin和stdout?

python - 嵌套的 Bazel 项目

android - Bazel generate_workspace 不工作?

java - 如何在录音 Android 时显示 MIC 输入可视化

java - 如何修复 org.apache.commons.compress.archivers.zip.UnsupportedZipFeatureException(epub mimetype)?