Skip to content

Commit 2184e33

Browse files
andyclaude
andcommitted
Windows: self-contained zip (runtime DLLs, Strawberry Perl, embeddable Python with wxPython, ecce.cmd), GUI apps without a console, CI tests the unpacked zip (#133)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PFPK14wBcLD1s4dYUowpP4
1 parent f92cd29 commit 2184e33

8 files changed

Lines changed: 230 additions & 43 deletions

File tree

‎.github/workflows/build.yml‎

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -433,9 +433,6 @@ jobs:
433433
runs-on: windows-latest
434434
timeout-minutes: 120
435435
continue-on-error: true
436-
env:
437-
STRAWBERRY_URL: https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_54051_64bit/strawberry-perl-5.40.5.1-64bit-portable.zip
438-
STRAWBERRY_SHA256: 6619fe7eeef921ccddb4aac3972fb602a0c690a3074205b863ade998d7bc79a6
439436
steps:
440437
# LF in the checkout: fixtures and shell scripts must not get CRLF.
441438
- run: git config --global core.autocrlf false
@@ -504,67 +501,74 @@ jobs:
504501
shell: msys2 {0}
505502
run: packaging/windows/bundle-shell.sh "$PWD/stage/ecce" "$(cygpath -m /)"
506503

507-
- name: Strawberry Perl (portable)
508-
id: perl
504+
# MinGW runtime DLLs and the broker, then Perl and Python, so the tree
505+
# runs with no MSYS2 on the machine.
506+
- name: Bundle the runtime
507+
shell: msys2 {0}
508+
run: |
509+
packaging/windows/bundle-runtime.sh "$PWD/stage/ecce"
510+
cp packaging/windows/ecce.cmd packaging/windows/make-shortcuts.ps1 stage/ecce/
511+
512+
- name: Download cache (Strawberry Perl, Python, wxPython)
509513
uses: actions/cache@v4
510514
with:
511-
path: ${{ runner.temp }}/strawberry
512-
key: strawberry-5.40.5.1-${{ env.STRAWBERRY_SHA256 }}
515+
path: ${{ runner.temp }}/ecce-dl
516+
key: windows-tools-${{ hashFiles('packaging/windows/bundle-tools.ps1') }}
517+
518+
- name: Bundle Perl and Python
519+
shell: pwsh
520+
run: packaging/windows/bundle-tools.ps1 -Install stage\ecce -Cache "$env:RUNNER_TEMP\ecce-dl"
513521

514-
- name: Download Strawberry Perl
515-
if: steps.perl.outputs.cache-hit != 'true'
522+
- name: Zip the install tree
516523
shell: pwsh
517524
run: |
518-
$zip = "$env:RUNNER_TEMP\strawberry.zip"
519-
Invoke-WebRequest $env:STRAWBERRY_URL -OutFile $zip
520-
$h = (Get-FileHash $zip -Algorithm SHA256).Hash.ToLower()
521-
if ($h -ne $env:STRAWBERRY_SHA256) { throw "sha256 $h" }
522-
Expand-Archive $zip "$env:RUNNER_TEMP\strawberry"
523-
524-
# Local job end to end with the bundled shell and a PATH that has no
525-
# MSYS2 usr\bin (tests/windows/launch_local.py).
525+
$v = (Get-Content data/client/config/Version -TotalCount 1).Trim()
526+
New-Item -ItemType Directory -Force dist | Out-Null
527+
Compress-Archive -Path stage\ecce -DestinationPath "dist\ECCE-windows-$v.zip"
528+
Get-ChildItem dist | Format-Table Name, Length
529+
$d = "$env:RUNNER_TEMP\unpacked"
530+
Remove-Item -Recurse -Force $d -ErrorAction SilentlyContinue
531+
Expand-Archive "dist\ECCE-windows-$v.zip" $d
532+
"unpacked: $((Get-ChildItem $d -Recurse -File | Measure-Object Length -Sum).Sum / 1MB) MB" | Tee-Object -Append $env:GITHUB_STEP_SUMMARY
533+
Get-ChildItem "$d\ecce" | Format-Table Name
534+
# launchjob is a test driver, not part of the package.
535+
Copy-Item build\launchjob.exe "$d\ecce\bin\"
536+
537+
# Local job end to end from the unpacked zip, with System32 as the only
538+
# PATH outside it (tests/windows/launch_local.py): no MSYS2 involved.
526539
- name: Local jobs (complete, cancel)
527540
id: localjobs
528541
shell: pwsh
529542
continue-on-error: true
530543
run: |
531-
$msys = (msys2 -c 'cygpath -m /' 2>$null)
532-
if (-not $msys) { $msys = "$env:RUNNER_TEMP\msys64" }
533-
$msys = $msys -replace '/', '\'
544+
$r = "$env:RUNNER_TEMP\unpacked\ecce"
534545
New-Item -ItemType Directory -Force localjobs | Out-Null
535-
$sb = "$env:RUNNER_TEMP\strawberry"
536-
$env:WINTEST_HOME = "$PWD\stage\ecce"
537-
$env:WINTEST_BASE_PATH = "$msys\ucrt64\bin;$sb\perl\site\bin;$sb\perl\bin;$sb\c\bin;C:\Windows\System32;C:\Windows"
546+
$sys = "$env:SystemRoot\System32;$env:SystemRoot"
547+
$env:Path = $sys
548+
$env:WINTEST_HOME = $r
549+
$env:WINTEST_BASE_PATH = "$r\bin;$r\usr\bin;$r\python;$r\strawberry\perl\site\bin;$r\strawberry\perl\bin;$r\strawberry\c\bin;$sys"
538550
$rc = 0
539551
foreach ($c in "complete", "cancel") {
540-
& "$msys\ucrt64\bin\python3.exe" tests/windows/launch_local.py $c --build "$PWD\build" --state "$PWD\localjobs\state-$c" 2>&1 | Tee-Object "localjobs\$c.log"
552+
& "$r\python\python3.exe" tests/windows/launch_local.py $c --build "$r\bin" --state "$PWD\localjobs\state-$c" 2>&1 | Tee-Object "localjobs\$c.log"
541553
"$c rc=$LASTEXITCODE" | Tee-Object -Append localjobs\summary.txt
542554
if ($LASTEXITCODE -ne 0) { $rc = 1 }
543555
}
544556
Get-Content localjobs\summary.txt >> $env:GITHUB_STEP_SUMMARY
545557
exit $rc
546558
547-
# Does it run? (#133) Starts the installed apps on the runner's desktop
548-
# and screenshots them. Allowed to fail; see summary.txt.
559+
# Does it run? (#133) Starts the unpacked apps on the runner's desktop
560+
# (PATH: the package and System32 only) and screenshots them. Allowed
561+
# to fail; see summary.txt.
549562
- name: Start the apps
550563
id: apps
551564
shell: pwsh
552565
continue-on-error: true
553566
timeout-minutes: 20
554567
run: |
555-
$msys = (msys2 -c 'cygpath -m /' 2>$null) -replace '/', '\'
556-
tests\windows\ci-run.ps1 -Stage stage -Out windows-run -Msys $msys -Strawberry "$env:RUNNER_TEMP\strawberry"
568+
$env:Path = "$env:SystemRoot\System32;$env:SystemRoot"
569+
tests\windows\ci-run.ps1 -Stage "$env:RUNNER_TEMP\unpacked" -Out windows-run
557570
Get-Content windows-run\summary.txt >> $env:GITHUB_STEP_SUMMARY
558571
559-
- name: Zip the install tree
560-
if: always()
561-
shell: pwsh
562-
run: |
563-
$v = (Get-Content data/client/config/Version -TotalCount 1).Trim()
564-
New-Item -ItemType Directory -Force dist | Out-Null
565-
Compress-Archive -Path stage\ecce -DestinationPath "dist\ECCE-windows-$v.zip"
566-
Get-ChildItem dist | Format-Table Name, Length
567-
568572
- uses: actions/upload-artifact@v4
569573
if: always()
570574
with:

‎CMakeLists.txt‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,16 @@ if(NOT WIN32)
931931
list(APPEND ECCE_CLI_APPS ecce-flock)
932932
endif()
933933

934+
if(WIN32)
935+
# GUI subsystem: no console window opens behind the apps. The command-line
936+
# programs (ECCE_CLI_APPS, the parsers) keep theirs.
937+
foreach(_app ${ECCE_GUI_APPS})
938+
if(TARGET ${_app})
939+
set_target_properties(${_app} PROPERTIES WIN32_EXECUTABLE ON)
940+
endif()
941+
endforeach()
942+
endif()
943+
934944
install(TARGETS ${ECCE_GUI_APPS} ${ECCE_CLI_APPS} RUNTIME DESTINATION bin
935945
COMPONENT client)
936946
# data/ splits cleanly along its own top-level directories: data/client
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#!/bin/bash
2+
# Copies the MinGW/UCRT64 runtime DLLs every installed program needs, and
3+
# mosquitto and mosquitto_passwd (the session broker, ecce-broker-win), from
4+
# an MSYS2 UCRT64 install into <ECCE install>/bin, so that the install runs
5+
# on a machine without MSYS2.
6+
#
7+
# packaging/windows/bundle-runtime.sh <install-dir> [ucrt64-bin]
8+
#
9+
# Run it from an MSYS2 UCRT64 shell after `cmake --install`. Only DLLs found
10+
# in the UCRT64 bin directory are copied; Windows' own DLLs stay where they are.
11+
set -eu
12+
dest="${1:?usage: bundle-runtime.sh <install-dir> [ucrt64-bin]}/bin"
13+
src="${2:-/ucrt64/bin}"
14+
src="$(cd "$src" && pwd)"
15+
16+
for p in mosquitto mosquitto_passwd; do
17+
[ -f "$src/$p.exe" ] || { echo "bundle-runtime: $src/$p.exe is missing" >&2; exit 1; }
18+
cp -f "$src/$p.exe" "$dest/"
19+
done
20+
21+
# ldd lists a program's DLLs, but not always the DLLs' own; repeat on the
22+
# newly copied files until nothing new turns up.
23+
todo="$(ls "$dest"/*.exe)"
24+
n=0
25+
while [ -n "$todo" ]; do
26+
new=""
27+
for f in $todo; do
28+
for dll in $(ldd "$f" 2>/dev/null | awk -v s="$src/" 'index($3, s) == 1 {print $3}'); do
29+
if [ ! -f "$dest/${dll##*/}" ]; then cp -f "$dll" "$dest/"; new="$new $dest/${dll##*/}"; n=$((n+1)); fi
30+
done
31+
done
32+
todo="$new"
33+
done
34+
echo "bundled mosquitto and $n DLLs into $dest ($(du -sh "$dest" | cut -f1) in bin)"

‎packaging/windows/bundle-tools.ps1‎

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Adds Strawberry Perl (portable, trimmed) and an embeddable Python with
2+
# wxPython to an ECCE install tree, so gensub, the importers and the
3+
# code-registration dialogs run without anything installed on the machine.
4+
#
5+
# bundle-tools.ps1 -Install <install-dir> [-Cache <download-dir>]
6+
#
7+
# Result: <install>\strawberry\{perl,c\bin} and <install>\python (python.exe
8+
# and python3.exe: the scripts call python3). The pins below are the source
9+
# of truth; tests/windows/README.md lists them.
10+
param([Parameter(Mandatory)][string]$Install, [string]$Cache = "$env:TEMP\ecce-dl")
11+
$ErrorActionPreference = "Stop"
12+
$ProgressPreference = "SilentlyContinue"
13+
$pins = @{
14+
strawberry = @{ url = "https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_54051_64bit/strawberry-perl-5.40.5.1-64bit-portable.zip";
15+
sha256 = "6619fe7eeef921ccddb4aac3972fb602a0c690a3074205b863ade998d7bc79a6" }
16+
python = @{ url = "https://www.python.org/ftp/python/3.13.5/python-3.13.5-embed-amd64.zip";
17+
sha256 = "7d2650fd9d1b9d002d4a315d5f354247fd6a44f30517c7ef577b08f57a0fb6d9" }
18+
# pythonhosted.org file path of wxpython-4.3.1-cp313-cp313-win_amd64.whl
19+
wxpython = @{ url = "";
20+
sha256 = "0ae85e266dbb99fe46bc26920aa87b22fa3f83dc51b321bcd9afa51fa68340e7" }
21+
}
22+
23+
function Fetch($name, $url, $sha, $file) {
24+
New-Item -ItemType Directory -Force $Cache | Out-Null
25+
$f = Join-Path $Cache $file
26+
if (-not (Test-Path $f)) { Invoke-WebRequest $url -OutFile $f }
27+
$h = (Get-FileHash $f -Algorithm SHA256).Hash.ToLower()
28+
if ($h -ne $sha) { Remove-Item $f; throw "$name`: sha256 $h, expected $sha" }
29+
return $f
30+
}
31+
function Unzip($zip, $to) {
32+
if (Test-Path $to) { Remove-Item -Recurse -Force $to }
33+
New-Item -ItemType Directory -Force $to | Out-Null
34+
Add-Type -AssemblyName System.IO.Compression.FileSystem
35+
[System.IO.Compression.ZipFile]::ExtractToDirectory($zip, $to)
36+
}
37+
function Size($d) { "{0:N0} MB" -f ((Get-ChildItem $d -Recurse -File | Measure-Object Length -Sum).Sum / 1MB) }
38+
39+
$Install = (Resolve-Path $Install).Path
40+
41+
# --- Strawberry Perl: perl itself and the DLLs its modules load; no compiler.
42+
$zip = Fetch "strawberry" $pins.strawberry.url $pins.strawberry.sha256 "strawberry.zip"
43+
$tmp = Join-Path $Cache "strawberry-unpacked"
44+
Unzip $zip $tmp
45+
"strawberry unpacked: $(Size $tmp)"
46+
$sb = Join-Path $Install "strawberry"
47+
if (Test-Path $sb) { Remove-Item -Recurse -Force $sb }
48+
New-Item -ItemType Directory -Force "$sb\c\bin" | Out-Null
49+
Move-Item "$tmp\perl" "$sb\perl"
50+
Get-ChildItem "$tmp\c\bin" -Filter *.dll | Move-Item -Destination "$sb\c\bin"
51+
foreach ($d in "perl\html", "perl\man", "perl\lib\pods", "perl\site\lib\auto\share\dist\Alien-Build") {
52+
if (Test-Path "$sb\$d") { Remove-Item -Recurse -Force "$sb\$d" }
53+
}
54+
Get-ChildItem "$sb\perl" -Recurse -Include *.pod, *.a, *.h -File | Remove-Item -Force
55+
Remove-Item -Recurse -Force $tmp
56+
"strawberry bundled: $(Size $sb)"
57+
58+
# --- Python: python.org's embeddable zip, plus the wxPython wheel unpacked
59+
# into its site-packages (the embeddable build has no pip).
60+
$py = Join-Path $Install "python"
61+
Unzip (Fetch "python" $pins.python.url $pins.python.sha256 "python-embed.zip") $py
62+
$whl = Join-Path $Cache "wxpython-4.3.1-cp313-cp313-win_amd64.whl"
63+
if (-not (Test-Path $whl)) {
64+
# The wheel's pythonhosted URL has a content hash in it; ask PyPI.
65+
$meta = Invoke-RestMethod "https://pypi.org/pypi/wxPython/4.3.1/json"
66+
$u = ($meta.urls | Where-Object { $_.filename -eq "wxpython-4.3.1-cp313-cp313-win_amd64.whl" }).url
67+
$pins.wxpython.url = $u
68+
}
69+
$whl = Fetch "wxpython" $pins.wxpython.url $pins.wxpython.sha256 "wxpython-4.3.1-cp313-cp313-win_amd64.whl"
70+
$site = "$py\Lib\site-packages"
71+
New-Item -ItemType Directory -Force $site | Out-Null
72+
Add-Type -AssemblyName System.IO.Compression.FileSystem
73+
[System.IO.Compression.ZipFile]::ExtractToDirectory($whl, $site)
74+
Get-ChildItem $site -Recurse -Include *.pyi -File | Remove-Item -Force
75+
# site-packages on sys.path, and `import site` on (the embeddable default is off).
76+
$pth = Get-ChildItem $py -Filter "python*._pth" | Select-Object -First 1
77+
Set-Content -Encoding ascii $pth.FullName @("python313.zip", ".", "Lib\site-packages", "import site")
78+
Copy-Item "$py\python.exe" "$py\python3.exe"
79+
Copy-Item "$py\pythonw.exe" "$py\python3w.exe"
80+
"python bundled: $(Size $py)"

‎packaging/windows/ecce.cmd‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
@echo off
2+
rem Starts ECCE (the Organizer) from an unpacked Windows package, using only
3+
rem what is in the package. Nothing needs to be installed on the machine.
4+
setlocal
5+
set "ECCE_ROOT=%~dp0"
6+
if "%ECCE_ROOT:~-1%"=="\" set "ECCE_ROOT=%ECCE_ROOT:~0,-1%"
7+
rem Forward slashes: ECCE_HOME ends up in sh scripts, where a backslash is an escape.
8+
set "ECCE_HOME=%ECCE_ROOT:\=/%"
9+
set "PATH=%ECCE_ROOT%\bin;%ECCE_ROOT%\usr\bin;%ECCE_ROOT%\python;%ECCE_ROOT%\strawberry\perl\site\bin;%ECCE_ROOT%\strawberry\perl\bin;%ECCE_ROOT%\strawberry\c\bin;%SystemRoot%\System32;%SystemRoot%"
10+
set "ECCE_REALUSER=%USERNAME%"
11+
set "HOST=%COMPUTERNAME%"
12+
set "UH=%USERPROFILE:\=/%"
13+
set "ECCE_REALUSERHOME=%UH%"
14+
set "ECCE_LOCAL_DATA=%UH%/ecce-local"
15+
if not exist "%USERPROFILE%\ecce-local" mkdir "%USERPROFILE%\ecce-local"
16+
rem Local mode without messaging and without a data server, as tested in CI.
17+
set ECCE_NO_MESSAGING=1
18+
set ECCE_NO_DATASERVER=1
19+
set ECCE_SESSION_LIVENESS=lease
20+
start "" "%ECCE_ROOT%\bin\organizer.exe" %*
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# Adds an "ECCE" entry to the current user's Start menu that runs ecce.cmd
2+
# of the package this script sits in (the package root, next to ecce.cmd).
3+
# powershell -ExecutionPolicy Bypass -File make-shortcuts.ps1
4+
$root = Split-Path -Parent $MyInvocation.MyCommand.Path
5+
$dir = Join-Path ([Environment]::GetFolderPath("Programs")) "ECCE"
6+
New-Item -ItemType Directory -Force $dir | Out-Null
7+
$sh = New-Object -ComObject WScript.Shell
8+
$l = $sh.CreateShortcut("$dir\ECCE.lnk")
9+
$l.TargetPath = "$env:SystemRoot\System32\cmd.exe"
10+
$l.Arguments = "/c `"`"$root\ecce.cmd`"`""
11+
$l.WorkingDirectory = $env:USERPROFILE
12+
$l.WindowStyle = 7
13+
$l.IconLocation = "$root\bin\organizer.exe,0"
14+
$l.Save()
15+
"Start menu: $dir\ECCE.lnk"

‎tests/windows/README.md‎

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,24 @@ sha256 6619fe7eeef921ccddb4aac3972fb602a0c690a3074205b863ade998d7bc79a6;
3232
the `portable` entry of strawberryperl.com/releases.json lists the msi URL
3333
with this zip's hash and size).
3434

35+
## The self-contained package
36+
`ECCE-windows-<version>.zip` runs on a Windows 10/11 with nothing installed.
37+
Pieces, all from `packaging/windows/`:
38+
- `bundle-shell.sh` - sh and coreutils (MSYS2 `usr\bin`).
39+
- `bundle-runtime.sh` - the UCRT64 DLLs (`ldd`, only from `/ucrt64/bin`), `mosquitto` and `mosquitto_passwd` into `bin`.
40+
- `bundle-tools.ps1` - Strawberry Perl portable (pinned above; only `perl\` and the `c\bin` DLLs kept) and Python 3.13.5 embeddable
41+
(https://www.python.org/ftp/python/3.13.5/python-3.13.5-embed-amd64.zip, sha256
42+
7d2650fd9d1b9d002d4a315d5f354247fd6a44f30517c7ef577b08f57a0fb6d9) with the wxPython 4.3.1 cp313 win_amd64 wheel
43+
(sha256 0ae85e266dbb99fe46bc26920aa87b22fa3f83dc51b321bcd9afa51fa68340e7) unpacked into its `Lib\site-packages`.
44+
`python3.exe` is a copy of `python.exe`, because the scripts call `python3`.
45+
- `ecce.cmd` starts the Organizer with the package's own PATH; `make-shortcuts.ps1` adds the Start menu entry.
46+
3547
## CI
3648
`build.yml`, job "Windows (MSYS2 UCRT64)" (experimental, `continue-on-error`):
3749
same packages, ccache, build, ctest (transport_process, fragreaders,
3850
fragreaders_de, parsers), install to `stage/ecce`, `bundle-shell.sh`,
39-
`launch_local.py complete|cancel` against the bundled shell, `ci-run.ps1`
40-
(starts each app on the runner desktop, screenshots), then the install tree as
41-
`ECCE-windows-<version>.zip` and the `windows-run` artifact (shots, logs).
51+
the three bundle steps, the zip, then, from the unpacked zip with only
52+
System32 on PATH, `launch_local.py complete|cancel` and `ci-run.ps1` (starts
53+
each app on the runner desktop, screenshots; without `-Msys` it is that
54+
clean-PATH mode), and the `windows-run` artifact (shots, logs).
4255
Run it with `gh workflow run build.yml --ref <branch> -f only=windows`.

‎tests/windows/ci-run.ps1‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
# the runner's desktop, screenshots it, records how it ended. Never fails
33
# the job; the verdict is in <Out>\summary.txt.
44
# ci-run.ps1 -Stage <dir with ecce\bin> -Out <dir> [-Msys D:\a\_temp\msys64] [-Strawberry <dir>]
5-
param([string]$Stage, [string]$Out, [string]$Msys = "C:\msys64", [string]$Strawberry = "")
5+
# Without -Msys the PATH is the package's own (ecce.cmd's) and System32 only:
6+
# the run from an unpacked ECCE-windows zip, with no MSYS2 anywhere.
7+
param([string]$Stage, [string]$Out, [string]$Msys = "", [string]$Strawberry = "")
68
$ErrorActionPreference = "Continue"
79
$Stage = (Resolve-Path $Stage).Path
810
New-Item -ItemType Directory -Force "$Out\shots", "$Out\logs", "$Out\home", "$Out\local" | Out-Null
@@ -11,11 +13,14 @@ $summary = "$Out\summary.txt"
1113
function Say($t) { Write-Host $t; Add-Content $summary $t }
1214

1315
$perl = ""
14-
if ($Strawberry -ne "" -and (Test-Path "$Strawberry\perl\bin\perl.exe")) {
16+
if ($Msys -eq "") {
17+
$r = "$Stage\ecce"
18+
$env:Path = "$r\bin;$r\usr\bin;$r\python;$r\strawberry\perl\site\bin;$r\strawberry\perl\bin;$r\strawberry\c\bin;$env:SystemRoot\System32;$env:SystemRoot"
19+
} elseif ($Strawberry -ne "" -and (Test-Path "$Strawberry\perl\bin\perl.exe")) {
1520
$perl = "$Strawberry\perl\site\bin;$Strawberry\perl\bin;$Strawberry\c\bin;"
1621
}
1722
# ucrt64 first: Strawberry's c\bin has its own libstdc++/libgcc that crash our exes.
18-
$env:Path = "$Msys\ucrt64\bin;" + $perl + $env:Path + ";$Msys\usr\bin"
23+
if ($Msys -ne "") { $env:Path = "$Msys\ucrt64\bin;" + $perl + $env:Path + ";$Msys\usr\bin" }
1924
$env:ECCE_HOME = ("$Stage\ecce" -replace "\\", "/")
2025
$env:ECCE_REALUSER = $env:USERNAME
2126
$env:ECCE_REALUSERHOME = ("$Out\home" -replace "\\", "/")
@@ -65,6 +70,12 @@ Say "Windows $([System.Environment]::OSVersion.Version)"
6570
Get-CimInstance Win32_VideoController | ForEach-Object { Say "video: $($_.Name)" }
6671
Say ("screen: " + [System.Windows.Forms.SystemInformation]::VirtualScreen)
6772
Shot "$Out\shots\00-desktop.png"
73+
if ($Msys -eq "") {
74+
Say ("path: " + $env:Path)
75+
Say ("python wx: " + (& "$Stage\ecce\python\python3.exe" -c "import wx; print(wx.version())" 2>&1))
76+
Say ("perl: " + ((& "$Stage\ecce\strawberry\perl\bin\perl.exe" -e 'print qq($^V $^O)') 2>&1))
77+
Say ("sh: " + ((& "$Stage\ecce\usr\bin\sh.exe" -c "echo ok") 2>&1))
78+
}
6879

6980
$bin = "$Stage\ecce\bin"
7081
Get-ChildItem $bin -Filter *.exe | ForEach-Object { $_.Name } | Out-File "$Out\logs\bin.txt"

0 commit comments

Comments
 (0)