Cargo: Agregue una forma de definir rutas relativas en rustc-link-search

Creado en 7 mar. 2019  ·  3Comentarios  ·  Fuente: rust-lang/cargo

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.

C-feature-request

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 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.

Todos 3 comentarios

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.

¿Fue útil esta página
0 / 5 - 0 calificaciones