Troubleshooting ruby builds

Paul Keen
JTWay
Published in
2 min readOct 11, 2022

--

Have you found problems building ruby on a local machine? How to configure your local environment once and for all?

Failed to build ruby

Building ruby is dependent on several key elements: build tools, compilers, linkers, also shared libraries like openssl, libyaml, readline, etc. And we need to help ruby-build to find all those tools and libraries.

Here is a solution for macOS with Homebrew.

Install system packages

brew install gmp libyaml rbenv readline zlib

As a bonus, it will also install Xcode Command Line Tools.

Preconfigure ruby-build

export RUBY_CONFIGURE_OPTS="\
--with-libyaml-dir=$(brew --prefix libyaml) \
--with-zlib-dir=$(brew --prefix zlib) \
"

Install Ruby 3.1+

brew install openssl@3 rust 
export RUBY_CONFIGURE_OPTS="$RUBY_CONFIGURE_OPTS --with-openssl-dir=$(brew --prefix openssl@3)"
rbenv install 3.2.0-preview2

Note: We need rust for the new YJIT.

Install Ruby 2.x-3.x

brew install openssl@1.1
export RUBY_CONFIGURE_OPTS="$RUBY_CONFIGURE_OPTS --with-openssl-dir=$(brew --prefix openssl@1.1)"
rbenv install 2.7.5

(Optional) Let’s add Jemalloc

To enable Jemalloc, we need to do next before the ruby installation:

brew install jemallocexport LDFLAGS="$LDFLAGS -L$(brew --prefix jemalloc)/lib"
export CPPFLAGS="$CPPFLAGS -I$(brew --prefix jemalloc)/include"
export PKG_CONFIG_PATH="$(brew --prefix jemalloc)/lib/pkgconfig:$PKG_CONFIG_PATH"
export MALLOC_ARENA_MAX=2export RUBY_CONFIGURE_OPTS="$RUBY_CONFIGURE_OPTS --with-jemalloc"

Best place to have ENV configuration

A good place for settings is in .profile, .bashenv or .zshenv, then you do not need to recall them each time you install or reinstall ruby.

My .zshenv looks like:

## Make: tune confexport MAKEOPTS="-j 10" # increases the number of parallel build processes## Build Ruby configurationexport RUBY_CONFIGURE_OPTS="\
--disable-install-doc \
--with-jemalloc \
--with-libyaml-dir=/opt/homebrew/opt/libyaml \
--with-openssl-dir=/opt/homebrew/opt/openssl@3 \
--with-zlib-dir=/opt/homebrew/opt/zlib \
--without-tcl \
--without-tk \
"
## Jemallocexport LDFLAGS="-L/opt/homebrew/opt/jemalloc/lib $LDFLAGS"
export CPPFLAGS="-I/opt/homebrew/opt/jemalloc/include $CPPFLAGS"
export PKG_CONFIG_PATH="/opt/homebrew/opt/jemalloc/lib/pkgconfig:$PKG_CONFIG_PATH"
export MALLOC_ARENA_MAX=2## Opensslexport PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"
export LIBRARY_PATH="/opt/homebrew/opt/openssl@3/lib:$LIBRARY_PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@3/lib $LDFLAGS"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@3/include $CPPFLAGS"
export PKG_CONFIG_PATH="/opt/homebrew/opt/openssl@3/lib/pkgconfig:$PKG_CONFIG_PATH"
## Readlineexport LDFLAGS="-L/opt/homebrew/opt/readline/lib $LDFLAGS"
export CPPFLAGS="-I/opt/homebrew/opt/readline/include $CPPFLAGS"
export PKG_CONFIG_PATH="/opt/homebrew/opt/readline/lib/pkgconfig:$PKG_CONFIG_PATH"

Next

ruby-build Wiki is good to learn.

Paul Keen is an Open Source Contributor and a Chief Technology Officer at JetThoughts. Follow him on LinkedIn or GitHub.

If you enjoyed this story, we recommend reading our latest tech stories and trending tech stories.

--

--