Skip to content

Windows MSYS1 Workflow #292

Windows MSYS1 Workflow

Windows MSYS1 Workflow #292

Workflow file for this run

name: Windows MSYS1 Workflow
on:
workflow_dispatch:
inputs:
run_id:
description: 'The run ID of the workflow providing the CI tarball'
required: true
defaults:
run:
shell: cmd
jobs:
msys_build_test_createdist:
runs-on: windows-latest
timeout-minutes: 30
env:
MSYS_ROOT: C:\MinGW
MSYS_BIN: C:\MinGW\msys\1.0\bin
#BISON_PKGDATADIR: C:\MinGW\share\bison
M4: m4
MSYSTEM: MINGW32
MSYSPKGS: msys-m4 msys-flex msys-coreutils msys-help2man msys-bison msys-patch
# GC4+:
#MSYSPKGS: msys-m4 msys-flex msys-coreutils msys-help2man
#MINGW_BISON_VERS: bison-3.6 # minimal for GC 4.x+
MINGW_GMP_VERS: gmp-6.3.0 # always update for performance reasons
MINGW_BDB_VERS: db-6.0.19.NC
MINGW_PDCM_VERS: 4.4.0
MINGW_CJSON_VERS: 1.7.18
MINGW_XML2_VERS: 2.8.0
strategy:
fail-fast: false
matrix:
target:
- debug
- release
steps:
#- name: Set git user
# run: |
# git config --global user.name github-actions
# git config --global user.email [email protected]
#- name: Checkout code
# uses: actions/checkout@v4
- name: Get CI dist tarball
uses: actions/download-artifact@v4
with:
name: gnucobol-ci source distribution
run-id: ${{ github.event.inputs.run_id }}
github-token: ${{ secrets.GITHUB_TOKEN }}
#- name: Display structure of downloaded files
# run: ls -R
- name: Build environment setup
run: |
bash -lc "tar -xvf gnucobol*.tar.* --strip-components=1"
mkdir _build
- name: Setup environment
shell: pwsh
run: |
echo GITHUB_WORKSPACE=$env:GITHUB_WORKSPACE >> $env:GITHUB_ENV
echo HOME=$env:GITHUB_WORKSPACE >> $env:GITHUB_ENV
echo PATH="$env:MSYS_BIN;$env:PATH" >> $env:GITHUB_ENV
If ("${{ matrix.target }}" -eq "release") {
echo DISTDIR=GnuCOBOL_mingw >> $env:GITHUB_ENV
echo CFGOPT= >> $env:GITHUB_ENV
} Else {
echo DISTDIR=GnuCOBOL_mingw_dbg >> $env:GITHUB_ENV
echo CFGOPT="--enable-debug --enable-cobc-internal-checks --enable-hardening" >> $env:GITHUB_ENV
}
- name: Restore MSYS1 cache
id: restore-msys
uses: actions/cache/restore@v4
with:
key: cache-msys
path: ${{ env.MSYS_ROOT }}
- name: Install MSYS1
if: steps.restore-msys.outputs.cache-hit != 'true'
run: |
curl -O https://www.arnoldtrembley.com/MinGW-bkup02.7z
7z x -y MinGW-bkup02.7z -o%MSYS_ROOT%\
- name: Install MSYS1 packages
if: steps.restore-msys.outputs.cache-hit != 'true'
run: |
bash -lc "mingw-get install %MSYSPKGS%"
- name: Cleanup MSYS1 env
if: steps.restore-msys.outputs.cache-hit != 'true'
run: |
rmdir /Q /S %MSYS_ROOT%\docs
rmdir /Q /S %MSYS_ROOT%\var
del /Q %MSYS_ROOT%\bin\gdb.exe
- name: Save MSYS1 cache
if: steps.restore-msys.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: cache-msys
path: ${{ env.MSYS_ROOT }}
# - name: Restore Bison cache
# id: restore-bison
# uses: actions/cache/restore@v4
# with:
# key: cache-msys-bison
# path: ${{ env.MINGW_BISON_VERS }}
# - name: Install Bison
# if: steps.restore-bison.outputs.cache-hit != 'true'
# run: |
# curl -L https://ftp.gnu.org/gnu/bison/%MINGW_BISON_VERS%.tar.gz -o %MINGW_BISON_VERS%.tar.gz
# tar -xvf %MINGW_BISON_VERS%.tar.gz
# bash -lc "cd %MINGW_BISON_VERS% && ./configure --prefix=/mingw && make"
# - name: Install Bison
# run: |
# bash -lc "make -C %MINGW_BISON_VERS% install"
# - name: Save Bison cache
# if: steps.restore-bison.outputs.cache-hit != 'true'
# uses: actions/cache/save@v4
# with:
# key: cache-msys-bison
# path: ${{ env.MINGW_BISON_VERS }}
- name: Restore GMP cache
id: restore-gmp
uses: actions/cache/restore@v4
with:
key: cache-msys-gmp
path: ${{ env.MINGW_GMP_VERS }}
- name: Build GMP
if: steps.restore-gmp.outputs.cache-hit != 'true'
run: |
rem note: MSYS1 cannot connect to https://gmplib.org, so using GNU mirror side instead
curl -L https://ftp.gnu.org/gnu/gmp/%MINGW_GMP_VERS%.tar.xz -o %MINGW_GMP_VERS%.tar.xz
tar -xvf %MINGW_GMP_VERS%.tar.xz
bash -lc "cd %MINGW_GMP_VERS% && ./configure --prefix=/mingw --enable-fat --enable-shared --disable-static CFLAGS=\"-Wno-attributes -Wno-ignored-attributes\" ABI=32 && make --jobs=$(($(nproc)+1))"
- name: Install GMP
run: |
bash -lc "make -C %MINGW_GMP_VERS% install"
- name: Save GMP cache
if: steps.restore-gmp.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: cache-msys-gmp
path: ${{ env.MINGW_GMP_VERS }}
- name: Restore BDB cache
id: restore-bdb
uses: actions/cache/restore@v4
with:
key: cache-msys-bdb
path: ${{ env.MINGW_BDB_VERS }}
- name: Build BDB
if: steps.restore-bdb.outputs.cache-hit != 'true'
run: |
curl -L https://download.oracle.com/berkeley-db/%MINGW_BDB_VERS%.tar.gz -o %MINGW_BDB_VERS%.tar.gz
curl -L https://raw.githubusercontent.com/msys2/MINGW-packages/refs/heads/master/mingw-w64-db/0001-db-tls-m4-fix-pthread.patch -o db-tls-m4-fix-pthread.patch
curl -L https://raw.githubusercontent.com/msys2/MINGW-packages/refs/heads/master/mingw-w64-db/mingw.patch -o mingw.patch
curl -L https://raw.githubusercontent.com/msys2/MINGW-packages/refs/heads/master/mingw-w64-db/cclang_cxx_11.patch -o cx11.patch
tar -xvf %MINGW_BDB_VERS%.tar.gz
sed -i 's/_tcsclen/_mbslen/' %MINGW_BDB_VERS%\src\os_windows\os_stat.c
bash -lc "cd %MINGW_BDB_VERS% && patch -p1 -i ../db-tls-m4-fix-pthread.patch"
bash -lc "cd %MINGW_BDB_VERS% && patch -p1 -i ../mingw.patch"
bash -lc "cd %MINGW_BDB_VERS% && patch -p1 -i ../cx11.patch"
bash -lc "cd %MINGW_BDB_VERS%/build_unix && ../dist/configure --prefix=/mingw --enable-mingw --enable-debug --disable-static --disable-replication --disable-tcl --without-cryptography LIBCSO_LIBS=-lwsock32 && make --jobs=$(($(nproc)+1))"
- name: Install BDB
run: |
bash -lc "make -C %MINGW_BDB_VERS%/build_unix install"
- name: Save BDB cache
if: steps.restore-bdb.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: cache-msys-bdb
path: ${{ env.MINGW_BDB_VERS }}
- name: Restore PDCursesMod cache
id: restore-pdcm
uses: actions/cache/restore@v4
with:
key: cache-msys-pdcm
path: PDCursesMod-${{ env.MINGW_PDCM_VERS }}
- name: Build PDCursesMod
if: steps.restore-pdcm.outputs.cache-hit != 'true'
run: |
curl -L https://github.com/Bill-Gray/PDCursesMod/archive/refs/tags/v%MINGW_PDCM_VERS%.tar.gz -o "PDCursesMod-%MINGW_PDCM_VERS%.tar.xz"
tar -xvf PDCursesMod-%MINGW_PDCM_VERS%.tar.xz
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && make -C wincon --jobs=$(($(nproc)+1)) INFOEX=N CHTYPE_64=Y DEBUG=Y DLL=Y DLLNAME=libpdcurses LIBNAME=libpdcurses.dll"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && make -C wingui --jobs=$(($(nproc)+1)) CHTYPE_64=Y DEBUG=Y DLL=Y DLLNAME=libpdcurses LIBNAME=libpdcurses.dll"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && make -C vt --jobs=$(($(nproc)+1)) CHTYPE_64=Y DEBUG=Y DLL=Y DLLNAME=libpdcurses LIBNAME=libpdcurses.dll CFLAGS=\"-Wall -Wextra -pedantic -g -DPDCDEBUG -fPIC -DPDC_DLLbuild\""
echo #define CHTYPE_64 > PDCursesMod-%MINGW_PDCM_VERS%\pdcurses.h
echo #define PDC_DLLbuild >> PDCursesMod-%MINGW_PDCM_VERS%\pdcurses.h
echo #include "pdcurses/curses.h" >> PDCursesMod-%MINGW_PDCM_VERS%\pdcurses.h
- name: Install PDCursesMod
run: |
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && install wincon/libpdcurses.dll.a /mingw/lib/"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && install wincon/libpdcurses.dll /mingw/bin/"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && install wincon/libpdcurses.dll /mingw/bin/libpdcurses-wincon.dll"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && install wingui/libpdcurses.dll /mingw/bin/libpdcurses-wingui.dll"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && install vt/libpdcurses.dll /mingw/bin/libpdcurses-vt.dll"
bash -lc "install -d /mingw/include/pdcurses"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && install -m 0644 curses.h panel.h term.h /mingw/include/pdcurses/"
bash -lc "cd PDCursesMod-%MINGW_PDCM_VERS% && install -m 0644 pdcurses.h /mingw/include/"
- name: Save PDCursesMod cache
if: steps.restore-pdcm.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: cache-msys-pdcm
path: PDCursesMod-${{ env.MINGW_PDCM_VERS }}
- name: Restore LibXML2 cache
id: restore-xml2
uses: actions/cache/restore@v4
with:
key: cache-msys-xml2
path: libxml2-${{ env.MINGW_XML2_VERS }}
- name: Build LibXML2
if: steps.restore-xml2.outputs.cache-hit != 'true'
run: |
curl -L https://github.com/GNOME/libxml2/archive/refs/tags/v%MINGW_XML2_VERS%.tar.gz -o libxml2-%MINGW_XML2_VERS%.tar.xz
tar -xvf libxml2-%MINGW_XML2_VERS%.tar.xz
bash -lc "cd libxml2-%MINGW_XML2_VERS% && ./autogen.sh"
bash -lc "cd libxml2-%MINGW_XML2_VERS% && ./configure --prefix=/mingw --enable-debug && make --jobs=$(($(nproc)+1))"
- name: Install LibXML2
run: |
bash -lc "make -C libxml2-%MINGW_XML2_VERS% install"
- name: Save LibXML2 cache
if: steps.restore-xml2.outputs.cache-hit != 'true'
uses: actions/cache/save@v4
with:
key: cache-msys-xml2
path: libxml2-${{ env.MINGW_XML2_VERS }}
- name: get cJSON
run: |
curl -L https://raw.githubusercontent.com/DaveGamble/cJSON/v%MINGW_CJSON_VERS%/cJSON.c -o .\libcob\cJSON.c
curl -L https://raw.githubusercontent.com/DaveGamble/cJSON/v%MINGW_CJSON_VERS%/cJSON.h -o .\libcob\cJSON.h
# - name: Bootstrap GnuCOBOL
# run: |
# sed -i 's/AM_PROG_AR/m4_ifdef\(\[AM_PROG_AR\], \[AM_PROG_AR\]\)/g' .\configure.ac
# sed -i 's/po extras doc tests/po extras tests/g' .\Makefile.am
# bash -lc "./autogen.sh"
- name: Configure GnuCOBOL
run: |
bash -lc "cd _build && ../configure %CFGOPT% --with-db --with-xml2 --with-json=local --with-curses=pdcurses --prefix=/mingw"
rem Note: GC4 may need CPPFLAGS="-I../libcob" for local cJSON
- name: Build GnuCOBOL
run: |
bash -lc "CPATH=$(pwd) make -C _build --jobs=$(($(nproc)+1))"
rem Note: the extra CPATH above is only required in debug builds (otherwise gcc invoked from cobc does not find libcob.h [pre-inst-env]), for some reason...
- name: Upload config-${{ matrix.target }}.log
if: failure()
uses: actions/upload-artifact@v4
with:
name: config-${{ matrix.target }}.log
path: _build/config.log
- name: Run testsuite
run: |
rem skip test as it sometimes works and sometimes not...
rem instead of
rem sed -i '/AT_SETUP(\[temporary path invalid\])/a AT_SKIP_IF(\[true\])' tests/testsuite.src/used_binaries.at
rem use
sed -i '/used_binaries/{N;/temporary path invalid/{N;N;N;N;s/traceon/traceon; at_fn_check_skip 77 workflow:1/;}}' tests/testsuite
rem change to expected fail if there's an error specific to the CI that we don't want to change
rem in the testsuite for expected result (should normally only be a temporary thing)
rem instead of
rem sed -i '/AT_SETUP(\[Compare FLOAT-LONG with floating-point literal\])/a AT_XFAIL_IF(\[true\])' tests/testsuite.src/run_fundamental.at
rem use
rem sed -i '/run_fundamental/{N;/Compare FLOAT-LONG with floating-point literal/{N;s/at_xfail=no/at_xfail=yes/;}}' tests/testsuite
bash -lc "CPATH=$(pwd) make -C _build/tests check TESTSUITEFLAGS=\"--jobs=$(($(nproc)+1))\""
rem Note: the extra CPATH above is only required in debug builds (otherwise gcc invoked from cobc does not find libcob.h [atlocal]), for some reason...
- name: Upload testsuite-${{ matrix.target }}.log
if: ${{ ! cancelled() }} #-> always upload as build result documentation
uses: actions/upload-artifact@v4
with:
name: testsuite-${{ matrix.target }}.log
path: _build/tests/testsuite.log
- name: Cache newcob.val
uses: actions/cache@v4
with:
path: _build/tests/cobol85/newcob.val
key: newcob-val
save-always: true
enableCrossOsArchive: true
- name: Run NIST85 testsuite
# if we ever need to disable something in the tests: skip like here IF106A
# and later expect a failure
# perl -pi -e 's/^# OBNC1M/\$skip{IF106A} = 1; # OBNC1M/' tests/cobol85/report.pl
# bash -lc "CPATH=$(pwd) make -C _build/tests test --jobs=$(($(nproc)+1)) || echo \"WARNING: NIST85 did not pass!\""
run: |
bash -lc "CPATH=$(pwd) make -C _build/tests test --jobs=$(($(nproc)+1))"
rem Note: the extra CPATH above is only required in debug builds (otherwise gcc invoked from cobc does not find libcob.h [atlocal]), for some reason...
- name: Upload NIST85 Test Suite results
if: ${{ ! cancelled() }} #-> always upload as build result documentation
uses: actions/upload-artifact@v4
with:
name: NIST85 results on ${{ matrix.target }}
path: |
_build/tests/cobol85/summary.*
_build/tests/cobol85/**/*.log
_build/tests/cobol85/**/*.out
_build/tests/cobol85/**/duration.txt
- name: Package GnuCOBOL
run: |
bash -lc "make -C _build distmingw"
- name: Upload GnuCOBOL_mingw-${{ matrix.target }}
uses: actions/upload-artifact@v4
with:
name: GnuCOBOL_mingw-${{ matrix.target }}
path: _build/${{ env.DISTDIR }}