2017-01-18 3 views
3

Ich bin auf einem AMD-Debian-Rechner und versuche, eine ausführbare Datei x86_64-unknown-linux-musl zu erstellen. Ich habe dies in meinem Cargo.toml:Wie man eine ausführbare Datei erstellt, die von curl für x86_64-unknown-linux-musl abhängt

[dependencies] 
curl = "0.4" 

Als ich cargo build --target=x86_64-unknown-linux-musl laufen bekomme ich dieses:

error: failed to run custom build command for `libz-sys v1.0.10` 
process didn't exit successfully: `/tmp/foo/target/debug/build/libz-sys-c20da5f29c41e515/build-script-build` (exit code: 101) 
--- stdout 
OPT_LEVEL = Some("0") 
PROFILE = Some("debug") 
TARGET = Some("x86_64-unknown-linux-musl") 
debug=true opt-level=0 
HOST = Some("x86_64-unknown-linux-gnu") 
TARGET = Some("x86_64-unknown-linux-musl") 
TARGET = Some("x86_64-unknown-linux-musl") 
HOST = Some("x86_64-unknown-linux-gnu") 
CC_x86_64-unknown-linux-musl = None 
CC_x86_64_unknown_linux_musl = None 
TARGET_CC = None 
CC = None 
HOST = Some("x86_64-unknown-linux-gnu") 
CROSS_COMPILE = None 
TARGET = Some("x86_64-unknown-linux-musl") 
HOST = Some("x86_64-unknown-linux-gnu") 
CFLAGS_x86_64-unknown-linux-musl = None 
CFLAGS_x86_64_unknown_linux_musl = None 
TARGET_CFLAGS = None 
CFLAGS = None 
running: "./configure" "--prefix=/tmp/foo/target/x86_64-unknown-linux-musl/debug/build/libz-sys-e109627694e9981e/out" 
Compiler error reporting is too harsh for ./configure (perhaps remove -Werror). 
** ./configure aborting. 

--- stderr 
thread 'main' panicked at 'failed to run successfully: exit code: 1', /home/tshepang/.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.0.10/build.rs:189 

Wenn ich es erneut ausführen:

error: failed to run custom build command for `openssl-sys v0.9.6` 
process didn't exit successfully: `/tmp/foo/target/debug/build/openssl-sys-ac9c042b062dad1d/build-script-build` (exit code: 101) 
--- stderr 
thread 'main' panicked at ' 

Could not find directory of OpenSSL installation, and this `-sys` crate cannot 
proceed without this knowledge. If OpenSSL is installed and this crate had 
trouble finding it, you can set the `OPENSSL_DIR` environment variable for the 
compilation process. 

If you're in a situation where you think the directory *should* be found 
automatically, please open a bug at https://github.com/sfackler/rust-openssl 
and include information about your system as well as this message. 

    $HOST = x86_64-unknown-linux-gnu 
    $TARGET = x86_64-unknown-linux-musl 
    openssl-sys = 0.9.6 

Alle funktioniert gut, wenn Ich baue nativ, dh cargo build --target=x86_64-unknown-linux-gnu.

Suche um, ich über eine Umgebungsvariable gelernt, PKG_CONFIG_ALLOW_CROSS:

PKG_CONFIG_ALLOW_CROSS=true cargo build --target=x86_64-unknown-linux-musl 

, das zu tun, fand ich auch, dass ich das Debian-Paket fehlte namens libcurl4-openssl-dev.

Lauf ldd target/target/x86_64-unknown-linux-musl/debug/foo die ausführbare Datei angezeigt wird dynamisch verknüpft, dann Suche weiter, habe ich gelernt, über eine andere Umgebungsvariable, PKG_CONFIG_ALL_STATIC:

PKG_CONFIG_ALL_STATIC=true PKG_CONFIG_ALLOW_CROSS=true cargo build --target=x86_64-unknown-linux-musl 

, dass eine ganze Reihe von fehlenden deps enthüllt, von denen alle (zum Glück) hatte Debian-Abhängigkeiten. Aber die Installation aller von ihnen hat nicht geholfen, als, am Ende, ich saß immer noch mit einer ausführbaren Datei, die nicht statisch verknüpft war.

Antwort

2

ich nachgab und schließlich cross mit:

cargo install cross 
cross build --target=x86_64-unknown-linux-musl 

Das war einfach zu leicht, und Sie werden die ausführbare Datei in target/x86_64-unknown-linux-musl/debug finden.

1

Die curl Kiste hängt (direkt oder indirekt) von den beiden Kisten libz-sys und openssl-sys ab. Eine Kiste, deren Name mit "-sys" endet, ist im Allgemeinen eine Menge von FFI-Bindungen (Fremdfunktionsschnittstelle) an eine native C-Bibliothek.

Der Aufbau einer solchen "-sys" -Kiste erfordert eine Verknüpfung mit der nativen Bibliothek. Wenn Ihr Ziel x86_64-unknown-linux-musl lautet, müssen Sie eine Verbindung zu einer nativen Bibliothek herstellen, die gegen musl und nicht gegen glic erstellt wurde. Die meisten Pakete, die Sie in den Repositories Ihrer Distribution finden, stellen jedoch Bibliotheken bereit, die auf glibc basieren.

Die Lösung besteht darin, die Bibliotheken zu erstellen, die Sie benötigen, und die Verbindung zu musl statt glibc herzustellen.

Ich habe keinen Zugriff auf eine Debian-Installation, aber auf Ubuntu 16.04 dies sieht wie folgt für OpenSSL:

# this package provides the "musl-gcc" wrapper 
apt-get install musl-tools 
# you will also need these, if they are not installed yet 
apt-get install pkg-config xutils-dev build-essential 

# Download and build OpenSSL against musl 
VERS=1.0.2j 
export CC=musl-gcc 
export MUSL_PREFIX=/usr/local/musl 
export C_INCLUDE_PATH="$MUSL_PREFIX/include/" 
curl -O https://www.openssl.org/source/openssl-$VERS.tar.gz 
tar xvzf openssl-$VERS.tar.gz 
cd openssl-$VERS 

./config --prefix "$MUSL_PREFIX" 
make depend 
make 
sudo make install 

export OPENSSL_DIR=/usr/local/musl/ 
export OPENSSL_STATIC=1 

Sobald Sie eine das gleiche für libz haben (ich habe es nicht versucht gebaut), sollten Sie dann in der Lage sein, Ihre Kiste zu bauen:

cargo build --target=x86_64-unknown-linux-musl 

und die resultierende binäre wird in target/x86_64-unknown-linux-musl/debug/<binary_name>

Das Tool cross funktioniert grundsätzlich, aber in einem Docker-Container, um Ihre Host-Maschine sauber zu halten.

Die von diesem Build produzierte Binärdatei sollte statisch verknüpft sein und nicht einmal von glibc abhängen. Dies bedeutet auch, dass es größer sein wird * und dass Sie selbst darauf achten müssen, alle Abhängigkeiten (insbesondere OpenSSL) zu aktualisieren, wenn ein Sicherheitsproblem in einem von ihnen gefunden wird.

* Sie können strip für die freigegebene Binärdatei verwenden.

Verwandte Themen