macos - La compilación de OpenSSL falla al compilar en Mac OS X 10.11
rust rust-cargo (4)
A partir de la versión 0.8 de rust-openssl, la biblioteca detectará automáticamente las bibliotecas OpenSSL instaladas por Homebrew, no es necesario establecer variables de entorno adicionales.
Si necesita admitir una versión anterior o elegir no usar Homebrew, siga leyendo.
Este es un problema conocido (también this y this ), pero no uno que la caja pueda solucionar.
La solución rápida es instalar OpenSSL con Homebrew y luego señalar explícitamente los directorios donde se encuentra OpenSSL configurando las variables de entorno
OPENSSL_INCLUDE_DIR
y
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
Si ya ha realizado una
cargo build
, primero deberá ejecutar la
cargo clean
para borrar nuestra información en caché obsoleta.
Si no desea configurar esto para cada shell que abra, agréguelo a sus archivos de inicialización de shell (como
~/.bash_profile
).
Puede hacerlo un poco menos frágil si no codifica el número de versión:
export OPENSSL_INCLUDE_DIR=$(brew --prefix openssl)/include
export OPENSSL_LIB_DIR=$(brew --prefix openssl)/lib
Si no desea utilizar Homebrew, siga el mismo proceso pero utilizando la ruta adecuada a su copia de OpenSSL.
La razón más larga está bien descrita por andrewtj :
OpenSSL no tiene un ABI estable, por lo que, por motivos de compatibilidad, Apple ha mantenido una bifurcación que es compatible con uno de los ABI anteriores. Desaprobaron OpenSSL en 10.7 y finalmente eliminaron los encabezados en 10.11 para impulsar a los desarrolladores de aplicaciones OS X a agrupar sus propios OpenSSL o usar sus marcos. Los dylibs se han dejado para que las aplicaciones que no se hayan actualizado no se rompan. Todavía puede vincularse contra ellos, pero se está abriendo a problemas de compatibilidad extraños al hacerlo (a menos que tome los encabezados de una versión anterior de OS X).
Traté de instalar el framework Iron para Rust en Mac OS X 10.11.2, pero falló cuando ejecuté la
cargo build
cargo run
o
cargo run
al compilar las cosas de
openssl
:
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
versión de
openssl
parece estar bien:
$ openssl version
OpenSSL 0.9.8zg 14 July 2015
No sé qué tengo que hacer para que esta instalación funcione y pruebe Iron.
Con Brew use así:
brew install openssl
export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include
export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib
cargo clean
cargo build
La respuesta de https://.com/a/39380733/1317564 para MacPorts:
sudo port install openssl
export OPENSSL_INCLUDE_DIR=/opt/local/include
export OPENSSL_LIB_DIR=/opt/local/lib
cargo clean
cargo build
Si tiene instalado openssl de homebrew, simplemente agregue lo siguiente a su 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" ]
y luego
cargo clean && cargo build
.
Sin romper OS X introduciendo un openssl incompatible en las rutas de carga de la biblioteca, y sin olvidar establecer / desarmar variables de entorno cuando desee compilar (o contaminar su entorno de shell cuando no esté trabajando en material Rust).
En general, un enfoque mucho más feliz y menos exasperante.
No puedo agregar esta respuesta a mi propia pregunta donde pertenece (porque depende de homebrew), porque decidió que debería cerrarse, pero responderé aquí y vincularé a esa pregunta.