Как мне сказать cargo использовать кастомную цель сборки?

Вопрос или проблема

Сейчас я следую этому руководству по созданию простого Rust ОС. Как указано автором, я создал файл json с именем x86_64-simple_os.json со следующим содержимым:

{
    "llvm-target": "x86_64-unknown-none",
    "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128",
    "arch": "x86_64",
    "target-endian": "little",
    "target-pointer-width": "64",
    "target-c-int-width": "32",
    "os": "none",
    "executables": true,
    "linker-flavor": "ld.lld",
    "linker": "rust-lld",
    "panic-strategy": "abort",
    "disable-redzone": true,
    "features": "-mmx,-sse,+soft-float"
}

У меня также есть файл TOML в .cargo/config.toml со следующим содержимым:

[unstable]
build-std = ["core", "compiler_builtins"]

[build]
target = "x86_64-simple_os.json"

Мой файл Cargo.toml содержит:

[package]
name = "simple_os"
version = "0.1.0"
edition = "2021"

[profile.dev]
panic = "abort"

[profile.release]
panic = "abort"

[dependencies]

И у меня есть файл rust-toolchain, который указывает, что я использую сборку nightly. На этапе руководства, на котором я нахожусь (здесь), я ожидал, что оно будет компилироваться. Или если я попробую вернуться на шаг назад и удалить [unstable] build-std = ["core", "compiler_builtins"], я должен получить следующую ошибку:

> cargo build --target x86_64-simple_os.json

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

Однако я получаю только следующую ошибку:

$ cargo build --target x86_64-simple_os.json
error: failed to run `rustc` to learn about target-specific information

Caused by:
  process didn't exit successfully: `C:\Users\12081\.rustup\toolchains\nightly-x86_64-pc-windows-msvc\bin\rustc.exe - --crate-name ___ --print=file-names --target '\\?\C:\Users\12081\OSTutorial\simple_os\x86_64-simple_os.json' --crate-type bin --crate-type rlib --crate-type dylib --crate-type cdylib --crate-type staticlib --crate-type proc-macro --print=sysroot --print=split-debuginfo --print=crate-name --print=cfg` (exit code: 1)
  --- stderr
  error: Error loading target specification: expected value at line 1 column 1. Run `rustc --print target-list` for a list of built-in targets

Я посмотрел в интернете, и единственный раз, когда я нашел что-либо, хоть сколько-нибудь связанное с моей проблемой, был, когда я начал читать этот вопрос. Однако этот вопрос и связанный с ним ответ были почти 7 лет назад, и в руководстве есть совершенно новая версия с обновлениями за 8 месяцев назад.

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

(Отредактировано, чтобы исправить сломанную ссылку)

Ответ или решение

Чтобы указать Cargo использовать настраиваемую цель сборки, необходимо выполнить несколько шагов. Ваша установка выглядит почти правильной, но есть несколько деталей, которые следует проверить и исправить. Давайте подробно рассмотрим необходимые шаги и возможные проблемы, которые могли возникнуть в вашем случае.

1. Создание конфигурационного файла цели

Вы уже создали JSON-файл целевой конфигурации x86_64-simple_os.json. Убедитесь, что он корректно расположен в вашем проекте. Обычно его помещают в директорию проекта, но можно указать путь до файла при сборке. Проверьте, чтобы содержимое файла было корректным JSON, а также соответствовало требованиям вашего проекта и архитектуры:

{
    "llvm-target": "x86_64-unknown-none",
    "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128",
    "arch": "x86_64",
    "target-endian": "little",
    "target-pointer-width": "64",
    "target-c-int-width": "32",
    "os": "none",
    "executables": true,
    "linker-flavor": "ld.lld",
    "linker": "rust-lld",
    "panic-strategy": "abort",
    "disable-redzone": true,
    "features": "-mmx,-sse,+soft-float"
}

2. Настройка файла конфигурации Cargo

Ваш файл .cargo/config.toml выглядит в целом правильно. Однако убедитесь в следующем:

  • Убедитесь, что файл .cargo/config.toml находится в корневой директории вашего проекта.
  • Проверьте секцию [build], чтобы она ссылалась на правильное имя файла и соответствовала вашему формату. Запись должна выглядеть следующим образом:
[build]
target = "x86_64-simple_os.json"

3. Проверьте наличие других файлов конфигурации

Убедитесь, что файлы конфигурации вашего проекта не содержат ошибок и всё правильно настроено. Особое внимание обратите на:

  • rust-toolchain: Убедитесь, что файл действительно существует в корне проекта и содержит только одно слово nightly. Никаких дополнительных символов или пробелов быть не должно.

4. Установка зависимостей

Если вы собираетесь использовать нестандартные зависимости, убедитесь, что они правильно указаны. Использование [unstable] build-std = ["core", "compiler_builtins"] рекомендуется для целей, где стандартная библиотека Rust не доступна. Если после этого возникла ошибка с не найденной библиотекой core, это может означать, что Cargo не распознает вашу цель.

5. Компиляция с указанием цели

Запустите сборку, используя команду, которая явно указывает на целевую конфигурацию:

cargo build --target x86_64-simple_os.json

6. Дополнительные проверки

Если при выполнении предыдущих шагов возникает ошибка, попробуйте выполнить следующие действия:

  • Убедитесь, что ваша версия Rust обновлена. Выполните rustup update nightly.
  • Проверьте, правильно ли настроена переменная окружения CARGO_TARGET_DIR, если она используется. Не должно быть конфликтов путей, которые могли бы мешать сборке.
  • Запустите команду rustc --print target-list, чтобы убедиться, что ваши настраиваемые цели корректно обрабатываются.

7. Специфика ошибок

Если вы видите ошибку:

error: failed to run `rustc` to learn about target-specific information

Это обычно связано с проблемами в вашем целевом файле или его расположении. Убедитесь, что путь к файлу корректный, а сам файл соответствует ожидаемому формату.

8. Заключительные рекомендации

Если все вышеперечисленные шаги не дали результата, рассмотрите возможность создания минимального примера и повторной проверки всех шагов на новой, чистой установке Rust. Это может помочь выявить возможные проблемы, связанные с вашей текущей конфигурацией или окружением.

Следуя этим шагам, вы сможете успешно настроить Cargo для использования пользовательской цели сборки и продолжить разработку вашей операционной системы на Rust.

Оцените материал
Добавить комментарий

Капча загружается...