使用rules_foreign_cc在FreeBSD编译zlib时遭遇CMake生成器未找到错误的求助
rules_foreign_cc在FreeBSD编译zlib时遭遇CMake生成器未找到错误的求助
问题描述
我在FreeBSD系统下尝试用rules_foreign_cc编译zlib时,碰到了这个错误:
"fail("No generator set and no default is known. Please set the cmake
generatorattribute")"
我的BUILD文件内容如下:
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") package(default_visibility = ["//visibility:public"]) filegroup( name = "all_srcs", srcs = glob( include = ["**"], exclude = ["*.bazel"], ), ) cmake( name = "zlib", generate_args = select({ "@platforms//os:windows": ["-GNinja"], "//conditions:default": [], }), targets = ["install"], lib_source = ":all_srcs", out_static_libs = select({ "@platforms//os:windows": ["z.lib"], "//conditions:default": ["libz.a"], }), )
这套配置在Ubuntu 16和MacOS上都能正常编译zlib,但到FreeBSD就不行了。想请教下:
- 为什么FreeBSD下会找不到默认生成器?
- 如果需要在
generate_args里显式声明,有效的生成器选项有哪些?我试过-Gcc、-Gmake、-Gcmake,结果都提示“未知生成器”。
解决方案
这个问题的核心是:rules_foreign_cc对FreeBSD平台的默认CMake生成器支持不够完善,没有自动识别出合适的生成器,所以需要我们手动指定。
1. 正确的CMake生成器选项(FreeBSD可用)
CMake在FreeBSD上支持的有效生成器主要有两个:
Unix Makefiles:这是类Unix系统通用的生成器,依赖GNU Make(FreeBSD上可以通过pkg install gmake安装)Ninja:如果你的系统安装了Ninja构建工具(pkg install ninja),可以用这个生成器,构建速度通常更快
注意:你之前尝试的-Gcc、-Gmake都不是CMake的合法生成器名称,必须用上面列出的准确名称。
2. 修改BUILD文件,为FreeBSD指定生成器
我们可以通过select语句为FreeBSD单独配置生成器参数,修改后的cmake规则如下:
cmake( name = "zlib", generate_args = select({ "@platforms//os:windows": ["-GNinja"], "@platforms//os:freebsd": ["-GUnix Makefiles"], # 这里为FreeBSD指定生成器 "//conditions:default": [], }), targets = ["install"], lib_source = ":all_srcs", out_static_libs = select({ "@platforms//os:windows": ["z.lib"], "//conditions:default": ["libz.a"], }), )
如果你想用Ninja,只需要把FreeBSD对应的参数改成["-GNinja"]即可,但前提是已经安装了Ninja工具。
3. 额外注意事项
- 确保FreeBSD上已经安装了CMake:
pkg install cmake - 如果选择
Unix Makefiles生成器,记得安装GNU Make:pkg install gmake - 若你的Bazel版本较旧,
@platforms//os:freebsd可能无法被正确识别,这种情况下可以直接把生成器参数加到//conditions:default分支里(不过这会影响其他类Unix系统,不是最优解)
备注:内容来源于stack exchange,提问作者Desilith
相关产品推荐
相关产品推荐

