Bazel中对应GNU Make .PHONY规则的实现方法及示例
Bazel中替代GNU Make .PHONY规则的方案 & Install规则实现
替代.PHONY的目标(无输出文件、总是重建)
Bazel里没有和Make的.PHONY完全一致的语法,但有两种常用方式实现相同效果:
原生
phony()规则:适合做聚合类目标(比如Make里的all),本身不执行命令,只用来触发其他目标的构建,且不会生成任何文件。
示例代码:phony( name = "all", targets = [":my_binary", ":my_library"], )运行
bazel build :all时,会自动构建所有依赖的目标,每次都会检查依赖是否需要更新。空输出的
genrule/自定义规则:如果需要执行自定义命令(比如清理临时文件、打印信息),可以用genrule并设置outs = [],因为没有输出文件,Bazel无法判断目标是否完成,所以每次运行都会执行指定命令。
示例代码:genrule( name = "clean_temp", outs = [], cmd = "rm -rf $(BINDIR)/temp_files", )也可以结合
sh_binary和phony实现更复杂的逻辑:先写一个脚本,再用phony指向它,方便传递参数。比如:sh_binary( name = "run_setup", srcs = ["setup.sh"], ) phony( name = "setup", targets = [":run_setup"], )
Install规则的实现
Bazel本身没有内置install规则(它默认将构建产物放在bazel-bin等隔离目录,不直接操作系统路径),但可以自己实现:
简单版(用genrule)
直接通过genrule执行复制命令,注意要用bazel run而不是build,因为要在运行时执行文件操作:
genrule( name = "install", outs = [], cmd = "cp $(location :my_binary) /usr/local/bin/", tools = [":my_binary"], )
运行时需要权限的话,加sudo即可:sudo bazel run :install
通用版(用sh脚本)
先写一个install.sh脚本,处理复制、权限设置等逻辑:
#!/bin/bash # 复制二进制文件到系统目录 cp "$1" /usr/local/bin/ # 赋予执行权限 chmod +x /usr/local/bin/$(basename "$1")
然后在BUILD文件中配置:
sh_binary( name = "install_script", srcs = ["install.sh"], ) phony( name = "install", targets = [":install_script"], args = ["$(location :my_binary)"], )
运行bazel run :install(需要权限加sudo)就能完成安装,这种方式可以轻松扩展到安装配置文件、库文件等场景。
内容的提问来源于stack exchange,提问作者porton
相关产品推荐
相关产品推荐

