构建 Ruby¶ ↑
依赖项¶ ↑
-
安装构建 CRuby 解释器的先决条件依赖项
-
C 编译器
对于 RubyGems,您还需要
-
OpenSSL 1.1.x 或 3.0.x / LibreSSL
-
libyaml 0.1.7 或更高版本
-
zlib
如果您想从 git 仓库构建,您还需要
-
autoconf - 2.67 或更高版本
-
gperf - 3.1 或更高版本
-
通常不需要;只有在您使用 gperf 编辑某些源文件时才需要
-
-
ruby - 2.5 或更高版本
-
我们可以将此版本升级到最新 Ubuntu LTS 的系统 ruby 版本。
-
-
-
安装可选的推荐依赖项
-
libffi(用于构建 fiddle)
-
gmp(如果您想加速 Bignum 操作)
-
libexecinfo(FreeBSD)
-
rustc - 1.58.0 或更高版本,如果您希望构建 YJIT。
如果您将扩展所需的库(openssl、readline、libyaml、zlib)安装到除操作系统默认位置以外的其他位置,通常是在 macOS 上使用 Homebrew,请将
--with-EXTLIB-dir
选项添加到CONFIGURE_ARGS
环境变量中。export CONFIGURE_ARGS="" for ext in openssl readline libyaml zlib; do CONFIGURE_ARGS="${CONFIGURE_ARGS} --with-$ext-dir=$(brew --prefix $ext)" done
-
快速入门指南¶ ↑
-
下载 ruby 源代码
选择以下选项之一。
-
从 tarball 构建
从 ruby-lang.org 下载最新的 tarball 并解压缩。Ruby 3.0.2 的示例
tar -xzf ruby-3.0.2.tar.gz cd ruby-3.0.2
-
从 git 仓库构建
签出 CRuby 源代码
git clone https://github.com/ruby/ruby.git cd ruby
生成配置文件
./autogen.sh
-
-
在源目录之外创建一个
build
目录mkdir build && cd build
虽然没有必要在单独的目录中构建,但这样做是一个好习惯。
-
我们将把 Ruby 安装到
~/.rubies/ruby-master
中,因此请创建该目录mkdir ~/.rubies
-
运行配置
../configure --prefix="${HOME}/.rubies/ruby-master"
-
如果您经常构建 Ruby,请添加
--disable-install-doc
标志以不构建文档,这将加快构建过程。 -
此外,
-C
(或--config-cache
)将减少下次配置的时间。
-
-
构建 Ruby
make install
-
运行测试 以确认您的构建成功。
无法解释的构建错误¶ ↑
如果您遇到无法解释的构建错误,在保存所有工作后,尝试在源代码根目录中运行 git clean -xfd
以删除所有 git 忽略的本地文件。如果您正在使用已更新多次的源代码目录,您可能拥有来自先前版本的临时构建工件,这会导致构建失败。
在 Windows 上构建¶ ↑
有关在 Windows 上构建的文档,请参见 此处。
更多详细信息¶ ↑
如果您有兴趣继续开发 Ruby,以下提供了有关 Ruby 构建的更多详细信息,以帮助您。
并行运行 make 脚本¶ ↑
在 GNU make 和 BSD make 实现中,要并行运行特定的 make 脚本,请传递标志 -j<进程数>
。例如,要在 8 个进程上运行测试,请使用
make test-all -j8
我们也可以设置 MAKEFLAGS
来并行运行所有 make
命令。
使用正确的 --jobs
标志将确保在构建软件项目时利用所有处理器。要有效地做到这一点,您可以在 shell 配置/配置文件中设置 MAKEFLAGS
# On macOS with Fish shell: export MAKEFLAGS="--jobs "(sysctl -n hw.ncpu) # On macOS with Bash/ZSH shell: export MAKEFLAGS="--jobs $(sysctl -n hw.ncpu)" # On Linux with Fish shell: export MAKEFLAGS="--jobs "(nproc) # On Linux with Bash/ZSH shell: export MAKEFLAGS="--jobs $(nproc)"
Miniruby 与 Ruby¶ ↑
Miniruby 是 Ruby 的一个版本,它没有外部依赖项,并且缺少某些功能。它在 Ruby 开发中很有用,因为它可以加快构建时间。Miniruby 在 Ruby 之前构建。构建 Ruby 需要一个功能性的 Miniruby。要构建 Miniruby
make miniruby
调试¶ ↑
您可以使用 lldb 或 gdb 进行调试。在调试之前,您需要创建一个包含您要运行的 Ruby 脚本的 test.rb
。您可以使用以下 make 目标
-
make run
:使用 Miniruby 运行test.rb
-
make lldb
:在 lldb 中使用 Miniruby 运行test.rb
-
make gdb
:在 gdb 中使用 Miniruby 运行test.rb
-
make runruby
:使用 Ruby 运行test.rb
-
make lldb-ruby
:在 lldb 中使用 Ruby 运行test.rb
-
make gdb-ruby
:在 gdb 中使用 Ruby 运行test.rb
编译以进行调试¶ ↑
您应该在没有优化和其他可能干扰调试的标志的情况下配置 Ruby
./configure --enable-debug-env optflags="-O0 -fno-omit-frame-pointer"
使用地址清理器构建¶ ↑
使用地址清理器是检测内存问题的好方法。
./autogen.sh mkdir build && cd build export ASAN_OPTIONS="halt_on_error=0:use_sigaltstack=0:detect_leaks=0" ../configure cppflags="-fsanitize=address -fno-omit-frame-pointer" optflags=-O0 LDFLAGS="-fsanitize=address -fno-omit-frame-pointer" make
在 Linux 上,在调试时指定 -O0
很重要。这对于 ASAN 尤其重要,因为 ASAN 有时在更高的优化级别上会工作不正常。
如何衡量 C 和 Ruby 代码的覆盖率¶ ↑
您需要能够使用 gcc (gcov) 和 lcov 可视化器。
./autogen.sh ./configure --enable-gcov make make update-coverage rm -f test-coverage.dat make test-all COVERAGE=true make lcov open lcov-out/index.html
如果您只需要 C 代码覆盖率,可以从上述过程中删除 COVERAGE=true
。您也可以直接使用 gcov
命令来获取每个文件的覆盖率。
如果您只需要 Ruby 代码覆盖率,可以删除 --enable-gcov
。请注意,test-coverage.dat
会累积所有 make test-all
运行。如果您想测量一次测试运行,请确保删除该文件。
您可以查看 CI 的覆盖率结果:rubyci.org/coverage