Ячейка OpenSSL не скомпилирована в Mac OS X 10.11

Я попытался установить Iron framework для Rust на Mac OS X 10.11.2, но он не удался, когда я запускал cargo build или cargo run при компиляции openssl stuff:

failed to run custom build command for `openssl-sys-extras v0.7.4`
Process didn't exit successfully: `/xxx/rust/hello/target/debug/build/openssl-sys-extras-413d6c73b37a590d/build-script-build` (exit code: 101)
--- stdout
TARGET = Some("x86_64-apple-darwin")
OPT_LEVEL = Some("0")
PROFILE = Some("debug")
TARGET = Some("x86_64-apple-darwin")
debug=true opt-level=0
HOST = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
HOST = Some("x86_64-apple-darwin")
CC_x86_64-apple-darwin = None
CC_x86_64_apple_darwin = None
HOST_CC = None
CC = None
HOST = Some("x86_64-apple-darwin")
TARGET = Some("x86_64-apple-darwin")
HOST = Some("x86_64-apple-darwin")
CFLAGS_x86_64-apple-darwin = None
CFLAGS_x86_64_apple_darwin = None
HOST_CFLAGS = None
CFLAGS = None
running: "cc" "-O0" "-ffunction-sections" "-fdata-sections" "-g" "-m64" "-fPIC" "-o" "/xxx/rust/hello/target/debug/build/openssl-sys-extras-413d6c73b37a590d/out/src/openssl_shim.o" "-c" "src/openssl_shim.c"
ExitStatus(Code(1))


command did not execute successfully, got: exit code: 1



--- stderr
src/openssl_shim.c:1:10: fatal error: 'openssl/hmac.h' file not found
#include <openssl/hmac.h>
     ^
1 error generated.
thread '<main>' panicked at 'explicit panic', /xxx/.cargo/registry/src/github.com-0a35038f75765ae4/gcc-0.3.21/src/lib.rs:772

openssl версия выглядит нормально:

$ openssl version
OpenSSL 0.9.8zg 14 July 2015

Я не знаю, что мне нужно сделать, чтобы сделать эту установку и дать Iron попробовать.

Ответ 1

Как и в случае версии rust-openssl 0.8, библиотеки OpenSSL, установленные в OpenbL, будут автоматически обнаружены ящиком, нет необходимости устанавливать дополнительные переменные среды.

Если вам нужно поддерживать версию до этого или не использовать Homebrew, читайте дальше.


Это известная проблема (также this и this), но не тот, который может исправить ящик.

Быстрое решение - установить OpenSSL с помощью Homebrew, а затем явно указать на каталоги, где обнаружен OpenSSL, установив переменные среды OPENSSL_INCLUDE_DIR и OPENSSL_LIB_DIR:

OPENSSL_INCLUDE_DIR=/usr/local/Cellar/openssl/1.0.2e/include \
OPENSSL_LIB_DIR=/usr/local/Cellar/openssl/1.0.2e/lib \
cargo build

Если вы уже сделали один cargo build, сначала нужно запустить cargo clean, чтобы очистить нашу устаревшую кешированную информацию.

Если вы не хотите устанавливать это для каждой открытой оболочки, добавьте ее в файлы инициализации оболочки (например, ~/.bash_profile). Вы можете сделать его немного менее хрупким, не жестко кодируя номер версии:

export OPENSSL_INCLUDE_DIR=$(brew --prefix openssl)/include
export OPENSSL_LIB_DIR=$(brew --prefix openssl)/lib

Если вы не хотите использовать Homebrew, выполните один и тот же процесс, но используя соответствующий путь к вашей копии OpenSSL.


Более длинная причина хорошо описывается andrewtj:

OpenSSL не имеет стабильного ABI, поэтому в целях совместимости Apple поддерживает вилку, совместимую с одним из предыдущих ABI. Они отказались от OpenSSL в 10.7 и, наконец, сбросили заголовки в 10.11, чтобы подтолкнуть разработчиков приложений OS X к объединению своего OpenSSL или использованию их фреймворков. Дилибы остались, поэтому приложения, которые не были обновлены, не сломаются. Вы по-прежнему можете ссылаться на них, но вы открываете себе проблемы с нечетной совместимостью, делая это (если вы не захватите заголовки из более ранней версии OS X).

Ответ 2

С Brew используйте вот так:

brew install openssl
export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib
cargo clean
cargo build

Ответ 3

Если у вас есть встроенный opensl, просто добавьте следующее в свой Cargo.toml:

[target.x86_64-apple-darwin.openssl-sys]
rustc-link-search = [ "/usr/local/opt/openssl/lib" ]
rustc-link-lib = [ "ssl", "crypto" ]
include = [ "/usr/local/opt/openssl/include" ]

а затем cargo clean && cargo build. Не нарушать OS X, введя несовместимые openssl в пути загрузки библиотеки и не забывая устанавливать/отменять переменные среды, когда вы хотите построить (или загрязнять среду оболочки, когда не работаете с материалами Rust). В целом гораздо более счастливый и менее беспризорный подход.

Я не могу добавить этот ответ в мой собственный вопрос, где он принадлежит (потому что он зависит от доморощенного), потому что Shepmaster решил, что он должен быть закрыт, но я отвечу здесь и свяжусь с этим вопросом.

Ответ 4

fooobar.com/info/501347/... ответ для MacPorts:

sudo port install openssl
export OPENSSL_INCLUDE_DIR=/opt/local/include
export OPENSSL_LIB_DIR=/opt/local/lib
cargo clean
cargo build