bazel 中依赖于平台的链接器标志(用于过剩)

platform dependent linker flags in bazel (for glut)

我正在尝试使用 bazel 构建带有 glut 的 C++ 应用程序。它应该适用于 macOS 和 linux。现在的问题是,在 macOS 上,它需要将 "-framework OpenGL", "-framework GLUT" 传递给 linker 标志,而在 linux 上,我可能应该做类似的事情 cc_library( name = "glut", srcs = glob(["local/lib/libglut*.dylib", "lib/libglut*.so"]), ... 在 glut.BUILD。 所以问题是 1. 通常如何为 cc_library 规则提供依赖于平台的 linker 选项? 2. 特别是如何 link 使用 bazel 以独立于平台的方式供过于求?

您可以使用 Bazel select() 函数执行此操作。这样的事情可能会奏效:

config_setting(
    name = "linux_x86_64",
    values = {"cpu": "k8"},
    visibility = ["//visibility:public"],
)

config_setting(
    name = "darwin_x86_64",
    values = {"cpu": "darwin_x86_64"},
    visibility = ["//visibility:public"],
)

cc_library(
    name = "glut",
    srcs = select({
        ":darwin_x86_64": [],
        ":linux_x86_64": glob(["local/lib/libglut*.dylib", "lib/libglut*.so"]),
    }),
    linkopts = select({
        ":darwin_x86_64": [
            "-framework OpenGL",
             "-framework GLUT"
        ],
        ":linux_x86_64": [],
    })
    ...
)

在 Bazel github 存储库中挖掘,它有一些使用 select() 的真实示例。

我遇到了类似的问题,但根据平台选择了正确的编译器,@zlalanne 的解决方案对我不起作用。经过2天的折腾,终于找到了如下解决方案:

config_setting (
  name = "darwin",
  constraint_values = [ "@bazel_tools//platforms:osx" ]
)

config_setting (
  name = "windows",
  constraint_values = [ "@bazel_tools//platforms:windows" ]

)

我不需要 linux,但将其添加到您的 BUILD 文件应该可行:

config_setting (
  name = "linux",
  constraint_values = [ "@bazel_tools//platforms:linux" ]
)

在您的 select 中使用 ":darwin"":windows"":linux",您应该有一个可行的解决方案。