#rust #rust-cargo #build-script
#Ржавчина #rust-cargo #build-script
Вопрос:
У меня есть проект рабочей области с несколькими пакетами. Два важных из них:
flowc
— который является библиотекой и двоичнымflowstdlib
flowc
это своего рода компилятор, который я создаю как часть проекта.
flowstdlib
имеет скрипт сборки, который использует flowc
встроенный двоичный файл для сборки этого пакета (генерирует «код», файлы и т. Д.), Поэтому мне нужен flowc
готовый компилятор, когда flowstdlib
он должен быть собран.
В cargo.toml
of flowstdlib
я определяю flowc
как зависимость сборки:
[build-dependencies]
flowc = {path = "../flowc", version = "0.31.0" }`
(Я пытался сделать это также зависимостью, но без изменений)
в build.rs
of flowstdlib
я ищу его в пути, и если он не найден в ../target/debug/flowc
местоположении:
let flowc = if Path::new(env!("CARGO_MANIFEST_DIR")).join("../target/debug/flowc").exists() {
"../target/debug/flowc"
} else if Simpath::new("PATH").find_type("flowc", FileType::File).is_ok() {
"flowc"
} else {
""
};
Когда я запускаю сборку, похоже, что она пытается создать несколько пакетов одновременно параллельно:
Compiling flowstdlib v0.31.0 (/Users/andrew/workspace/flow/flowstdlib)
Compiling flowsamples v0.31.1 (/Users/andrew/workspace/flow/samples)
warning: Could not find `flowc` in $PATH or `target/debug`, so cannot build flowstdlib
error: failed to run custom build command for `flowsamples v0.31.1 (/Users/andrew/workspace/flow/samples)`
и flowstdlib
сборка завершается неудачно, поскольку flowc
двоичный файл еще не собран.
Поскольку сборка продолжается и в конечном итоге завершается flowc
, если я повторно запущу сборку, она будет работать во второй раз (поскольку flowc
теперь найден двоичный файл).
Итак:
- похоже, что a
build-dependency
ожидает создания зависимого двоичного файла (возможно, он ожидает создания библиотеки, трудно сказать)
Вопрос
Как я могу заставить сборку flowstdlib
ждать завершения flowc
двоичного файла? (без принудительной непараллельной сборки)
Комментарии:
1. Я не думаю, что есть простой способ зависеть от двоичных файлов в Cargo. Рассматривали ли вы возможность рефакторинга основной логики
flowc
в библиотеку и в зависимости от этого?2. Только на прошлой неделе был опубликован RFC о добавлении поддержки зависимости от двоичных файлов в Cargo: github.com/rust-lang/rfcs/pull/3028
3. у flowc уже есть ядро в библиотеке. Затем мне нужно было бы вызвать его из build.rs без вызова двоичного файла — можно было бы сделать, но не идеально. Спасибо за идею @LambdaFairy
4. Спасибо @KevinReid, я проверю этот ПИАР и посмотрю, может ли он появиться в разумные сроки.
Ответ №1:
В ожидании отправки RFC мой обходной путь заключается в разделении сборки на две команды (в настоящее время я использую Makefile для их вызова):
* cargo build -p flowc # will complete the build of the flowc binary
* cargo build # will build the entire workspace, including flowstdlib