LINUX.ORG.RU

Включение фич зависимостей в зависимости от платформы

 , ,


0

2

Играюсь с Rust и захотел собирать пет-проект одновременно для и натива и под WASM. Проект использует SDL2, при сборке под натив используются фичи «bundled» и «static-link», однако они не совместимы с WASM. Пытаюсь сделать так:

[target.'cfg(not(target_os = "emscripten"))'.dependencies]
sdl2 = { version = "0.34.5", features = ["bundled", "static-link"] }

[target.'cfg(target_os = "emscripten")'.dependencies]
sdl2 = { version = "0.34.5", features = [] }

Однако, это не работает - sdl2 подключается с активированными фичами даже при сборке под emscripten (в итоге сборка падает). А надо, чтобы при сборке под emscripten фичи были отключены.

Всё начинает работать только если вообще убрать первую конфигурацию из файла Cargo.toml, но я всё же хочу их использовать при нативной сборке.

P. S.: Команда сборки под WASM:

cargo.exe build --target wasm32-unknown-emscripten ...

Как быть?

★★★★★

Последнее исправление: KivApple (всего исправлений: 4)

Можно сделать отдельный каталог с новым проектом и с совершенно новым Cargo.toml, где просто выставить нужные фичи, а потом прописать

[lib]
path = "../мой-пупер-супер-проект/src/lib.rs"

Тогда получается, что будут два разных проекта, каждый со своими настройками, но оба смотрят на один и тот же исходный код. В исходном коде можно разруливать, что к чему относится, через cfg.

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

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

anonymous
()
Ответ на: комментарий от anonymous

Не совсем понял как это поможет сделать автоматическое детектирование конфигурации? Так то я вообще могу через features у проекта задать нужные флаги зависимостей и включать фичу «static» прямой передачей параметра в cargo build.

KivApple ★★★★★
() автор топика

Сделай

[dependencies]
sdl2 = { version = "0.34.5", optional = true }

[features]
# никогда не приходилось сразу две фичи так включать, хз сработает ли
on_wasm = ["sdl2/bundled", "sdl2/static-link"]
default = ["sdl2"]

И собирай cargo build --target=... --features=...

vlad9486
()
Ответ на: комментарий от vlad9486

Да, это сработало. При этом даже default не нужен. Только в моём случае наоборот мне надо везде, кроме wasm включать «sdl2/bundled», «sdl2/static-link», а на wasm не использовать дополнительные фичи пакета sdl2.

KivApple ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.