diff --git a/Makefile b/Makefile index 8ae2558..6e0feeb 100644 --- a/Makefile +++ b/Makefile @@ -110,8 +110,8 @@ help: ##W Affiche cette liste @findstr /R /C:"^[a-z_]*:.*## " /C:"^[a-z_]*:.*##W " Makefile else .PHONY: windows -windows: ##U Construit l'exécutable Windows portable, sous podman (§ 16) - $(AVEC_NODE) scripts/construire_windows.sh +windows: ##U Construit l'exécutable Windows portable, sous podman (§ 16), comme ./create_exe.sh + ./create_exe.sh .PHONY: verifier_systemes verifier_systemes: ##U Installe et éprouve sur chaque système du catalogue, en conteneurs diff --git a/README.md b/README.md index 120af52..09f11ec 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ forcent l'un ou l'autre. | `make test_long` | épreuves lourdes, avant un commit | | `make test_navigateur` | épreuves de rendu dans Chromium, avant une livraison | | `make build` | construit la page dans `www/` | -| `make windows` | construit l'exécutable Windows portable, sous `podman`, depuis Linux | +| `make windows` | construit l'exécutable Windows portable, sous `podman`, depuis Linux, comme `./create_exe.sh` | | `make essai_demarrage` | lance la vraie coquille Electron, lit son titre et ferme | | `make help` | toutes les cibles | diff --git a/create_exe.sh b/create_exe.sh new file mode 100755 index 0000000..dada134 --- /dev/null +++ b/create_exe.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash +# © 2026 TechnoLibre (http://www.technolibre.ca) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) + +# Construit l'exécutable Windows portable depuis Linux (§ 16) : la page en +# mode livraison sur l'hôte, puis electron-builder sous podman, par +# scripts/construire_windows.sh, le Node du projet en tête du PATH. Il sort +# dans dist-electron/, nommé d'après version.json ; make windows passe ici. +# +# ./create_exe.sh refuse si l'exécutable de la version existe +# ./create_exe.sh --reconstruire l'efface, puis le reconstruit +set -euo pipefail +cd -- "$(dirname -- "$0")" +. scripts/installation/commun.sh + +for argument in "$@"; do + case "$argument" in + --reconstruire) ;; + -h | --help) + sed -n '5,11p' "$0" | sed 's/^# \{0,1\}//' + exit 0 + ;; + *) + gtt_dire "usage : ./create_exe.sh [--reconstruire]" + exit 2 + ;; + esac +done + +case "$(gtt_famille)" in + windows | macos) gtt_refuser "l'exécutable Windows se construit sous Linux, en conteneur podman (§ 16)." ;; +esac +exec scripts/installation/avec_node.sh scripts/construire_windows.sh "$@" diff --git a/test/installation.test.js b/test/installation.test.js index 83e1654..5da22a8 100644 --- a/test/installation.test.js +++ b/test/installation.test.js @@ -2,12 +2,13 @@ // License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl) // Les points d'entrée de l'installation et du lancement : ./install.sh, -// ./install_dev.sh, ./run.sh et le Makefile sous Linux et macOS ; -// install.cmd, install_dev.cmd et run.cmd sous Windows, qui passent la main -// à PowerShell ; shell.nix sous NixOS. Ces épreuves gardent ce qui les casse -// sans rien faire échouer ailleurs : un bit d'exécution perdu, un chemin -// renommé, une commande npm qui contourne le Node du projet, une fin de ligne -// d'Unix dans un fichier de commandes, une marque d'ordre d'octets absente. +// ./install_dev.sh, ./run.sh, ./create_exe.sh et le Makefile sous Linux et +// macOS ; install.cmd, install_dev.cmd et run.cmd sous Windows, qui passent +// la main à PowerShell ; shell.nix sous NixOS. Ces épreuves gardent ce qui +// les casse sans rien faire échouer ailleurs : un bit d'exécution perdu, un +// chemin renommé, une commande npm qui contourne le Node du projet, une fin +// de ligne d'Unix dans un fichier de commandes, une marque d'ordre d'octets +// absente. import assert from 'node:assert/strict'; import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs'; import { join } from 'node:path'; @@ -16,7 +17,7 @@ import { describe, test } from './lanceur.js'; const RACINE = fileURLToPath(new URL('..', import.meta.url)); const lire = (chemin) => readFileSync(join(RACINE, chemin), 'utf8'); -const SCRIPTS_BASH = ['install.sh', 'install_dev.sh', 'run.sh', 'scripts/installation/avec_node.sh']; +const SCRIPTS_BASH = ['install.sh', 'install_dev.sh', 'run.sh', 'create_exe.sh', 'scripts/installation/avec_node.sh']; describe('installation : les scripts bash', () => { test('ils sont exécutables, et cherchent bash dans le PATH : /bin/bash manque sous NixOS', () => {