查看bazel版本
bazel version
清除build结果
bazel clean --expunge
build
bazel build : # 在BUILD所在的package目录下执行,编译指定的target
bazel build :all # 编译该package下的所有target
bazel build ... # 编译该package下的所有target
bazel build /path/to/package>: # 在workspace下的任意目录执行,“//”表示workspace所在目录
run
bazel run -- : # 和build类似
不需要先执行build,在执行run,run的时候会自动先build再执行
BUILD构建文件用"#"
开头来添加单行注释
参考:
Introduction to Bazel: Building a C++ Project
Bazel入门:编译C++项目
C / C++ Rules
Google软件构建工具Bazel原理及使用方法介绍
BUILD文件:
# Description:
# TensorFlow is a computational framework, primarily for use in machine
# learning applications.
# 通用方法,定义的值会作用到下面的每个子rule中。default_visibility指定了这个包的默认可见规则。可见的情况下才能被其他package调用。
package(
default_visibility = ["//visibility:public"],
)
# 默认的license
licenses(["notice"]) # Apache 2.0
# 通用方法,加载.bzl文件
load(
"//tensorflow:tensorflow.bzl",
"tf_cc_test",
"tf_cc_binary",
"tf_copts",
"tf_gen_op_wrappers_cc",
"cc_library_with_android_deps",
)
# c++库文件,name指定了编译为库文件后的文件名,srcs和hdrs指定源文件和头文件,deps指定需要依赖的其他文件
cc_library(
name = "gradient_checker",
srcs = ["framework/gradient_checker.cc"],
hdrs = ["framework/gradient_checker.h"],
deps = [
":cc_ops",
":client_session",
":gradients",
":ops",
":scope",
"//tensorflow/core:framework",
"//tensorflow/core:lib",
"//tensorflow/core:lib_internal",
],
)
# c++测试文件
tf_cc_test(
name = "gradients_array_grad_test",
srcs = ["gradients/array_grad_test.cc"],
deps = [
":array_grad",
":cc_ops",
":cc_ops_internal",
":grad_op_registry",
":grad_testutil",
":gradient_checker",
":testutil",
"//tensorflow/core:test",
"//tensorflow/core:test_main",
"//tensorflow/core:testlib",
],
)
# c++编译目标文件,为一个二进制可执行文件。name必须唯一,srcs指定了源文件,linkopts指定了链接规则,deps指定了依赖文件
tf_cc_binary(
name = "tutorials_example_trainer",
srcs = ["tutorials/example_trainer.cc"],
copts = tf_copts(),
linkopts = select({
"//tensorflow:windows": [],
"//tensorflow:windows_msvc": [],
"//tensorflow:darwin": [
"-lm",
"-lpthread",
],
"//tensorflow:ios": [
"-lm",
"-lpthread",
],
"//conditions:default": [
"-lm",
"-lpthread",
"-lrt",
],
}),
deps = [
":cc_ops",
"//tensorflow/core:core_cpu",
"//tensorflow/core:framework",
"//tensorflow/core:lib",
"//tensorflow/core:protos_all_cc",
"//tensorflow/core:tensorflow",
],
)
# 为多个编译目标target指定一个名字,glob是一个帮助函数,指定了目录中哪些文件会include,哪些会exclude。visibility指定了target的可见性,也就是可以被哪些package调用
filegroup(
name = "all_files",
srcs = glob(
["**/*"],
exclude = [
"**/METADATA",
"**/OWNERS",
],
),
visibility = ["//tensorflow:__subpackages__"],
)
tf_cc_binary:目标文件编译规则,为一个二进制可执行文件。name必须唯一,srcs指定了源文件,linkopts指定了链接规则,deps指定了依赖文件
cc_library:库文件编译规则,name指定了编译为库文件后的文件名,srcs和hdrs指定源文件和头文件,deps指定需要依赖的其他文件
tf_cc_test:测试文件规则
package:通用方法,定义的值会作用到下面的每个子rule中。default_visibility指定了这个包的默认可见规则。可见的情况下才能被其他package调用。
licenses:通用方法,默认的license
load:通用方法,加载.bzl文件
filegroup:通用方法,为多个编译目标target指定一个名字,glob是一个帮助函数,指定了目录中哪些文件会include,哪些会exclude。visibility指定了target的可见性,也就是可以被哪些package调用
name属性来命名规则,
deps属性来描述规则之间的依赖关系。使用冒号来分隔包名和规则名。如果某条规则所依赖的规则在其他目录下,就用"//"开头,如果在同一目录下,可以忽略包名而用冒号开头。
linkopts指定了链接规则