Зависит от двоичного файла другого пакета рабочей области, создаваемого cargo

#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