Skip to content

SHBuild.zh CN

FrankHB edited this page Dec 20, 2014 · 22 revisions

SHBuild

位于 Tools/SHBuild ,是可以用来遍历目录编译链接本机程序的命令行工具。当前仅支持 MinGW32/MinGW64 环境。其它平台详见以下小节。

直接(不带参数)运行 SHBuild 查询使用方法和选项等说明。

通过设置环境变量控制 SHBuild 使用调用的后端工具。

当前 SHBuild 支持的命令行直接传递给后端,若需要构建复杂项目,可以使用其它的脚本支持。

构建

本节说明 SHBuild 的构建。使用 SHBuild 构建用户程序,参见之后的章节。

关于使用 bash 构建库、 SHBuild 、测试项目和基于 SHBuild 上的用户程序,参见关于 MinGW sysroot 的说明

直接构建

运行脚本 Tools/SHBuild-build.sh 生成 SHBuild 可执行文件。

如能成功使用以下的方法,一般不建议使用直接构建的版本。

自举和多阶段构建

运行脚本 Tools/SHBuild-self-host.sh 自举测试使用上述脚本编译得到的 SHBuild

SHBuild 支持本机自举,即在本机环境上直接构建 SHBuild 后继续使用 SHBuild 构建自身。

使用工具脚本安装 Sysroot ,当前这个过程分为两步:

  • 第一阶段(stage 1) 。
    • 调用脚本 Tools/Scripts/SHBuild-build.sh 。只依赖编译器进行编译链接。
    • 这个阶段的 SHBuild 通过脚本直接选取 YSLib 中的源文件作为依赖进行构建。
    • 因为直接调用编译器驱动链接,不支持显式指定并行编译,相对比较慢。编译的结果是静态链接的,文件体积比较大。
    • 主要用于下一阶段使用。不建议直接使用。
  • 第二阶段(stage 2) 。
    • 在脚本 Tools/install-sysroot.sh 内直接调用上一阶段构建的 SHBuild ,构建时链接到之前构建的 YFramework.dll 和 YBase.dll 。
    • 这是当前最终生成的 SHBuild 。
    • 链接和运行依赖 YFramework.dll 和 YBase.dll 。

也可以直接使用 SHBuild-self-host.shSHBuild-self-host-DLL.sh 进行直接自举。这两个脚本主要用于内部测试。

内建规则

遍历扫描目录时, SHBuild 识别名称符合特定模式串的文件。

当前支持后缀名。

文件名符合以下通配符模式的文件视为 C 源文件:

  • *.c

文件名符合以下通配符模式的文件视为 C++ 源文件:

  • *.cpp
  • *.cc
  • *.cxx

对以上文件,对应的内建 C 和 C++ 编译器规则分别被调用。其它文件不被视为源文件。

make 类似, SHBuild 的内建规则依赖文件修改时间(mtime) 判断一个目标是否最新。如果时间戳无法被正确更新(如编译器或者文件系统实现问题导致无法在命令执行后正确地更新被修改的文件时间,或者不恰当的缓存配置导致修改时间没有立即更新),可能导致冗余的重复构建。

内建规则使用的编译器和环境变量参见直接运行 SHBuild 的使用说明。

其它平台

除构建 stage 1 SHBuild 外,当前未正式支持 Linux 。

因为 SHBuild 本身和直接依赖的代码已经保证了可移植性,所以静态链接可以成功。得到的可执行文件除了没有扩展名,用法和前述 MinGW 下相同。

在进一步编译 YFramework 时会出错,因为 YFramework 中宿主 GUI 支持未在 Linux 上实现。这不影响已经构建的 SHBuild 的可用性。

已知问题 (2014-12-15) Arch Linux 上的 Btrfs 无法及时正确更新文件修改时间。

当前不支持上述以外的其它平台。

Clone this wiki locally