2016-01-05 11 views
11

ho provato ad installare il quadro di ferro per Ruggine su Mac OS X 10.11.2, ma fallì quando corro cargo build o cargo run sulla compilazione openssl 's stuff:OpenSSL cassa fallisce la compilazione su Mac OS X 10.11

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 versione sembra OK:

$ openssl version 
OpenSSL 0.9.8zg 14 July 2015 

non so cosa devo fare per rendere questo lavoro di installazione e dare una prova di ferro.

risposta

15

A partire da rug-opensl versione 0.8, le librerie OpenSSL installate da Homebrew verranno rilevate automaticamente dalla cassa, non è necessario impostare variabili di ambiente extra.

Se è necessario supportare una versione precedente o scegliere di non utilizzare Homebrew, continua a leggere.


Questa è una known issue (anche this e this), ma non uno che la cassa può risolvere.

La soluzione rapida è quello di installare OpenSSL con Homebrew e quindi puntare in modo esplicito alle directory in cui OpenSSL è trovato impostando i OPENSSL_INCLUDE_DIR e OPENSSL_LIB_DIR variabili di ambiente:

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

Se hai già fatto un cargo build, è sarà necessario eseguire cargo clean per cancellare alcune informazioni memorizzate nella cache non aggiornate.

Se non si desidera impostarlo per ogni shell aperta, aggiungerlo ai file di inizializzazione della shell (come ~/.bash_profile). Si può rendere un po 'meno fragile da non codificare il numero di versione:

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

Se non si desidera utilizzare Homebrew, seguono lo stesso processo, ma utilizzando il percorso appropriato per la vostra copia di OpenSSL.


La ragione è più ben described by andrewtj:

OpenSSL non dispone di un ABI stabile in modo per scopi di compatibilità di Apple hanno mantenuto una forchetta che è compatibile con uno dei ABI precedenti. Hanno deprecato OpenSSL in 10.7 e alla fine hanno eliminato le intestazioni in 10.11 per spingere gli sviluppatori di app di OS X a raggruppare il proprio OpenSSL o utilizzare i loro framework. I dylibs sono stati lasciati in giro così le app che non sono state aggiornate non si rompono. Puoi comunque collegarti a loro, ma ti stai aprendo a problemi di compatibilità strana (a meno di non prendere le intestazioni da una versione precedente di OS X).

+1

Sono abbastanza sicuro che l'esecuzione di 'birra collegamento --force openssl' insieme installata' pkg -config' risolverà questo problema automaticamente. Detto questo, potrebbe non essere una buona idea rendere disponibili le librerie openssl di default, non sono sicuro. –

+0

@VladimirMatveev sì, questo è menzionato in alcuni dei problemi, ma sono anche diffidente nei confronti di qualcosa come '--force' finché non lo capisco a fondo. Spero che gli sviluppatori di Homebrew facciano tutto il duro lavoro e formino una solida raccomandazione che posso seguire. :-) – Shepmaster

+2

Bene, AFAIK in questo caso '--force' sostituisce solo l'impostazione nella formula per non creare collegamenti simbolici per impostazione predefinita. Quindi questo non dovrebbe fare nulla di pericoloso e può anche essere ripristinato da 'brew unlink'. Ma sì, non so delle conseguenze della creazione di librerie openssl disponibili in/usr/local/lib'. –

1

Se si dispone di OpenSSL di homebrew installato basta aggiungere il seguente al vostro 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" ] 

e poi cargo clean && cargo build. Nessun OS X che si rompa introducendo un openssl incompatibile nei percorsi di caricamento della libreria, e non dimenticando di impostare/annullare le variabili d'ambiente quando si vuole costruire (o inquinare il proprio env di shell quando non si lavora su roba di Rust). Tutto sommato un approccio molto più felice e meno irritante.

Non riesco a aggiungere questa risposta a my own question dove appartiene (perché dipende da homebrew), perché Shepmaster ha deciso che dovrebbe essere chiuso ma ti risponderò qui e collegherai a quella domanda.

+0

Si noti che questa soluzione (che sembra ragionevole) non sembra dipendere dall'homebrew; indipendentemente da come o dove hai installato openssl, dovresti essere in grado di aggiungere quelle variabili di configurazione. Il grande svantaggio è che si sta legando il codice solo per eseguire il proprio computer (o macchine con layout simili). Non tutti i target 'x86_64-apple-darwin' avranno gli stessi percorsi di installazione. – Shepmaster

+0

È vero, non è una dipendenza casalinga difficile, ma è necessario aver installato openssl te stesso come da El Cap, perché le intestazioni non sono disponibili per il sistema openssl (in più è troppo vecchio per essere di grande utilità). –

+0

Sì; sembra adattarsi alla citazione in fondo all'altra risposta. Cose come Fink o MacPorts sono ancora una cosa? Immagino che le persone avrebbero sempre potuto compilare la loro versione OpenSSL ... – Shepmaster

4

Con Brew uso in questo modo:

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

ha funzionato per me a partire da aprile 2017 su El Capitan OSX. Grazie – jamescampbell