How to build your custom release bazel version?

周榮華發表於2021-08-23

最近由於負責交叉編譯AI專案,包括tensorflow和pytorch,其中tf是用bazel管理編譯的,為了確保自己製作的交叉編譯工具鏈能正常執行,不得不把原生的bazel做了一些修改來支援交叉編譯,主要是砍掉了一些對絕對路徑依賴的限制(正常的交叉編譯工具鏈都是放在/opt目錄下面的絕對路徑)。

 

一般情況下用原始碼編譯,生成的都是開發版本,這種版本做版本號校驗方面會有很多問題,所以需要編譯自己的release版本。

 

export USE_BAZEL_VERSION=1.2.1 # 選擇使用版本為準備定製的bazel版本的基礎版本,否則部分規則跨大版本bazel語法不相容

yum install java-11-openjdk java-11-openjdk-devel  # 如果在ubuntu,需要使用apt install XXX

如果直接下載的原始碼包解壓編譯的話,會沒有git的commit記錄,這樣改版本號的指令碼會不過,需要寫死一個commit號,如果是git clone下來的branch或者tag的話,下面的修改不用做:

diff ../bazel-1.2.1-dist/scripts/ci/build_status_command.sh ../bazel-0.24.1-dist/scripts/ci/build_status_command.sh
25,26c25
< #git_hash=$(git rev-parse --short HEAD)
< git_hash=5c4c67c
---
> git_hash=$(git rev-parse --short HEAD)

 

先編譯一個開發版本:

bazelisk build --sandbox_tmpfs_path=/tmp //src:bazel

 

定義需要打包的版本號:

export release_name=1.2.1

上面這句命令表示生成的版本號就是1.2.1

 

修改開發版本的版本資訊生成釋出版本的ubuntu作業系統命令:
mkdir output
cp bazel-bin/src/bazel output/bazel
output/bazel build \
-c opt \
--stamp \
--sandbox_tmpfs_path=/tmp \
--embed_label "${release_name}" \
--workspace_status_command=scripts/ci/build_status_command.sh \
src/bazel \
src/bazel_nojdk \
scripts/packages/with-jdk/install.sh \
scripts/packages/debian/bazel-debian.deb \
scripts/packages/debian/bazel.dsc \
scripts/packages/debian/bazel.tar.gz \
bazel-distfile.zip

centos/tlinux命令:

mkdir output
cp bazel-bin/src/bazel output/bazel

output/bazel build \
-c opt \
--stamp \
--sandbox_tmpfs_path=/tmp \
--embed_label "${release_name}" \
--workspace_status_command=scripts/ci/build_status_command.sh \
src/bazel

  

這樣之後下面的版本就是釋出版本了,版本號就是${release_name}裡面指定的

bazel-bin/src/bazel

 

如果想要用自己定製的bazel版本,需要啟動一個http伺服器,並將編譯好的bazel版本按路徑放到對應目錄下,下面的例子是本地啟動的http伺服器:
export BAZELISK_BASE_URL=http://127.0.0.1/bazel

完整編譯過程可以參照bazel的CI指令碼:

continuous-integration/bazel-release.yml at master · bazelbuild/continuous-integration (github.com)

相關文章