Замена встроенного компилятора не может найти стандартный ящик

Я пытаюсь выполнить замену встроенного компилятора. Вот мой исходный код.

#![feature(rustc_private)]
#![feature(link_args)]

extern crate rustc_driver;

fn main() {
    rustc_driver::set_sigpipe_handler();
    rustc_driver::main();
}

На самом деле это точная копия rustc исходного кода. Я построил, установил и экспортировал этот инструмент, используя переменную среды.

cargo install
export RUSTC=tool1    # `tool1` is name of binary

И я попробовал построить другой проект example1. Вот исходный код example1.

fn main() {}

Сборка завершилась ошибкой.

error[E0463]: can't find crate for `std`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0463`.
error: Could not compile `foo2`.

To learn more, run the command again with --verbose.

Я подтвердил, что example1 хорошо собран с нормальным cargo. Ломается только с tool1. (export RUSTC=tool1) Если я unset RUSTC, снова работает.

Кажется, я совершил какую-то ошибку, но не могу понять, в чем именно. Как заставить его работать?


Вот моя информация об инструменте.

rustc -V
rustc 1.28.0-nightly (a1d4a9503 2018-05-20)

cargo -V
cargo 1.28.0-nightly (f352115d5 2018-05-15)

Вот полный пример исходного кода.


person eonil    schedule 21.05.2018    source источник


Ответы (2)


Проверка tool1 требований к разделяемым библиотекам показывает, что система не может найти разделяемые библиотеки Rust (я работаю в системе Linux, поэтому использую ldd):

> ldd /home/adona/.cargo/bin/tool1
    linux-vdso.so.1 =>  (0x00007ffed5938000)
    librustc_driver-aabc67f1ff8e0e97.so => not found
    libstd-46fff00efefae8a8.so => not found
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa2d6f54000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fa2d7521000)

Установите RUSTFLAGS с опцией -L, если вы хотите построить через cargo, например:

export RUSTFLAGS="-L $HOME/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib"

Если вы хотите использовать tool1 непосредственно из командной строки, вам необходимо настроить путь к библиотеке компоновщика с помощью команды ldconfig или переменной LD_LIBRARY_PATH env:

export LD_LIBRARY_PATH=$HOME/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib:$LD_LIBRARY_PATH
person attdona    schedule 22.05.2018
comment
Большое спасибо. Это работает! И просто примечание для macOS. Используйте otool -L вместо ldd. Файлы библиотеки должны находиться в $HOME/.rustup/toolchains/nightly-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib. - person eonil; 23.05.2018

Просто предположение, но я думаю, что ваш tool1 не установлен в той же папке, что и rustc. Обратите внимание, что у вас может быть исполняемый файл с именем rustc в папке вашего грузового бункера рядом с вашим tool1, но этот rustc, вероятно, является rustup оболочкой, которая перенаправляет на настоящий компилятор где-то в папке вашей инструментальной цепочки (вероятно, $HOME/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/rustc).

Вам нужно будет либо установить tool1 в папку цепочки инструментов, либо вызвать ее с аргументом -L, указывающим на библиотеки цепочки инструментов (возможно, $HOME/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib).

person Jmb    schedule 22.05.2018