Условная компиляция для скрипта Rust build.rs? - PullRequest
3 голосов
/ 18 марта 2019

Язык Rust поддерживает условную компиляцию с использованием таких атрибутов, как #[cfg(test)]. Rust также поддерживает сценарии сборки с использованием файла build.rs для запуска кода в рамках процесса сборки для подготовки к компиляции.

Я хотел бы использовать условную компиляцию в коде Rust для условной компиляции в зависимости от того, компилируем ли мы для сценария сборки, аналогично тому, как это возможно для test сборок.

Представьте себе следующее:

#[cfg(build)]
fn main() {
    // Part of build script
}

#[cfg(not(build))]
fn main() {
    // Not part of build script, probably regular build
}

Это не работает, потому что build не является допустимым идентификатором здесь. Можно ли сделать это, используя другой атрибут, или можно использовать какой-то другой прием для достижения чего-то похожего?


Для некоторого контекста по этому вопросу:
Моя цель - генерировать сценарии завершения оболочки через clap во время компиляции. У меня есть довольно полное определение App для нескольких файлов в приложении. Я хотел бы использовать это в build.rs, включив эти части с помощью макроса include!(...) (как предложил от clap), поэтому мне не нужно определять App во второй раз , Это вытягивает некоторые зависимости, которые я хотел бы исключить, когда они используются файлом build.rs, так как в этом случае они не нужны. Это - это то, что я пытаюсь сделать доступным в моем build.rs сценарии.

1 Ответ

0 голосов
/ 19 марта 2019

Вы можете просто поместить код сборки в build.rs (или, по-видимому, build.rs объявить мод xyz для загрузки другого файла).

Интересно, вы пытаетесь задать вопрос:вы можете ссылаться на один и тот же код из build.rs и main.rs, и если да, то этот код может сказать, вызывается ли он одним или другим.Кажется, вы можете включить переменную окружения, установленную при использовании build.rs (например, option_env, но, возможно, более удачный способ - включить функцию в основном коде из build.rs.

(Прочтите документацию для сценариев сборки , если вы этого еще не сделали.)

...