Change log
目錄
[bazel]-導讀
[bazel]-概念和術語
[bazel]-bazel的使用
[bazel]-tulsi的使用
[bazel]-如何編譯
[bazel]-緩存
[bazel]-影響緩存命中的因素
[bazel]-優化
項目地址
一.bazelrc
Bazel可以接收很多參數和命令.為了避免去指定一些固定的.不會改變的參數和命令.
Bazel允許你在一個配置文件里指定這些參數.
這個配置文件就是.bazelrc文件
二.where are the .bazelrc files?
.bazelrc會存在4個路徑.
如果兩個路徑下的.bazelrc指定了相同的參數.
相對后面路徑的.bazelrc文件會覆蓋相對前面路徑的值.
在.bazelrc里指定的參數大多為啟動項.
這意味著.bazelrc里指定的參數會在build命令執行之前生效.
1.除非存在--nosystem_rc. Bazel會去系統路徑尋找.在Unix系統中.路徑為'/etc/bazel.bazelrc'
2.除非存在--noworkspace_rc. Bazel會去workspace路徑尋找.路徑為 工程根目錄下的.bazelrc
3.除非存在--nohome_rc. Bazel會去home路徑尋找.路徑為'~/.bazelrc'
4.可以通過--bazelrc = file 啟動選項指定其他.rc文件.如果此選項不存在.則不會加載其他文件.
經過實驗后的結論:
1.只有在工程根目錄下沒有.bazelrc文件時.才會去讀'~/.bazelrc'文件
2.工程跟錄下有.bazelrc文件時.還是會去讀'/etc/bazel.bazelrc'文件.但是如果有重復的定義.會覆蓋'/etc/bazel.bazelrc'里的定義.
三.import
.bazelrc文件里使用import語句可以引用其他文件的內容.
import文件中指定的選項優先于import語句之前的選項
import語句后指定的選項優先于import文件中的選項
如下這樣書寫.就是引入 工程根目錄下的warnings.bazelrc和cutomize-provision/custom.bazelrc文件
import %workspace%/customized-provision/custom.bazelrc
import %workspace%/warnings.bazelrc
4.Option defaults
bazelrc文件里的大多數行是定義默認值的.
每行的第一個單詞指定何時應用這些默認值.
startup:啟動選項,它位于命令之前,并在bazel help startup_options中描述。
common:適用于所有Bazel命令的選項。
command:給bazel的命令添加參數.如下.就是給build命令添加三個參數.
// 1.取消上傳本地緩存
build --remote_upload_local_results=false
// 2.取消模擬器簽名 (如:bili-universal:bili-universal[action 'Processing and signing iOS application: bili-universal'])
build --define=apple.codesign_simulator_bundles=no
5.bazelignore
您可以在工作區中指定希望Bazel忽略的目錄,例如使用其他構建系統的相關項目。
在工作區的根目錄下放置一個名為.bazelignore的文件,并添加您希望Bazel忽略的目錄,每行一個.
6.Building programs with Bazel
% bazel build //foo
____Loading package: foo
____Loading package: bar
____Loading package: baz
____Loading complete. Analyzing...
____Building 1 target...
____[0 / 3] Executing Genrule //bar:helper_rule
____[1 / 3] Executing Genrule //baz:another_helper_rule
____[2 / 3] Building foo/foo.bin
Target //foo:foo up-to-date:
bazel-bin/foo/foo.bin
bazel-bin/foo/foo
____Elapsed time: 9.905s
Bazel打印進度,因為它在所請求目標的依賴關系的傳遞閉包中加載所有包,然后分析它們的正確性并創建構建操作,最后執行編譯器和構建的其他工具。
Bazel在構建的執行階段打印進度消息,顯示正在啟動的當前構建步驟(編譯器,鏈接器等),以及在構建操作總數上完成的數量。 隨著構建開始,總行動的數量通常會隨著Bazel發現整個行動圖而增加,但數量通常會在幾秒鐘內穩定下來。
在構建結束時,Bazel打印請求的目標,無論它們是否成功構建,如果是,可以找到輸出文件的位置。 運行構建的腳本可以可靠地解析此輸出; 有關詳細信息,請參閱--show_result。
7.Correct incremental rebuilds
Bazel避免了這些假設,以及其他假設。 Bazel維護一個以前完成的所有工作的數據庫,如果它發現該構建步驟的輸入文件集(及其時間戳)以及該構建步驟的編譯命令與該構建步驟中的一個完全匹配,則只會省略構建步驟。數據庫,以及數據庫條目的輸出文件集(及其時間戳)與磁盤上文件的時間戳完全匹配。對輸入文件或輸出文件或命令本身的任何更改都將導致重新執行構建步驟。
正確增量構建對用戶的好處是:由于混亂而浪費的時間更少。 (此外,使用make clean導致等待重建所花費的時間更少,無論是必要還是先發制人。)
8.分析每次構建的耗時
在每次構建成功后.
我們可以通過 analyze-profile 命令查看此次構建具體每個步驟的耗時.
$ cd <workspace_dir>
$ bazel analyze-profile bazel-profile --html
關于 'bazel-profile' 文件:
當你在運行 $ bazel build 命令式.
增加一個'--profile=bazel-profile' 參數時.
每次build后會在根目錄生成一個bazel-profile文件.
這個文件就是 analyze-profile 命令所需的輸入文件.
為了方便.我們可以將此參數加入到.bazelrc里.如下:
build --profile=bazel-profile
參數:
--html
可以將輸出日志寫入一個html文件.方便查看.
輸入日志如下:
Total time (across all threads) spent on:
Type Total Count Average
ACTION 0.01% 7 1.47 ms
ACTION_EXECUTE 25.36% 7 6.794 s
ACTION_UPDATE 0.00% 1 0.00 ms
INFO 0.00% 4 0.88 ms
VFS_STAT 0.19% 194 1.87 ms
VFS_DIR 0.00% 10 0.05 ms
VFS_READLINK 0.00% 4 0.01 ms
VFS_MD5 7.79% 8 1.827 s
VFS_DELETE 0.01% 18 1.29 ms
VFS_OPEN 0.00% 20 0.07 ms
VFS_READ 0.94% 165700 0.01 ms
VFS_WRITE 0.00% 2 0.22 ms
SKYFRAME_EVAL 33.23% 1 62.323 s
SKYFUNCTION 33.21% 18 3.460 s
Critical path (62.233 s):
Id Time Percentage Description
87 16.002 s 25.71% action 'Processing and signing iOS application universal'
86 14.305 s 22.99% action 'Bundling iOS application universal'
85 1.958 s 3.15% action 'Symlinking single-architecture binary'
84 25.411 s 40.83% action 'Linking universal/universal.apple_binary_bin'
83 2.390 s 3.84% action 'Linking srcs/app/libphone_library.a'
82 2.168 s 3.48% action 'Compiling srcs/app/iPhone/VideoInfoM3/VC/PlayerVideoInfoViewControllerM3.m'