Describa el problema que está tratando de resolver
Estoy escribiendo un proyecto que usa zmq
y zmq-sys
que deben compilarse de forma cruzada para arm-unknown-linux-gnueabi
.
zmq-sys
no compila libzmq por sí solo, pero podemos especificar lib e incluir directorios usando LIBZMQ_LIB_DIR
y LIBZMQ_INCLUDE_DIR
. Sin embargo , el build.rs zmq
requiere zmq-sys
, lo que significa que también necesito un binario compilado para el objetivo de x86_64-unknown-linux-gnu
. Así que no puedo simplemente usar las variables de entorno de zmq-sys
ya que LIBZMQ_LIB_DIR
apuntará a un directorio incorrecto.
Hice la siguiente solución:
[target.arm-unknown-linux-gnueabi]
linker = "arm-none-linux-gnueabi-gcc"
[target.arm-unknown-linux-gnueabi.zmq]
rustc-link-search = ["native=/home/user/zmq-example/vendor/libzmq/lib/arm"]
rustc-link-lib = ["static=zmq", "dylib=stdc++"]
[target.x86_64-unknown-linux-gnu.zmq]
rustc-link-search = ["native=/home/user/zmq-example/vendor/libzmq/lib/x86_64"]
rustc-link-lib = ["static=zmq", "dylib=stdc++"]
El problema con la solución anterior es que todos los desarrolladores deben tener la misma ruta absoluta a los archivos binarios compilados.
Describa la solución que le gustaría
Me gustaría tener una forma de definir una ruta relativa en rustc-link-search
.
Otra solución podría ser una forma de definir variables de entorno por destino.
Estoy un poco confundido acerca de la solicitud de rutas relativas. Las rutas deben admitir ser relativas a la raíz del paquete. ¿Eso no te funciona?
Tienes razón, así que déjame reformular: ¿Hay alguna manera de proporcionar rutas que sean relativas a la raíz de mi proyecto ( /home/user/zmq-example
) en lugar de la raíz del paquete zmq-sys
( /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/zmq-sys-0.9.0
).
No quiero tener rutas absolutas de la raíz de mi proyecto en .cargo/config
ya que restringe a otros desarrolladores.
Así que tengo una solución para este problema. Estoy compilando DBus de forma cruzada y tengo el mismo problema que usted: tengo que apuntar el rustc-link-search
a algún lugar dentro de mi repositorio, relativo a la raíz del repositorio, no relativo a donde Cargo extrajo el paquete.
En resumen, debe usar un script de compilación build.rs
para establecer rustc-link-search
.
Este es mi archivo Cargo config
:
[build]
target = "armv7-unknown-linux-gnueabihf"
[target.armv7-unknown-linux-gnueabihf.dbus]
rustc-link-search = [
# Provided by the build script.
]
rustc-link-lib = [
"dbus-1",
"gcrypt",
"gpg-error",
"lz4",
"lzma",
"pcre",
"selinux",
"systemd",
]
Y este es mi script de compilación build.rs
:
use std::env::var;
fn main() {
let manifest_dir = var("CARGO_MANIFEST_DIR").unwrap();
println!("cargo:rustc-link-search={}/libraries/lib/arm-linux-gnueabihf", manifest_dir);
println!("cargo:rustc-link-search={}/libraries/usr/lib/arm-linux-gnueabihf", manifest_dir);
}
La variable de entorno CARGO_MANIFEST_DIR
apunta a la caja con el script de compilación, y coloqué las bibliotecas externas en una carpeta libraries
allí. Después de hacer esto, la compilación vuelve a funcionar, no más rutas absolutas codificadas.
Además, en su caso, también tendría que leer la variable de entorno TARGET
y establecer las rutas de acuerdo con ella.
Comentario más útil
Así que tengo una solución para este problema. Estoy compilando DBus de forma cruzada y tengo el mismo problema que usted: tengo que apuntar el
rustc-link-search
a algún lugar dentro de mi repositorio, relativo a la raíz del repositorio, no relativo a donde Cargo extrajo el paquete.En resumen, debe usar un script de compilación
build.rs
para establecerrustc-link-search
.Este es mi archivo Cargo
config
:Y este es mi script de compilación
build.rs
:La variable de entorno
CARGO_MANIFEST_DIR
apunta a la caja con el script de compilación, y coloqué las bibliotecas externas en una carpetalibraries
allí. Después de hacer esto, la compilación vuelve a funcionar, no más rutas absolutas codificadas.Además, en su caso, también tendría que leer la variable de entorno
TARGET
y establecer las rutas de acuerdo con ella.