mysql2: bundle install fails with Gem::Ext::BuildError

I’m using mysql2 gem with the Gemfile definition as

platforms :ruby do
  gem 'mysql2'
  gem 'pg', '~> 1.1'
end

But what happens is bundle install is interrupted by Gem::Ext::BuildError. All logs are as follows.

Installing mysql2 0.5.3 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

current directory: /Users/myname/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/mysql2-0.5.3/ext/mysql2
/Users/myname/.rbenv/versions/3.0.0/bin/ruby -I /Users/myname/.rbenv/versions/3.0.0/lib/ruby/3.0.0 -r
./siteconf20210305-36402-x7wk07.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... yes
checking for SSL_MODE_PREFERRED in mysql.h... yes
checking for SSL_MODE_REQUIRED in mysql.h... yes
checking for SSL_MODE_VERIFY_CA in mysql.h... yes
checking for SSL_MODE_VERIFY_IDENTITY in mysql.h... yes
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... no
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/8.0.23_1/lib
-----
creating Makefile

current directory: /Users/myname/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/myname/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/mysql2-0.5.3/ext/mysql2
make "DESTDIR="
compiling client.c
client.c:787:14: warning: incompatible pointer types passing 'VALUE (void *)' (aka 'unsigned long (void *)') to parameter of type 'VALUE
(*)(VALUE)' (aka 'unsigned long (*)(unsigned long)') [-Wincompatible-pointer-types]
  rb_rescue2(do_send_query, (VALUE)&args, disconnect_and_raise, self, rb_eException, (VALUE)0);
             ^~~~~~~~~~~~~
/Users/myname/.rbenv/versions/3.0.0/include/ruby-3.0.0/ruby/internal/iterator.h:51:25: note: passing argument to parameter here
VALUE rb_rescue2(VALUE(*)(VALUE),VALUE,VALUE(*)(VALUE,VALUE),VALUE,...);
                        ^
client.c:795:16: warning: incompatible pointer types passing 'VALUE (void *)' (aka 'unsigned long (void *)') to parameter of type 'VALUE
(*)(VALUE)' (aka 'unsigned long (*)(unsigned long)') [-Wincompatible-pointer-types]
    rb_rescue2(do_query, (VALUE)&async_args, disconnect_and_raise, self, rb_eException, (VALUE)0);
               ^~~~~~~~
/Users/myname/.rbenv/versions/3.0.0/include/ruby-3.0.0/ruby/internal/iterator.h:51:25: note: passing argument to parameter here
VALUE rb_rescue2(VALUE(*)(VALUE),VALUE,VALUE(*)(VALUE,VALUE),VALUE,...);
                        ^
2 warnings generated.
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/myname/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/gems/mysql2-0.5.3 for inspection.
Results logged to /Users/myname/.rbenv/versions/3.0.0/lib/ruby/gems/3.0.0/extensions/x86_64-darwin-19/3.0.0/mysql2-0.5.3/gem_make.out

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.3' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2

Environment

  • Bundler version 2.2.3
  • ruby 3.0.0p0

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 37 (6 by maintainers)

Commits related to this issue

Most upvoted comments

Folks seem to be mixing instructions for x86 (/usr/local/Cellar) and arm64 (for the new M1 macs) (/opt/homebrew/Cellar) brew installations, as well as different mysql versions.

Here’s a one-shot that should work for whichever approach you’ve gone (assuming a single version of mysql installed with brew):

mysql_version=$(brew list --versions mysql | tr ' ' '\n' | tail -1)
mysql_path=$(brew --cellar mysql)/$mysql_version

gem install mysql2 -- \
--with-mysql-lib=$mysql_path/lib \
--with-mysql-dir=$mysql_path \
--with-mysql-config=$mysql_path/bin/mysql_config \
--with-mysql-include=$mysql_path/include 

Though if you are having issues, understanding whether you’re installing M1 native or using the Intel x86 (emulation on new M1 chips, or native on other mac machines) is pretty important, because mixing and matching deps in different architectures won’t work!

This works for me for homebrew, inspired by @junaruga’s link. Adjust version as needed:

 rbenv exec gem install mysql2 -- \
 --with-mysql-lib=/opt/homebrew/Cellar/mysql/8.0.25_1/lib \
 --with-mysql-dir=/opt/homebrew/Cellar/mysql/8.0.25_1 \
 --with-mysql-config=/opt/homebrew/Cellar/mysql/8.0.25_1/bin/mysql_config \
 --with-mysql-include=/opt/homebrew/Cellar/mysql/8.0.25_1/include 

This also worked for me: export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/ and then try to install the gem again.

I’ve successfully installed a mysql gem with changed paths

gem install mysql2 -- \
 --with-mysql-lib=/usr/local/Cellar/mysql/8.0.23/lib \
 --with-mysql-dir=/usr/local/Cellar/mysql/8.0.23 \
 --with-mysql-config=/usr/local/Cellar/mysql/8.0.23/bin/mysql_config \
 --with-mysql-include=/usr/local/Cellar/mysql/8.0.23/include 

Adapting the suggestions above, this fixed my ability to install mysql2 with Bundler:

bundle config --global build.mysql2 "--with-cppflags=-I$(brew --prefix openssl)/include --with-ldflags=-L$(brew --prefix openssl)/lib --with-mysql-lib-$(brew --prefix mysql)/lib --with-mysql-dir=$(brew --prefix mysql) --with-mysql-config=$(brew --prefix mysql)/bin/mysql_config --with-mysql-include=$(brew --prefix mysql)/include"

This also worked for me: export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/ and then try to install the gem again.

The above Setting LIBRARY_PATH didn’t work, but the following settings worked.

export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/:$(brew --prefix openssl)/lib

This issue helped me. thank you everyone!!

Perhaps this would work then:

Gem

gem install mysql2 -- \
  --with-cppflags="-I$(brew --prefix openssl)/include -I$(brew --prefix zstd)/include" \
  --with-ldflags="-L$(brew --prefix openssl)/lib -L$(brew --prefix zstd)/lib" \
  --with-mysql-lib-$(brew --prefix mysql)/lib \
  --with-mysql-dir=$(brew --prefix mysql) \
  --with-mysql-config=$(brew --prefix mysql)/bin/mysql_config \
  --with-mysql-include=$(brew --prefix mysql)/include

Bundler

bundle config --global build.mysql2 "--with-cppflags='-I$(brew --prefix openssl)/include -I$(brew --prefix zstd)/include' --with-ldflags='-L$(brew --prefix openssl)/lib -L$(brew --prefix zstd)/lib' --with-mysql-lib-$(brew --prefix mysql)/lib --with-mysql-dir=$(brew --prefix mysql) --with-mysql-config=$(brew --prefix mysql)/bin/mysql_config --with-mysql-include=$(brew --prefix mysql)/include"

Folks seem to be mixing instructions for x86 (/usr/local/Cellar) and arm64 (for the new M1 macs) (/opt/homebrew/Cellar) brew installations, as well as different mysql versions.

Here’s a one-shot that should work for whichever approach you’ve gone (assuming a single version of mysql installed with brew):

mysql_version=$(brew list --versions mysql | tr ' ' '\n' | tail -1)
mysql_path=$(brew --cellar mysql)/$mysql_version

gem install mysql2 -- \
--with-mysql-lib=$mysql_path/lib \
--with-mysql-dir=$mysql_path \
--with-mysql-config=$mysql_path/bin/mysql_config \
--with-mysql-include=$mysql_path/include 

Though if you are having issues, understanding whether you’re installing M1 native or using the Intel x86 (emulation on new M1 chips, or native on other mac machines) is pretty important, because mixing and matching deps in different architectures won’t work!

Thank you, this is very helpful!

Folks seem to be mixing instructions for x86 (/usr/local/Cellar) and arm64 (for the new M1 macs) (/opt/homebrew/Cellar) brew installations, as well as different mysql versions.

Here’s a one-shot that should work for whichever approach you’ve gone (assuming a single version of mysql installed with brew):

mysql_version=$(brew list --versions mysql | tr ' ' '\n' | tail -1)
mysql_path=$(brew --cellar mysql)/$mysql_version

gem install mysql2 -- \
--with-mysql-lib=$mysql_path/lib \
--with-mysql-dir=$mysql_path \
--with-mysql-config=$mysql_path/bin/mysql_config \
--with-mysql-include=$mysql_path/include 

Though if you are having issues, understanding whether you’re installing M1 native or using the Intel x86 (emulation on new M1 chips, or native on other mac machines) is pretty important, because mixing and matching deps in different architectures won’t work!

