Ruby - use MSYS2 to install Ruby dev packages to build native extensions on Windows
Aim: Use MSYS2 to install the development packages Ruby needs to build native extensions on Windows.
Why? because I found out that some Ruby gems must be build as native extensions. Without this setup, installing such gems never works.
Pre-requisites: Ruby is installed.
Background and Problem
After setting up my laptop according to https://github.com/juliusgb/dev-laptop-setup, I cloned my Jekyll site that’s based on Simply Jekyll site, ran gem install bundler jekyll && bundle install, and was greeted with the error:
1
2
3
4
5
6
In Gemfile:
jekyll-feed was resolved to 0.16.0, which depends on
jekyll was resolved to 4.0.1, which depends on
em-websocket was resolved to 0.5.3, which depends on
http_parser.rb
mingw32-make: *** [makefile:5: prep] Error 5
Manually installing the http_parser.rb gem with command gem install http_parser.rb --version 0.6.0 returned
1
2
3
4
Temporarily enhancing PATH for MSYS/MINGW...
Building native extensions. This could take a while...
ERROR: Error installing http_parser.rb:
ERROR: Failed to build gem native extension.
From stackoverflow, I found out that
The error indicates that Ruby needs to compile native (non-Ruby) code in order to install and use the http_parser gem. To compile native code on Windows you need to install Ruby with the DevKit package. —2018, https://stackoverflow.com/a/50929914
Why the DevKit? Because the RubyInstaller DevKit contains development packages required to compile with Ruby C-extensions.
But according to the DevKit documentation,
Stating with RubyInstaller-2.4 we’re no longer using our own DevKit compilation, but make use of MSYS2 for both building Ruby itself as well as building Ruby gems with C-extensions.
So I need do the following:
- Make sure that MSYS2 is installed.
- Install the development packages Ruby needs to needs build with C-extensions. Since
ridkwas installed during Ruby’s installation, runningridk install 3installs the relevant packages.
Solution
Use MSYS2 to install the development packages Ruby needs to build native extensions on Windows.
Using the Dev-laptop Setup repo
I setup my laptop using https://github.com/juliusgb/dev-laptop-setup. I added MSYS2 to it in a pull request, and re-ran packer build.
Using Chocolatey
Another option is to use Chocolatey - https://community.chocolatey.org/packages/msys2.
- Open PowerShell as Administrator
- If you don’t have Ruby installed, run
choco install ruby - Run
choco install msys2 --params "/NoUpdate /InstallDir:C:\your\install\path" - Refresh the shell’s environment variables with
refreshenv - Use the RubyInstaller2
ridkto install only the development packages that Ruby needs build with C-extensions. Runridk install 3 Check that MSYS was correctly installed by running
ridk version. The output should showmsys2and the path to it.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
C:\Users\juliu>ridk version --- ruby: path: C:/opt/tools/Ruby/3.0.4/x64 version: 3.0.4 platform: x64-mingw32 cc: gcc.exe (Rev10, Built by MSYS2 project) 11.2.0 ruby_installer: package_version: 3.0.4-1 git_commit: 17502f9 msys2: path: C:\opt\msys2 cc: gcc (Rev3, Built by MSYS2 project) 12.1.0 sh: GNU bash, Version 5.1.16(1)-release (x86_64-pc-msys) os: Microsoft Windows [Version 10.0.19044.1826]
Installing gems that are built as native extensions
Running gem install http_parser.rb --version 0.6.0 works without errors