iconfu iconfu iconfu is the world's largest collection of free, open-source icons and it comes with a handy image editor, so you can tweak icons to suit your needs exactly or even draw your own from scratch
invert blue resize move up verbose drawmode lighter previews remove swap animator library library draw shift up make a copy large editor explorer your icon contract agreement tag

19 October 2010

gem install mysql [--should-be-easy [--on-a-mac-anyway]]

So after upgrading to Ruby 1.9.2 and Rails 3 all at once on my shiny new Snow Leopard macbook, (a foolish thing to do! One step at a time! Isolate errors!), after patching my rails app all over the place till rails_upgrade stops whining, and after a gentle reminder to sudo gem install mysql, I get this:


=> Booting WEBrick
=> Rails 3.0.0 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-10-18 23:29:34] INFO  WEBrick 1.3.1
[2010-10-18 23:29:34] INFO  ruby 1.9.2 (2010-08-18) [x86_64-darwin10]
[2010-10-18 23:29:34] INFO  WEBrick::HTTPServer#start: pid=8426 port=3000
dyld: lazy symbol binding failed: Symbol not found: _mysql_init
  Referenced from: /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql-2.8.1/lib/mysql_api.bundle
  Expected in: flat namespace

dyld: Symbol not found: _mysql_init
  Referenced from: /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql-2.8.1/lib/mysql_api.bundle
  Expected in: flat namespace

Trace/BPT trap

A search for "lazy symbol binding failed: Symbol not found: _mysql_init" yields this, this, and this ... pointing out that you don't get the wonderful mysql gem without a *little* bit of effort ... but:


$ sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-dir=/usr/local/mysql --with-mysql-lib=/usr/local/mysql/lib --with-mysql-include=/usr/local/mysql/include --with-mysql-config=/usr/local/mysql/bin/mysql_config
Building native extensions.  This could take a while...
ERROR:  Error installing mysql:
 ERROR: Failed to build gem native extension.

/opt/local/bin/ruby extconf.rb --with-mysql-dir=/usr/local/mysql --with-mysql-lib=/usr/local/mysql/lib --with-mysql-include=/usr/local/mysql/include --with-mysql-config=/usr/local/mysql/bin/mysql_config
checking for mysql_ssl_set()... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
 --with-opt-dir
 --with-opt-include
 --without-opt-include=${opt-dir}/include
 --with-opt-lib
 --without-opt-lib=${opt-dir}/lib
 --with-make-prog
 --without-make-prog
 --srcdir=.
 --curdir
 --ruby=/opt/local/bin/ruby
 --with-mysql-config
/opt/local/lib/ruby1.9/1.9.1/mkmf.rb:368:in `try_do': The complier failed to generate an executable file. (RuntimeError)
You have to install development tools first.
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:435:in `try_link0'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:440:in `try_link'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:552:in `try_func'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:797:in `block in have_func'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:693:in `block in checking_for'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:280:in `block (2 levels) in postpone'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:254:in `open'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:280:in `block in postpone'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:254:in `open'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:276:in `postpone'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:692:in `checking_for'
 from /opt/local/lib/ruby1.9/1.9.1/mkmf.rb:796:in `have_func'
 from extconf.rb:50:in `
' Gem files will remain installed in /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql-2.8.1 for inspection. Results logged to /opt/local/lib/ruby1.9/gems/1.9.1/gems/mysql-2.8.1/ext/mysql_api/gem_make.out

"You have to install development tools first." ... thanks dudes ... but sudo port instal mysql-devel tells me Error: Port mysql_devel not found. What are these mysterious development tools?

Someone recommends copying the output of mysql_config --cflags to the ARCHFLAGS env var, but still no go:


$ mysql_config
Usage: /usr/local/mysql/bin/mysql_config [OPTIONS]
Options:
        --cflags         [-I/usr/local/mysql/include -Os -arch i386 -fno-common]
        --include        [-I/usr/local/mysql/include]
        --libs           [-L/usr/local/mysql/lib -lmysqlclient -lz -lm]
        --libs_r         [-L/usr/local/mysql/lib -lmysqlclient_r -lz -lm]
        --socket         [/tmp/mysql.sock]
        --port           [3306]
        --version        [5.0.37]
        --libmysqld-libs [-L/usr/local/mysql/lib -lmysqld -lz -lm]

$ sudo env ARCHFLAGS="-Os -arch i386 -fno-common" gem install mysql -- --with-mysql-dir=/usr/local/mysql --with-mysql-lib=/usr/local/mysql/lib --with-mysql-include=/usr/local/mysql/include --with-mysql-config=/usr/local/mysql/bin/mysql_config
all the same errors, all over again

The usual drill, I run these commands a few times to make sure they don't change their minds if I insist politely ... no bacon. But what's the deal with mysql_config5? ... it turns out that it's *not* the same as mysql_config ... it's not the same thing at all, and it has completely different output:


$ mysql_config5
Usage: /opt/local/bin/mysql_config5 [OPTIONS]
Options:
        --cflags         [-I/opt/local/include/mysql5/mysql  -pipe -fPIC    -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT  -DDONT_DECLARE_CXA_PURE_VIRTUAL]
        --include        [-I/opt/local/include/mysql5/mysql]
        --libs           [-L/opt/local/lib   -L/opt/local/lib/mysql5/mysql -lmysqlclient -L/opt/local/lib -lz -lm  -L/opt/local/lib/ -lssl -lcrypto]
        --libs_r         [-L/opt/local/lib   -L/opt/local/lib/mysql5/mysql -lmysqlclient_r -L/opt/local/lib -lz -lm   -L/opt/local/lib/ -lssl -lcrypto]
        --plugindir      [/opt/local/lib/mysql5/mysql/plugin]
        --socket         [/opt/local/var/run/mysql5/mysqld.sock]
        --port           [0]
        --version        [5.1.51]
        --libmysqld-libs [-L/opt/local/lib   -L/opt/local/lib/mysql5/mysql -lmysqld -ldl  -L/opt/local/lib -lz -lm     -L/opt/local/lib/ -lssl -lcrypto]

This looks rather serious. Let's plug these values into our gem install command and see what happens:


$ sudo env ARCHFLAGS="-I/opt/local/include/mysql5/mysql  -pipe -fPIC    -D_P1003_1B_VISIBLE -DSIGNAL_WITH_VIO_CLOSE -DSIGNALS_DONT_BREAK_READ -DIGNORE_SIGHUP_SIGQUIT  -DDONT_DECLARE_CXA_PURE_VIRTUAL" gem install mysql -- --with-mysql-dir=/usr/local/mysql --with-mysql-lib=/opt/local/lib/mysql5/mysql --with-mysql-include=/opt/local/include/mysql5/mysql --with-mysql-config=/opt/local/bin/mysql_config5
Building native extensions.  This could take a while...
Successfully installed mysql-2.8.1
1 gem installed
Installing ri documentation for mysql-2.8.1...
Installing RDoc documentation for mysql-2.8.1...

Wow! Bingo! Bring on the beer!

Well there you go I hope this helps, or at least gives you some ideas, if you're stuck with Symbol not found: _mysql_init or extconf.rb failed when you can't get your mysql gem to install.