Skip to content

Instantly share code, notes, and snippets.

@sshaplygin
Created October 27, 2026 16:59
Show Gist options
  • Select an option

  • Save sshaplygin/47392f71db7ad59977a94280f91a333f to your computer and use it in GitHub Desktop.

Select an option

Save sshaplygin/47392f71db7ad59977a94280f91a333f to your computer and use it in GitHub Desktop.
Rustcon build examples
#!/usr/bin/env bash
# Собирает примеры с ветки ya-rs стоковым rustc, повторяя схему флагов из
# build/conf/rust.conf:
#
# rustc -o $Tgt $FLAGS --edition $EDITION src/... \
# -L $RUST_STD -L ${BINDIR}/deps -L native=${BINDIR}/native \
# $_RUST_CRATE_EXTERNS
#
# Это не `ya make`: движок сборки, кеш и распределёнка тут не участвуют.
# Проверяется ровно то, про что доклад: схема имён и флагов.
set -u
REPO=${1:?укажите путь к чекауту yatool}
EX=$REPO/devtools/examples/tutorials/rust
OUT=$(mktemp -d)
DEPS=$OUT/deps
mkdir -p "$DEPS" "$OUT/native"
ok=0
fail=0
run() {
local label=$1; shift
printf '%-28s ' "$label"
if out=$("$@" 2>&1); then
echo "ок"
ok=$((ok + 1))
else
echo "УПАЛО"
echo "$out" | sed 's/^/ /' | head -6
fail=$((fail + 1))
fi
}
L=(-L "$DEPS" -L "native=$OUT/native")
echo "### RUST_CRATE: имя артефакта из имени модуля"
# worldlib: RUST_CRATE() без аргумента, имя из каталога
run "worldlib -> libworldlib.rlib" \
rustc -o "$DEPS/libworldlib.rlib" --edition 2024 \
--crate-name worldlib --crate-type rlib "$EX/worldlib/src/lib.rs" "${L[@]}"
# dashed-lib: каталог с дефисом, RUST_CRATE(dashed_lib)
run "dashed-lib -> libdashed_lib" \
rustc -o "$DEPS/libdashed_lib.rlib" --edition 2024 \
--crate-name dashed_lib --crate-type rlib "$EX/crate_name/dashed-lib/src/lib.rs" "${L[@]}"
echo
echo "### RUST_PROC_MACRO: артефакт это .so, а не .rlib"
run "greetmac -> libgreetmac.so" \
rustc -o "$DEPS/libgreetmac.so" --edition 2024 \
--crate-name greetmac --crate-type proc-macro "$EX/proc_macro/greetmac/src/lib.rs" "${L[@]}"
echo
echo "### вендоренный крейт с crates.io"
# anyhow: RUST_CRATE(), RUST_EDITION(2018), никаких RUST_FLAGS в ya.make,
# то есть его build.rs игнорируется и крейт должен собраться без него
run "anyhow -> libanyhow.rlib" \
rustc -o "$DEPS/libanyhow.rlib" --edition 2018 \
--crate-name anyhow --crate-type rlib "$REPO/contrib/rust/anyhow/src/lib.rs" "${L[@]}"
echo
echo "### RUST_PROGRAM: зависимости через --extern"
run "hello" \
rustc -o "$OUT/hello" --edition 2024 "$EX/hello/src/main.rs" "${L[@]}" \
--extern "worldlib=$DEPS/libworldlib.rlib"
run "crate_name/bin" \
rustc -o "$OUT/crate_name_hello" --edition 2024 "$EX/crate_name/bin/src/main.rs" "${L[@]}" \
--extern "dashed_lib=$DEPS/libdashed_lib.rlib"
run "proc_macro/bin" \
rustc -o "$OUT/procmacro_hello" --edition 2024 "$EX/proc_macro/bin/src/main.rs" "${L[@]}" \
--extern "greetmac=$DEPS/libgreetmac.so"
run "hellodep" \
rustc -o "$OUT/hellodep" --edition 2024 "$EX/hellodep/src/main.rs" "${L[@]}" \
--extern "anyhow=$DEPS/libanyhow.rlib"
echo
echo "### RUST_TEST: rustc --test"
run "tests -> тестовый бинарь" \
rustc -o "$OUT/tests" --edition 2024 --test "$EX/tests/src/lib.rs" "${L[@]}" \
--extern "worldlib=$DEPS/libworldlib.rlib"
echo
echo "### что получилось на диске"
ls -1 "$DEPS" | sed 's/^/ /'
echo
echo "### запуск"
for b in hello crate_name_hello procmacro_hello; do
[ -x "$OUT/$b" ] && printf ' %-18s %s\n' "$b" "$("$OUT/$b")"
done
[ -x "$OUT/hellodep" ] && printf ' %-18s %s\n' "hellodep" "$(echo 21 | "$OUT/hellodep" | tail -1)"
echo
echo "### прогон тестов из примера"
if [ -x "$OUT/tests" ]; then
"$OUT/tests" 2>&1 | sed 's/^/ /' | grep -vE '^\s*$'
echo " --- список, как его спрашивает раннер:"
"$OUT/tests" --list 2>&1 | sed 's/^/ /'
fi
echo
echo "итог: $ok собралось, $fail упало"
echo "рабочий каталог: $OUT"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment