Files
gw-basic-2026/.github/workflows/ci.yml
T
Eremey Valetov da1e6cebf1 CI: fix dos-cross-compile env; codegen: accept concat in CVI/CVS/CVD/cmp
- .github/workflows/ci.yml: the dos-cross-compile job failed on the
  first push because build_dos.sh sources $HOME/openwatcom-v2/setvars.sh
  if WATCOM is unset, but that file isn't part of the OpenWatcom V2
  snapshot — I'd been creating it locally by hand.  Add a "Configure
  OpenWatcom env" step that generates setvars.sh after extraction (so
  build_dos.sh works) AND exports WATCOM/PATH/INCLUDE via $GITHUB_ENV
  (so subsequent steps work even if setvars.sh sourcing changes).
  Also stash both DOS binaries before the next-mode clean wipes them,
  so the artifact upload actually has both .exe files.

- src/codegen.c: switch the four remaining emit_str_atom callers
  (CVI/CVS/CVD function args + string-comparison left/right) to
  emit_str_expr.  Now `CVS(A$+B$)` and `A$+B$ < C$` accept
  concatenation in their string operands; previously the atom-level
  caller stopped at the first identifier and the trailing `+` confused
  downstream parsing.  Verified: CVS(MKS$(3.14)+MKS$(0)) round-trips
  to 3.14 in both interpreter and compiled binary.  All 72 interpreter
  + 63 compiler tests still pass.

- docs/getting-started.md: document that gwbasic-compile auto-numbers
  unnumbered direct-mode lines (last_num + 10) so scratchpad-style
  programs compile without manual renumbering.

- tests/run_freedos_qemu.sh: helper for going through the manual TUI
  checklist on bare FreeDOS.  Modern qemu-kvm doesn't expose -fda on
  the default machine type and fat:rw: protocol is gone, so a fully
  automated FreeDOS smoke isn't tractable from userspace; this script
  builds a FAT data image (mtools), attaches it as -hdb to the FreeDOS
  qcow2, and points the user at the manual sequence in the script
  header.  The DOSBox-X harness (run_dos_smoke.sh) remains the
  automated DOS smoke.
2026-05-04 18:16:21 -04:00

102 lines
3.0 KiB
YAML

name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y libpulse-dev || true
- name: Build
run: |
mkdir build
cd build
cmake ..
make -j$(nproc)
- name: Interpreter tests
run: bash tests/run_tests.sh
- name: Compiler tests
run: bash tests/run_compiler_tests.sh
dos-cross-compile:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache OpenWatcom V2
id: cache-watcom
uses: actions/cache@v4
with:
path: ~/openwatcom-v2
key: openwatcom-v2-snapshot
- name: Install OpenWatcom V2
if: steps.cache-watcom.outputs.cache-hit != 'true'
run: |
mkdir -p ~/openwatcom-v2
curl -L -o /tmp/ow-snapshot.tar.xz \
https://github.com/open-watcom/open-watcom-v2/releases/download/Last-CI-build/ow-snapshot.tar.xz
tar -xJf /tmp/ow-snapshot.tar.xz -C ~/openwatcom-v2
rm -f /tmp/ow-snapshot.tar.xz
- name: Configure OpenWatcom env
run: |
# Generate the setvars.sh that build_dos.sh sources automatically.
# The cache step skips its creation step so this also runs on
# cache hits; -f overwrites without complaint.
cat > ~/openwatcom-v2/setvars.sh <<'EOF'
export WATCOM=$HOME/openwatcom-v2
export PATH=$WATCOM/binl64:$WATCOM/binl:$PATH
export EDPATH=$WATCOM/eddat
export INCLUDE=$WATCOM/h
EOF
chmod +x ~/openwatcom-v2/setvars.sh
# Also export to subsequent steps directly so a missing
# setvars.sh on a future runner doesn't silently break the build.
{
echo "WATCOM=$HOME/openwatcom-v2"
echo "EDPATH=$HOME/openwatcom-v2/eddat"
echo "INCLUDE=$HOME/openwatcom-v2/h"
} >> "$GITHUB_ENV"
echo "$HOME/openwatcom-v2/binl64" >> "$GITHUB_PATH"
echo "$HOME/openwatcom-v2/binl" >> "$GITHUB_PATH"
- name: Build 16-bit DOS target
run: |
./build_dos.sh 16
mkdir -p .ci-stash
cp gwbasic16.exe .ci-stash/
- name: Build 32-bit DOS target
run: |
./build_dos.sh clean
./build_dos.sh 32
cp gwbasic.exe .ci-stash/
- name: Verify binary sizes look sane
run: |
size16=$(stat -c%s .ci-stash/gwbasic16.exe)
size32=$(stat -c%s .ci-stash/gwbasic.exe)
echo "gwbasic16.exe = $size16 bytes"
echo "gwbasic.exe = $size32 bytes"
[ "$size16" -gt 80000 ] && [ "$size16" -lt 200000 ]
[ "$size32" -gt 100000 ] && [ "$size32" -lt 500000 ]
- name: Upload DOS artifacts
uses: actions/upload-artifact@v4
with:
name: dos-binaries
path: .ci-stash/*.exe