2016-09-26 30 views
9

Mam zależność w moim pliku Cargo, która musi być inna w zależności od platformy, a konkretnie od domyślnych funkcji. Oto, co próbuję zrobić:Dlaczego ostatnia zależność od platformy ma pierwszeństwo w Cargo?

[package] 
name = "..blah.." 
version = "..blah.." 
authors = ["..blah.."] 

[target.'cfg(target_os = "macos")'.dependencies] 
hyper = { version = "0.9", default-features = false, features = ["security-framework"] } 

[target.'cfg(target_os = "linux")'.dependencies] 
hyper = { version = "0.9", default-features = true } 

Ale to nie wydaje się robić tego, co chcę. Wydaje się, że na moim Macu używałem dolnej linii docelowej, tak jakbym właśnie określił hyper = "0.9". Gdybym nie cargo build określony, pojawiają się błędy w odniesieniu do OpenSSL:

cargo: ostrzeżenie = # include <openssl/ssl.h>

Jednakże, jeśli budować to tak:

[dependencies] 
hyper = { version = "0.9", default-features = false, features = ["security-framework"] } 

Potem wszystko dobrze się układa. To wskazuje mi, że cfg dla "macos" nie działa.

Jak to zrobić, a dokładniej, jak rozwiązać problem, w którym potrzebuję zależności, aby korzystać z różnych funkcji na platformie?

+1

Dlaczego to nie jest duplikatem http://stackoverflow.com/q/29854912/155423? – Shepmaster

+0

Chyba nie jest to duplikat, ponieważ powyższa składnia wydaje się pasować do przykładów z [testów jednostkowych] (https://github.com/rust-lang/cargo/blob/master/tests/cfg.rs) i [ commit] (https://github.com/rust-lang/cargo/pull/2328/commits/f5d786e05600720ba4671caf5b598624103c8f72). – wimh

+2

@Shepmaster również w teorii próbują rozwiązać ten sam problem, więc przypuszczam, że moje pytanie brzmi: "Dlaczego mój plik Cargo nie wybiera właściwej konfiguracji dla zależności". – vcsjones

Odpowiedz

0

Wygląda na to, że nie jest to możliwe w przypadku Rust 1.13.0 i Cargo 0.13.0-nightly. Zobacz Problemy z ładunkami 3195 i 1197.

Jako obejście, można tell Cargo to use Homebrew's OpenSSL:

export OPENSSL_INCLUDE_DIR=`brew --prefix openssl`/include 
export OPENSSL_LIB_DIR=`brew --prefix openssl`/lib 
export DEP_OPENSSL_INCLUDE=`brew --prefix openssl`/include 
+0

Korzystanie z OpenSSL Homebrew jest również udokumentowane [tutaj na SO] (http://stackoverflow.com/q/34612395/155423), ale nie sądzę, że pomoże OP. Uważam, że chcą * unikać używania OpenSSL * w systemie MacOS i zamiast tego używać wbudowanego środowiska SSL. – Shepmaster

+0

Tak, dlatego powiedziałem, że nie było to możliwe w danej chwili, a reszta była obejściem problemu. Dla mojego przypadku użycia, wolę moją skrzynkę kompilować bez ręcznych modyfikacji 'Cargo.toml' zamiast komentować/odkomentowywać linię w celu połączenia z ramą ...Nie zgadzam się, że to nie jest optymalne i nie rozwiązuje problemu. –