Thank you, worked great. Is possible to modify the gem so future users won’t run into this issue when installing the mysql2 gem?

This also worked for me: export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/ and then try to install the gem again.

Thanks, this worked for me.

On Monterey(intel) this worked for me:

brew install mysql openssl
export LDFLAGS="-L/usr/local/opt/openssl/lib"
export CPPFLAGS="-I/usr/local/opt/openssl/include"
gem install mysql2 -v '0.5.3' \
  --source 'https://rubygems.org/' -- \
  --with-cppflags=-I/usr/local/opt/openssl/include \
  --with-ldflags=-L/usr/local/opt/openssl/lib

bundle install

Before running the gem install mysql I ran mysql --version and found my version to be 8.0.33 rather than 8.0.25_1

 rbenv exec gem install mysql2 -- \
 --with-mysql-lib=/opt/homebrew/Cellar/mysql/[YOUR VERSION HERE]/lib \
 --with-mysql-dir=/opt/homebrew/Cellar/mysql/[YOUR VERSION HERE] \
 --with-mysql-config=/opt/homebrew/Cellar/mysql/[YOUR VERSION HERE]/bin/mysql_config \
 --with-mysql-include=/opt/homebrew/Cellar/mysql/[YOUR VERSION HERE]/include 

export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/

I tried literally 10+ things and this is the only thing that did it for me!

I can also confirm that the below solution worked for me:

This also worked for me: export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/ and then try to install the gem again.

That’s more config options than you need. --with-mysql-dir automatically configures both --with-mysql-lib and --with-mysql-include, while --with-mysql-config is mutually-exclusive with the path-based configuration options.

In other words:

--with-mysql-config

OR

--with-mysql-dir

OR

--with-mysql-lib
--with-mysql-include

This also worked for me: export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/ and then try to install the gem again.

On Monteray (12.1 M1 Max chip) I also had to add openssl to my library path:

LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/:$(brew --prefix openssl)/lib/ \
bundle # or gem install mysql2

I tried several ways and was able to solve the problem 🎉

Here are what I did.

  1. I executed brew update.

  2. I increased the version of ruby.

% rbenv global 3.0.2
% rbenv version
3.0.2 (set by /Users/myusername/.rbenv/version)
  1. I executed gem install mysql2 the way shared by @junaruga and tried by @MatthiasWinkelmann and @Neodelf .

NOTE: paths are changed

% gem install mysql2 -- \
>  --with-mysql-lib=/usr/local/Cellar/mysql/8.0.25_1/lib \
>  --with-mysql-dir=/usr/local/Cellar/mysql/8.0.25_1 \
>  --with-mysql-config=/usr/local/Cellar/mysql/8.0.25_1/bin/mysql_config \
>  --with-mysql-include=/usr/local/Cellar/mysql/8.0.25_1/include

Building native extensions with: '--with-mysql-lib=/usr/local/Cellar/mysql/8.0.25_1/lib --with-mysql-dir=/usr/local/Cellar/mysql/8.0.25_1 --with-mysql-config=/usr/local/Cellar/mysql/8.0.25_1/bin/mysql_config --with-mysql-include=/usr/local/Cellar/mysql/8.0.25_1/include'
This could take a while...
Successfully installed mysql2-0.5.3
Parsing documentation for mysql2-0.5.3
Installing ri documentation for mysql2-0.5.3
Done installing documentation for mysql2 after 0 seconds
1 gem installed

At this point, I don’t know which the direct solution is. This is just a quick note. 🙏🏻

I ran into this on a new mac m1. Fresh install of homebrew, rbenv, ruby 2.5.1

Setting LIBRARY_PATH did not work for me, however, passing the MySQL directories as specified by @MatthiasWinkelmann did work.

export LIBRARY_PATH=$LIBRARY_PATH:$(brew --prefix zstd)/lib/:$(brew --prefix openssl)/lib

This was partly the solution for me. But as @letired mentioned above

brew --prefix zstd

returns

/usr/local/opt/zstd

which is not valid location where openssl is installed. Instead, I have to user this

export LIBRARY_PATH=/usr/local/Cellar/openssl@1.1/1.1.1l_1/lib

After exporting LIBRARY_PATH, bundle install works as a charm. The solution with specifying options to gem install mysql2 also works, but that does not solve the issue in the right way.

Thanks everyone!