Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot build puma gem on OS X Yosemite

(Revised) question:

What does it take install puma gem on my OS X Yosemite (10.10.1) system? I've exhausted a bunch of avenues (I have XCode tools, I have OpenSSL), but it still fails while trying to build the native extensions.

The Problem

On my OS X system, when I do:

$ gem install puma

I get:

Building native extensions.  This could take a while...
ERROR:  Error installing puma:
        ERROR: Failed to build gem native extension.

    /Users/home/sandbox/usr/bin/ruby extconf.rb
checking for SSL_CTX_new() in -lssl... no
checking for SSL_CTX_new() in -lssleay32... no
*** 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=/Users/home/sandbox/usr/bin/ruby
        --with-puma_http11-dir
        --without-puma_http11-dir
        --with-puma_http11-include
        --without-puma_http11-include=${puma_http11-dir}/include
        --with-puma_http11-lib
        --without-puma_http11-lib=${puma_http11-dir}/lib
        --with-ssllib
        --without-ssllib
        --with-ssleay32lib
        --without-ssleay32lib

extconf failed, exit code 1

Gem files will remain installed in /Users/home/sandbox/usr/lib/ruby/gems/2.1.0/gems/puma-2.10.2 for inspection.
Results logged to /Users/home/sandbox/usr/lib/ruby/gems/2.1.0/extensions/x86_64-darwin-14/2.1.0/puma-2.10.2/gem_make.out

The Environment

I suspect that gem install is unable to locate the SSL headers and/or libraries. Here's what I've got on my system (note that ~/sandbox/usr is my "sandbox" directory, containing all executables, libraries, headers, etc for my Ruby on Rails development). Notice that "ssl.h" does define SSL_CTX_new():

$ which openssl
~/sandbox/usr/bin/openssl
$ openssl version
OpenSSL 1.0.1j 15 Oct 2014
$ openssl version -d
OPENSSLDIR: "/Users/home/sandbox/usr/ssl"
$ find ~/sandbox/usr -name "*libssl*" -print
~/sandbox/usr/lib/libssl.a
$ find ~/sandbox/usr -name "*.h" -exec grep SSL_CTX_new {} /dev/null \;
~/sandbox/usr/include/openssl/ssl.h:SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);

Also, here's how ruby was compiled. $INSTALL_DIR is ~/home/sandbox:

./configure --prefix=$(INSTALL_DIR) --enable-shared --disable-install-doc --with-opt-dir=$(INSTALL_DIR) --with-openssl-dir=$(INSTALL_DIR)/bin; where INSTALL_DIR is ~/sandbox/usr. 

The Question

Am I simply missing some configuration flags for the build process? I've tried a bunch of flags more or less at random:

$ gem install puma -- --with-openssl-dir=/Users/home/sandbox/usr/ssl
$ gem install puma -- --with-ssllib=/Users/home/sandbox/usr/lib/libssl.a 
$ gem install puma -- --with-ssl=/Users/home/sandbox/usr/bin/openssl
$ gem install puma -- --with-ssl=/Users/home/sandbox/usr/bin
$ gem install puma -- --with-opt-dir=/Users/home/sandbox/usr

but got the same error in each case. Can someone clue me in to what I'm missing?

more info...

The mkmf.log file with the error looks like this (line breaks added for readability):

"clang -o conftest 
-I/Users/home/sandbox/usr/include/ruby-2.1.0/x86_64-darwin14.0 
-I/Users/home/sandbox/usr/include/ruby-2.1.0/ruby/backward 
-I/Users/home/sandbox/usr/include/ruby-2.1.0 
-I.  
-I/Users/home/sandbox/usr/include 
-D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT    
-O3 -fno-fast-math -ggdb3 -Wall -Wextra 
-Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers 
-Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement 
-Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wextra-tokens  
-fno-common -pipe conftest.c  
-L. 
-L/Users/home/sandbox/usr/lib 
-L/Users/home/sandbox/usr/lib 
-L. -fstack-protector 
-L/Users/home/sandbox/usr/lib      
-lruby.2.1.0 -lssl  -lpthread -ldl -lobjc "

conftest.c:13:57: error: use of undeclared identifier 'SSL_CTX_new'

int t(void) { void ((*volatile p)()); p = (void ((*)()))SSL_CTX_new; return 0; }

As I grovel through my sandbox directory tree, the only header file that defines SSL_CTX_new is ~/sandbox/include/openssl/ssl.h. It appears that that file isn't being included, and I'm currently at a loss as to why.

like image 716
fearless_fool Avatar asked Dec 14 '14 01:12

fearless_fool


3 Answers

For people who are having issues with puma and openssl, particularly with Mac OS 10.11 (El Capitan), adding some flags will save you hours and hours of heartache:

gem install puma -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib

https://gist.github.com/edvinasbartkus/0e99ea8305a20737f562

like image 167
Dennis Best Avatar answered Nov 18 '22 10:11

Dennis Best


Turns out this was a bug in puma versions 2.9.2+ and has been fixed in version 2.11.0. For details, see https://github.com/puma/puma/issues/627 and https://github.com/puma/puma/pull/628.

(Note to unix users: if you're still having trouble, make sure you've have libssl-dev installed first.)

like image 39
fearless_fool Avatar answered Nov 18 '22 08:11

fearless_fool


I had a similar issue on OSx El Capitan. Here's what has helped me:

brew install openssl
brew link --force openssl
like image 1
Konstantin Rudy Avatar answered Nov 18 '22 10:11

Konstantin Rudy