区块链技术博客
www.b2bchain.cn

使用 Bazel 交叉编译树莓派程序求职学习资料

D0b2wT.gif

本文介绍了使用 Bazel 交叉编译树莓派程序求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

在上一篇 MacOS 交叉编译的文章介绍中已经简单介绍了交叉编译到底做了什么,并且用了一种很粗暴的方式在 MacOS 下成功的进行了交叉编译。那么这次主要提供一个稍微优雅一些的编译手法,即使用编译系统来编译我们的程序。这里,我主要选择了 bazel 这个 Google 家出品的工具(后续我们将用它来交叉编译 tflite 到我们的树莓派上)。

Toolchains vs Bazel

WARNING:本章节内容仍为原理探索性质的内容,如希望获得当前最佳实践方案,请跳转到下一章节。
还记得上一篇中,我们提到了使用 clang 配合着 arm-linux-gnueabihf-binutils 来进行交叉编译。在这一部分我们其实也是做的同样的事情,我们需要去“告诉” bazel,我们打算使用 clang + toolchains 来解决问题。所以,我们需要去看看 bazel 中的 toolchains 应该怎么设置,这部分配置说明可以在官网的相关文档找到。
官网中没有给一个可以直接运行的代码,于是我在 Github 附上了我能够成功运行的案例。接下来我就简单介绍下,配置的过程,希望能减少大家读英文受苦的过程。最终的目标是通过下面指令就能交叉编译 c++ 程序:

bazel --config rpi //:your_target

首先先放上完整的文件目录结构:

. ├── BUILD ├── hello-world.cc ├── toolchain │   ├── BUILD │   └── cc_respi_toolchain_config.bzl └── WORKSPACE

针对 –config 配置,我们需要在项目根目录下的 .bazelrc 中进行配置,其内容如下:

build:rpi --crosstool_top=//toolchain:respi_clang_suite build:rpi --cpu=armv7hf build:rpi --host_crosstool_top=@bazel_tools//tools/cpp:toolchain

可以看到其中的重点是我们指定了一个 crosstool_top 和一个 cpu。其中 cpu 算是 toolchains 中的一个判断使用什么 toolchain 的选项。同时我们可以看出来 //toolchain:respi_clangsuite 其实就是去当前目录中 toolchain 这个文件夹中,在 BUILD 中查找 respi_clang_suite 这个 target。
于是我们来看看 toolchain/BUILD 的内容:

load(":cc_respi_toolchain_config.bzl", "cc_respi_toolchain_config") # armv7hf config cc_toolchain_suite(     name = "respi_clang_suite",     toolchains = {         "armv7hf": ":respi_toolchain",     }, )  cc_respi_toolchain_config(name = "respi_toolchain_config") cc_toolchain(     name = "respi_toolchain",     toolchain_identifier = "respi-toolchain",     toolchain_config = ":respi_toolchain_config",     all_files = ":empty",     compiler_files = ":empty",     dwp_files = ":empty",     linker_files = ":empty",     objcopy_files = ":empty",     strip_files = ":empty",     supports_param_files = 0, )

PS:这里面的 .bzl 的内容直接写到 BUILD 中也行,但是为了文件的可读性,当前的写法是最值得推荐的。
可以看到这个文件中我们自定义了一个 toolchain_suite 和对应 toolchain,其中 toolchain 的配置是由 cc_respi_toolchain_config.bzl 文件中定义的 cc_respi_toolchain_config 定义的。于是我们顺势查看 cc_respi_toolchain_config.bzl :
“`
load(“@bazel_tools//tools/build_defs/cc:action_names.bzl”, “ACTION_NAMES”)
load(“@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl”,
“feature”,
“flag_group”,
“flag_set”,
“tool_path”,
)

all_link_actions = [
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]

def _impl(ctx):
tool_paths = [
tool_path(
name = “gcc”,
path = “/usr/bin/clang”,
),
tool_path(
name = “ld”,
path = “/usr/bin/arm-linux-gnueabihf-ld”,
),
tool_path(
name = “cpp”,
path = “/usr/bin/arm-linux-gnueabihf-gcc”,
),
tool_path(
name = “gcc”,
path = “/usr/bin/arm-linux-gnueabihf-gcc”,
),
tool_path(
name = “dwp”,
path = “/usr/bin/arm-linux-gnueabihf-dwp”,
),
tool_path(

在上一篇 MacOS 交叉编译的文章介绍中已经简单介绍了交叉编译到底做了什么,并且用了一种很粗暴的方式在 MacOS 下成功的进行了交叉编译。那么这次主要提供一个稍微优雅一些的编译手法,即使用编译系统来编译我们的程序。这里,我主要选择了 bazel 这个 Google 家出品的工具(后续我们将用它来交叉编译 tflite 到我们的树莓派上)。

Toolchains vs Bazel

WARNING:本章节内容仍为原理探索性质的内容,如希望获得当前最佳实践方案,请跳转到下一章节。
还记得上一篇中,我们提到了使用 clang 配合着 arm-linux-gnueabihf-binutils 来进行交叉编译。在这一部分我们其实也是做的同样的事情,我们需要去“告诉” bazel,我们打算使用 clang + toolchains 来解决问题。所以,我们需要去看看 bazel 中的 toolchains 应该怎么设置,这部分配置说明可以在官网的相关文档找到。
官网中没有给一个可以直接运行的代码,于是我在 Github 附上了我能够成功运行的案例。接下来我就简单介绍下,配置的过程,希望能减少大家读英文受苦的过程。最终的目标是通过下面指令就能交叉编译 c++ 程序:

bazel --config rpi //:your_target

首先先放上完整的文件目录结构:

. ├── BUILD ├── hello-world.cc ├── toolchain │   ├── BUILD │   └── cc_respi_toolchain_config.bzl └── WORKSPACE

针对 –config 配置,我们需要在项目根目录下的 .bazelrc 中进行配置,其内容如下:

build:rpi --crosstool_top=//toolchain:respi_clang_suite build:rpi --cpu=armv7hf build:rpi --host_crosstool_top=@bazel_tools//tools/cpp:toolchain

可以看到其中的重点是我们指定了一个 crosstool_top 和一个 cpu。其中 cpu 算是 toolchains 中的一个判断使用什么 toolchain 的选项。同时我们可以看出来 //toolchain:respi_clangsuite 其实就是去当前目录中 toolchain 这个文件夹中,在 BUILD 中查找 respi_clang_suite 这个 target。
于是我们来看看 toolchain/BUILD 的内容:

load(":cc_respi_toolchain_config.bzl", "cc_respi_toolchain_config") # armv7hf config cc_toolchain_suite(     name = "respi_clang_suite",     toolchains = {         "armv7hf": ":respi_toolchain",     }, )  cc_respi_toolchain_config(name = "respi_toolchain_config") cc_toolchain(     name = "respi_toolchain",     toolchain_identifier = "respi-toolchain",     toolchain_config = ":respi_toolchain_config",     all_files = ":empty",     compiler_files = ":empty",     dwp_files = ":empty",     linker_files = ":empty",     objcopy_files = ":empty",     strip_files = ":empty",     supports_param_files = 0, )

PS:这里面的 .bzl 的内容直接写到 BUILD 中也行,但是为了文件的可读性,当前的写法是最值得推荐的。
可以看到这个文件中我们自定义了一个 toolchain_suite 和对应 toolchain,其中 toolchain 的配置是由 cc_respi_toolchain_config.bzl 文件中定义的 cc_respi_toolchain_config 定义的。于是我们顺势查看 cc_respi_toolchain_config.bzl :
“`
load(“@bazel_tools//tools/build_defs/cc:action_names.bzl”, “ACTION_NAMES”)
load(“@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl”,
“feature”,
“flag_group”,
“flag_set”,
“tool_path”,
)

all_link_actions = [
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]

def _impl(ctx):
tool_paths = [
tool_path(
name = “gcc”,
path = “/usr/bin/clang”,
),
tool_path(
name = “ld”,
path = “/usr/bin/arm-linux-gnueabihf-ld”,
),
tool_path(
name = “cpp”,
path = “/usr/bin/arm-linux-gnueabihf-gcc”,
),
tool_path(
name = “gcc”,
path = “/usr/bin/arm-linux-gnueabihf-gcc”,
),
tool_path(
name = “dwp”,
path = “/usr/bin/arm-linux-gnueabihf-dwp”,
),
tool_path(

在上一篇 MacOS 交叉编译的文章介绍中已经简单介绍了交叉编译到底做了什么,并且用了一种很粗暴的方式在 MacOS 下成功的进行了交叉编译。那么这次主要提供一个稍微优雅一些的编译手法,即使用编译系统来编译我们的程序。这里,我主要选择了 bazel 这个 Google 家出品的工具(后续我们将用它来交叉编译 tflite 到我们的树莓派上)。

Toolchains vs Bazel

WARNING:本章节内容仍为原理探索性质的内容,如希望获得当前最佳实践方案,请跳转到下一章节。
还记得上一篇中,我们提到了使用 clang 配合着 arm-linux-gnueabihf-binutils 来进行交叉编译。在这一部分我们其实也是做的同样的事情,我们需要去“告诉” bazel,我们打算使用 clang + toolchains 来解决问题。所以,我们需要去看看 bazel 中的 toolchains 应该怎么设置,这部分配置说明可以在官网的相关文档找到。
官网中没有给一个可以直接运行的代码,于是我在 Github 附上了我能够成功运行的案例。接下来我就简单介绍下,配置的过程,希望能减少大家读英文受苦的过程。最终的目标是通过下面指令就能交叉编译 c++ 程序:

bazel --config rpi //:your_target

首先先放上完整的文件目录结构:

. ├── BUILD ├── hello-world.cc ├── toolchain │   ├── BUILD │   └── cc_respi_toolchain_config.bzl └── WORKSPACE

针对 –config 配置,我们需要在项目根目录下的 .bazelrc 中进行配置,其内容如下:

build:rpi --crosstool_top=//toolchain:respi_clang_suite build:rpi --cpu=armv7hf build:rpi --host_crosstool_top=@bazel_tools//tools/cpp:toolchain

可以看到其中的重点是我们指定了一个 crosstool_top 和一个 cpu。其中 cpu 算是 toolchains 中的一个判断使用什么 toolchain 的选项。同时我们可以看出来 //toolchain:respi_clangsuite 其实就是去当前目录中 toolchain 这个文件夹中,在 BUILD 中查找 respi_clang_suite 这个 target。
于是我们来看看 toolchain/BUILD 的内容:

load(":cc_respi_toolchain_config.bzl", "cc_respi_toolchain_config") # armv7hf config cc_toolchain_suite(     name = "respi_clang_suite",     toolchains = {         "armv7hf": ":respi_toolchain",     }, )  cc_respi_toolchain_config(name = "respi_toolchain_config") cc_toolchain(     name = "respi_toolchain",     toolchain_identifier = "respi-toolchain",     toolchain_config = ":respi_toolchain_config",     all_files = ":empty",     compiler_files = ":empty",     dwp_files = ":empty",     linker_files = ":empty",     objcopy_files = ":empty",     strip_files = ":empty",     supports_param_files = 0, )

PS:这里面的 .bzl 的内容直接写到 BUILD 中也行,但是为了文件的可读性,当前的写法是最值得推荐的。
可以看到这个文件中我们自定义了一个 toolchain_suite 和对应 toolchain,其中 toolchain 的配置是由 cc_respi_toolchain_config.bzl 文件中定义的 cc_respi_toolchain_config 定义的。于是我们顺势查看 cc_respi_toolchain_config.bzl :
“`
load(“@bazel_tools//tools/build_defs/cc:action_names.bzl”, “ACTION_NAMES”)
load(“@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl”,
“feature”,
“flag_group”,
“flag_set”,
“tool_path”,
)

all_link_actions = [
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]

def _impl(ctx):
tool_paths = [
tool_path(
name = “gcc”,
path = “/usr/bin/clang”,
),
tool_path(
name = “ld”,
path = “/usr/bin/arm-linux-gnueabihf-ld”,
),
tool_path(
name = “cpp”,
path = “/usr/bin/arm-linux-gnueabihf-gcc”,
),
tool_path(
name = “gcc”,
path = “/usr/bin/arm-linux-gnueabihf-gcc”,
),
tool_path(
name = “dwp”,
path = “/usr/bin/arm-linux-gnueabihf-dwp”,
),
tool_path(

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 使用 Bazel 交叉编译树莓派程序求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们