Подтвердить что ты не робот

Невозможно построить жемчужину puma на OS X Yosemite

(пересмотренный) вопрос:

Что нужно для установки жемчужины puma в моей системе OS X Yosemite (10.10.1)? Я исчерпал кучу проспектов (у меня есть инструменты XCode, у меня OpenSSL), но он все еще терпит неудачу, пытаясь построить собственные расширения.

Проблема

В моей системе OS X, когда я делаю:

$ gem install puma

Я получаю:

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

Окружающая среда

Я подозреваю, что gem install не может найти заголовки и/или библиотеки SSL. Вот что я получил в своей системе (обратите внимание, что ~/sandbox/usr - это моя "песочница", содержащая все исполняемые файлы, библиотеки, заголовки и т.д. Для моей разработки Ruby on Rails). Обратите внимание, что "ssl.h" определяет 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);

Кроме того, здесь был скомпилирован ruby. $INSTALL_DIR - ~/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. 

Вопрос

Мне просто не хватает некоторых флагов конфигурации для процесса сборки? Я попробовал кучу флагов более или менее наугад:

$ 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

но получал ту же ошибку в каждом случае. Может кто-нибудь подскажет мне, чего я не хватает?

подробнее...

Файл mkmf.log с ошибкой выглядит так (разрывы строк добавлены для чтения):

"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; }

По мере того, как я разбираюсь в дереве каталогов sandbox, единственным файлом заголовка, который определяет SSL_CTX_new, является ~/sandbox/include/openssl/ssl.h. Похоже, что этот файл не включен, и я в настоящее время не понимаю, почему.

4b9b3361

Ответ 1

Оказывается, это была ошибка в версиях puma версии 2.9.2+ и исправлена ​​в версии 2.11.0. Подробнее см. https://github.com/puma/puma/issues/627 и https://github.com/puma/puma/pull/628.

(Примечание для пользователей unix: если у вас все еще есть проблемы, убедитесь, что у вас установлен libssl-dev.)

Ответ 2

Для людей, у которых возникают проблемы с puma и openssl, особенно с Mac OS 10.11 (El Capitan), добавление некоторых флагов сэкономит вам часы и часы душевной боли:

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

Ответ 3

У меня была аналогичная проблема с OSx El Capitan. Вот что мне помогло:

brew install openssl
brew link --force openssl

Ответ 4

Была ли ваша установка Ruby настроена с помощью --with-openssl-dir? (Обычно это не очень интересная часть процесса.) Вы можете require 'openssl'?

Я могу установить puma с аналогичной конфигурацией без каких-либо флагов. (И я думаю, что наличие OpenSSL, установленного в вашем домашнем каталоге, является мудрым решением.)