From 86686aebf0b1bcc070d6c8b2f748de597048f0ed Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 14 Oct 2026 00:22:33 -0400 Subject: [PATCH] [ADD] build: create_exe.sh, the Windows executable from Linux MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Building the portable executable was reachable only through make windows. create_exe.sh is the standalone entry point, next to run.sh and install.sh: it runs scripts/construire_windows.sh through avec_node, so under the project's Node, and refuses on Windows and macOS, where the build does not run. make windows now calls it, so both share one path. The installation test guards its shebang, exec bit and shared library. Checked: --help, bad option (2), macOS refusal (1), existing-executable refusal; node 5173. --- FR --- [ADD] construction : create_exe.sh, l'exécutable Windows depuis Linux L'exécutable portable ne se construisait que par make windows. create_exe.sh en est le point d'entrée autonome, à côté de run.sh et install.sh : il lance scripts/construire_windows.sh par avec_node, donc sous le Node du projet, et refuse sous Windows et macOS, où la construction ne se fait pas. make windows passe désormais par lui. L'épreuve d'installation garde son shebang, son bit d'exécution et la bibliothèque commune. Vérifié : --help, option inconnue (2), refus macOS (1), refus d'un exécutable existant ; node 5173. Assisted-by: Claude Opus 5.5 --- Makefile | 4 ++-- README.md | 2 +- create_exe.sh | 33 +++++++++++++++++++++++++++++++++ test/installation.test.js | 15 ++++++++------- 4 files changed, 44 insertions(+), 10 deletions(-) create mode 100755 create_exe.sh 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', () => {