我正在编写一个示例C++项目,该项目使用Bazel作为其他合作者遵循的示例习惯.
这是存储库:https://github.com/thinlizzy/bazelexample
我有兴趣知道我是否正在做'对',更具体地说是关于这个文件:https://github.com/thinlizzy/bazelexample/blob/38cc07931e58ff5a888dd6a83456970f76d7e5b3/demo/BUILD 当选择特定的实现时.
cc_library(
name = "demo",
srcs = ["demo.cpp"],
deps = [
"//example:frontend",
],
)
cc_binary(
name = "main_win",
deps = [
":demo",
"//example:impl_win",
],
)
cc_binary(
name = "main_linux",
deps = [
":demo",
"//example:impl_linux",
],
)
Run Code Online (Sandbox Code Playgroud)
这是否遵循Bazel项目的正确/预期的习惯用法?我已经为其他项目做了这种方式,通过将所有特定于平台的依赖关注集中在不同的目标中,然后二进制文件只依赖于它们.
在bazel讨论列表中的某个人告诉我使用select,但我的尝试未能"检测"操作系统.我确定我做错了什么,但缺乏信息和示例并没有告诉我如何正确使用它.
我想制定一个依赖于从其他文件生成的数据文件的构建规则。我尝试写这样的东西:
genrule(
name = "data",
outs = ["MyApp/data.dat"],
cmd = "cd ../libpackfiles ; bazel run FilePacker $(PWD)/../apps/MyApp/data.dat $(PWD)/../apps/MyApp/dataFiles",
)
Run Code Online (Sandbox Code Playgroud)
但由于多种原因并没有奏效。$(PWD) 未被 genrule 识别(cmd 在等效的 sh 脚本中工作正常)。而且我不知道是否允许我离开工作区目录(称为 apps)来执行另一个这样的 bazel run 命令。
我怎样才能写出一个正确的genrule来实现我想要的?
谢谢!