From 4d6f8b57b2eddcb8288ba38bba343a80b4259d94 Mon Sep 17 00:00:00 2001 From: Infuseting Date: Wed, 14 Oct 2026 20:30:43 +0200 Subject: [PATCH] chore(setup): add complete WSL development installer --- .gitattributes | 1 + readme.md | 20 +++++++ scripts/setup.sh | 139 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 160 insertions(+) create mode 100644 .gitattributes create mode 100755 scripts/setup.sh diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0309e02 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +scripts/*.sh text eol=lf diff --git a/readme.md b/readme.md index ccfe095..498ad34 100644 --- a/readme.md +++ b/readme.md @@ -27,6 +27,26 @@ rokit --version ``` Le [script d'installation](scripts/setup.ps1) nécessite WinGet (App Installer du Microsoft Store). Il installe Git, [mise](https://mise.jdx.dev/installing-mise.html), Rokit, Roblox Studio et Blender via WinGet, puis les versions définies dans `mise.toml` et `rokit.toml`, et les dépendances pnpm verrouillées. Il termine par `pnpm check` et `pnpm build` et s'arrête dès qu'une commande échoue. Windows peut demander une élévation pour certains installateurs. Une relance conserve les applications déjà installées ; elle ne les met pas à jour automatiquement. Les applications WinGet utilisent la version disponible dans son catalogue, les outils du projet restent épinglés. +### Configuration complète dans Ubuntu WSL2 + +Depuis un terminal **Ubuntu WSL2**, lancer : + +```bash +bash scripts/setup.sh +``` + +Comme [`setup.ps1`](scripts/setup.ps1) sous Windows, ce script prépare le projet entier. Il installe les paquets Ubuntu nécessaires, mise, Node.js avec npm, pnpm et uv aux versions de [`mise.toml`](mise.toml), Rokit et les outils de [`rokit.toml`](rokit.toml), puis les dépendances pnpm verrouillées. Il termine par `pnpm check` et `pnpm build` ; `bash scripts/setup.sh --skip-checks` saute ces deux dernières vérifications. Il peut demander le mot de passe `sudo` pour les paquets Ubuntu. + +Il installe aussi Blender 5.2.2 LTS pour Linux dans `~/.local/opt/blender-5.2.2`, vérifie l'archive avec le SHA-256 publié par Blender, exécute un test Python sans interface, puis crée `~/.local/bin/blender`. Une relance réutilise les installations existantes. Il ne modifie pas les installations Windows ; Roblox Studio reste sur Windows pour tester le jeu. Pour de meilleures performances, placer le dépôt dans le système de fichiers Linux d'Ubuntu plutôt que sous `/mnt/c` ou `/mnt/e`. Rouvrir le terminal Ubuntu après la première installation pour charger les chemins de Rokit. Les commandes du projet sont disponibles via `~/.local/bin/mise exec -- pnpm `. + +Pour exécuter un script de création ou d'export d'asset sans ouvrir Blender : + +```bash +~/.local/bin/blender --background --factory-startup --python-exit-code 1 --python path/to/asset_script.py +``` + +La connexion du plugin Blender MCP décrite plus bas concerne une session Blender ouverte. Les scripts Python lancés en mode `--background` n'en ont pas besoin. + ## Bibliothèques installées Chaque paquet de cette section est une dépendance directe. Les liens mènent à la documentation du projet ou à son README actuel ; les versions exécutables sont épinglées dans le lockfile. Les 22 bibliothèques ont été examinées : Flamework, son gestionnaire de composants, Cmdr et le logger sont branchés au démarrage ; les autres bibliothèques s'utilisent à l'import ou se configurent avec les données de leur fonctionnalité. diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100755 index 0000000..f37d51a --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,139 @@ +#!/usr/bin/env bash +set -euo pipefail + +project_root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd -P)" +blender_version="5.2.2" +blender_archive="blender-${blender_version}-linux-x64.tar.xz" +blender_sha256="84098912789dc450e95697c4184fb8a90acbe5111c2ba4aede3fecb57806a168" +blender_url="https://download.blender.org/release/Blender5.2/${blender_archive}" +blender_dir="${HOME}/.local/opt/blender-${blender_version}" +blender_link="${HOME}/.local/bin/blender" +mise_bin="${HOME}/.local/bin/mise" +rokit_bin="${HOME}/.rokit/bin/rokit" +skip_checks=false + +fail() { + printf 'Error: %s\n' "$*" >&2 + exit 1 +} + +case "${1:-}" in + "") ;; + --skip-checks) skip_checks=true ;; + *) fail "Usage: bash scripts/setup.sh [--skip-checks]" ;; +esac +[[ $# -le 1 ]] || fail "Usage: bash scripts/setup.sh [--skip-checks]" + +[[ "$(uname -s)" == "Linux" && "$(uname -r)" == *WSL2* ]] || fail "Run this script inside WSL2." +[[ "$(uname -m)" == "x86_64" ]] || fail "Only x86_64 WSL2 is supported." +[[ -r /etc/os-release ]] || fail "Cannot identify the Linux distribution." +# shellcheck source=/etc/os-release +source /etc/os-release +[[ "${ID:-}" == "ubuntu" ]] || fail "This installer supports Ubuntu WSL2." +[[ -f "${project_root}/mise.toml" && -f "${project_root}/rokit.toml" && -f "${project_root}/pnpm-lock.yaml" ]] \ + || fail "Run the setup script from a complete project checkout." +command -v dpkg-query >/dev/null 2>&1 || fail "dpkg-query is required on Ubuntu." + +if [[ -e "$blender_link" && ! -L "$blender_link" ]]; then + fail "${blender_link} already exists and is not a symlink." +fi +if [[ -L "$blender_link" && "$(readlink "$blender_link")" != "${blender_dir}/blender" ]]; then + fail "${blender_link} points to another Blender installation." +fi + +apt_packages=( + bubblewrap ca-certificates curl git tar unzip xz-utils + libgl1 libice6 libsm6 libx11-6 libxcursor1 libxi6 libxinerama1 + libxkbcommon0 libxrandr2 libxrender1 libxxf86vm1 +) +missing_packages=() +for package in "${apt_packages[@]}"; do + if [[ "$(dpkg-query -W -f='${Status}' "$package" 2>/dev/null)" != "install ok installed" ]]; then + missing_packages+=("$package") + fi +done +if ((${#missing_packages[@]})); then + if ((EUID == 0)); then + apt_command=(apt-get) + else + command -v sudo >/dev/null 2>&1 || fail "sudo is required to install Ubuntu packages." + apt_command=(sudo apt-get) + fi + printf 'Installing Ubuntu packages: %s\n' "${missing_packages[*]}" + "${apt_command[@]}" update + "${apt_command[@]}" install --yes --no-install-recommends "${missing_packages[@]}" +fi + +for tool in awk curl ldd mktemp sha256sum tar xz; do + command -v "$tool" >/dev/null 2>&1 || fail "Required tool is missing: ${tool}" +done + +temporary_dir="$(mktemp -d "${TMPDIR:-/tmp}/crownstudio-setup.XXXXXXXX")" +trap 'rm -rf -- "$temporary_dir"' EXIT +export PATH="${HOME}/.local/bin:${HOME}/.rokit/bin:${PATH}" +cd -- "$project_root" + +if [[ ! -x "$mise_bin" ]]; then + printf 'Installing mise...\n' + curl --fail --location --silent --show-error https://mise.run \ + --output "${temporary_dir}/mise-install.sh" + sh "${temporary_dir}/mise-install.sh" +fi +[[ -x "$mise_bin" ]] || fail "mise was not installed at ${mise_bin}." +"$mise_bin" trust mise.toml +"$mise_bin" install + +if [[ ! -x "$rokit_bin" ]]; then + printf 'Installing Rokit...\n' + curl --fail --location --silent --show-error \ + https://raw.githubusercontent.com/rojo-rbx/rokit/main/scripts/install.sh \ + --output "${temporary_dir}/rokit-install.sh" + (cd -- "$temporary_dir" && bash "${temporary_dir}/rokit-install.sh") +fi +[[ -x "$rokit_bin" ]] || fail "Rokit was not installed at ${rokit_bin}." +"$rokit_bin" trust rojo-rbx/rojo jackTabsCode/asphalt seaofvoices/darklua blake-mealey/mantle +"$rokit_bin" install + +if [[ ! -d "$blender_dir" ]]; then + printf 'Downloading Blender %s for Linux...\n' "$blender_version" + curl --fail --location --retry 3 --retry-all-errors --silent --show-error \ + --output "${temporary_dir}/${blender_archive}" "$blender_url" + printf '%s %s\n' "$blender_sha256" "${temporary_dir}/${blender_archive}" \ + | sha256sum --check --status \ + || fail "The Blender archive failed SHA-256 verification." + tar -xJf "${temporary_dir}/${blender_archive}" -C "$temporary_dir" + candidate_dir="${temporary_dir}/blender-${blender_version}-linux-x64" +else + candidate_dir="$blender_dir" +fi + +candidate_binary="${candidate_dir}/blender" +[[ -x "$candidate_binary" ]] || fail "${candidate_dir} does not contain an executable Blender binary." +missing_libraries="$(ldd "$candidate_binary" | awk '/not found/ { print $1 }')" +[[ -z "$missing_libraries" ]] || fail "Missing Blender system libraries: ${missing_libraries}" +"$candidate_binary" --background --factory-startup --python-exit-code 1 \ + --python-expr "import bpy; assert bpy.app.version_string.startswith('${blender_version}'); bpy.ops.mesh.primitive_cube_add(); print('Blender headless smoke test passed')" + +if [[ "$candidate_dir" != "$blender_dir" ]]; then + mkdir -p "$(dirname -- "$blender_dir")" + mv -- "$candidate_dir" "$blender_dir" +fi +mkdir -p "$(dirname -- "$blender_link")" +if [[ ! -L "$blender_link" ]]; then + ln -s "${blender_dir}/blender" "$blender_link" +fi + +"$mise_bin" exec -- node --version +"$mise_bin" exec -- npm --version +"$mise_bin" exec -- pnpm --version +"$mise_bin" exec -- uv --version +"$rokit_bin" --version +"$mise_bin" exec -- pnpm install --frozen-lockfile +if [[ "$skip_checks" == false ]]; then + "$mise_bin" exec -- pnpm check + "$mise_bin" exec -- pnpm build +fi + +printf 'WSL setup complete. Blender is available at %s\n' "$blender_link" +printf 'Run project commands with: %s exec -- pnpm \n' "$mise_bin" +printf 'Open a new Ubuntu shell to load the Rokit and local binary paths.\n'