我对 openwrt buildroot 中的
build_dir
和 staging_dir
感到困惑。
它们有什么用?
openwrt中有
feeds
。我想建立一个形象。您将在 menuconfig
中选择所需的包并使用 make
来构建它。
从
feeds
获取包,然后编译成build_dir
?
那么
staging_dir
是用来做什么的?
目录
build_dir
用于解压所有源档案并编译它们。
目录
staging_dir
用于“安装”所有已编译的程序,准备用于构建进一步的软件包或准备固件映像。
build_dir
下分为三个区域:
build_dir/host
,用于编译在主机上运行的所有工具(OpenWRT 从源代码构建了自己的 sed
版本以及许多其他工具)。该区域将用于编译仅在您的主机上运行的程序。build_dir/toolchain...
用于编译将用于构建包的跨 C 编译器和 C 标准库组件。该区域将用于编译仅在您的主机上运行的程序(例如,交叉 C 编译器),以及设计用于在链接到的目标上运行的库 - 例如uClibc、libm、pthreads 等build_dir/target...
用于为目标系统编译实际的软件包和 Linux 内核在舞台下,也分为三个区域:
staging_dir/host
是一个迷你 Linux 根目录,有自己的 bin/
、lib/
等,主机工具安装在其中;然后构建系统的其余部分在其 PATH 中添加该区域中的目录前缀staging_dir/toolchain...
是一个迷你 Linux 根目录,有自己的 bin/
、lib/
等,其中包含用于构建其余固件的交叉 C 编译器。实际上,您可以使用它来编译 OpenWRT 之外的简单 C 程序,并将其加载到固件中。 C 编译器可能类似于:staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-uclibc-gcc
。可以看到CPU的版本、C库以及编码进去的gcc;这允许在同一区域同时构建多个目标。staging_dir/target.../root-...
包含每个目标包的“已安装”版本,再次用 bin/
、lib/
排列,这将成为实际的根目录,通过一些调整将被压缩到固件映像中,类似于 root-ar71xx
。 staging_dir/target...
中还有一些其他文件,主要用于生成包、开发包等抱歉,有点冗长,很难更简洁地描述。
想象一下您正在建造一个机器人。要建造机器人,您需要组装不同的零件和工具。同样,在构建固件(设备的软件)时,您需要组织和编译不同的程序和工具。
build_dir:这就像一个研讨会,您可以在其中解压并编译构建固件所需的所有程序和工具。它分为三个区域:
build_dir/host:这是编译在计算机上运行的工具的位置。例如,如果您需要像“sed”这样的工具的特殊版本,您可以在这里编译它。
build_dir/toolchain:您可以在此处编译构建固件所需的跨 C 编译器和 C 标准库组件。它还编译设计用于在您正在为其构建固件的设备上运行的库。 build_dir/target:这是您为要为其构建固件的设备编译实际程序和 Linux 内核的位置。 staging_dir:这就像一个存储区域,您可以在其中“安装”所有已编译的程序和工具。它分为三个区域:
staging_dir/host:这就像一个带有自己的工具集的迷你操作系统。您编译的工具安装在这里,构建系统使用它们来构建固件。
staging_dir/toolchain:这是另一个迷你操作系统,有自己的一套工具,包括用于构建固件的跨C编译器。您还可以使用它来编译固件之外的简单 C 程序。
staging_dir/target:这包含每个目标包的“已安装”版本,按 bin/ 和 lib/ 排列。这将成为压缩到固件映像中的实际根目录。
我希望这个解释有助于更简单地阐明 build_dir 和 staging_dir 的目的!
更多详情,您可以参考以下链接https://openwrt.org/docs/guide-developer/toolchain/buildsystem_essentials