From 2273fa44caf0324f477fd220e4b3d94daf2e05c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Sat, 7 Mar 2026 12:34:55 +0100 Subject: [PATCH 01/10] build: migrate to mbt build system Replace legacy config.mk/rules.mk/scripts build system with mbt submodule. Add project.toml with autocall=false (Lua module names don't match function names). Add CI workflows for automated build and release. Closes #1 --- .env.example | 24 +++-- .github/workflows/build.yml | 11 +++ .github/workflows/release.yml | 9 ++ .gitignore | 2 + .gitmodules | 6 +- Makefile | 43 +-------- config.mk | 30 ------- contrib/crent370_sdk | 1 - doc/.gitkeep | 0 mbt | 1 + project.toml | 33 +++++++ rules.mk | 37 -------- scripts/mvsasm | 163 ---------------------------------- 13 files changed, 71 insertions(+), 289 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/release.yml delete mode 100644 config.mk delete mode 160000 contrib/crent370_sdk delete mode 100644 doc/.gitkeep create mode 160000 mbt create mode 100644 project.toml delete mode 100644 rules.mk delete mode 100755 scripts/mvsasm diff --git a/.env.example b/.env.example index 2b33c26..fedfde8 100644 --- a/.env.example +++ b/.env.example @@ -1,16 +1,12 @@ -# MVS host connection -MVS_HOST=localhost -MVS_PORT=1080 -MVS_USER=IBMUSER -MVS_PASS=secret +# MVS connection +MBT_MVS_HOST=localhost +MBT_MVS_PORT=1080 +MBT_MVS_USER=IBMUSER +MBT_MVS_PASS=secret -# JES job settings -MVS_JOBCLASS=A -MVS_MSGCLASS=H +# Dataset high-level qualifier +MBT_MVS_HLQ=IBMUSER -# CRENT370 (dependency) -CRENT_MACLIB=CRENT370.MACLIB - -# Lua370 datasets -LUA_PUNCH=IBMUSER.LUA370.OBJECT -LUA_SYSLMOD=IBMUSER.LUA370.NCALIB +# Dependency datasets HLQ and volume +MBT_MVS_DEPS_HLQ=MBTDEPS +MBT_MVS_DEPS_VOLUME=PUB000 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..18cc9a0 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,11 @@ +name: Build + +on: + pull_request: + +jobs: + build: + uses: mvslovers/mbt/.github/workflows/build.yml@main + with: + incremental: ${{ github.event_name == 'pull_request' }} + base_sha: ${{ github.event.pull_request.base.sha || '' }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..623077b --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,9 @@ +name: Release + +on: + push: + tags: ["v*"] + +jobs: + release: + uses: mvslovers/mbt/.github/workflows/release.yml@main diff --git a/.gitignore b/.gitignore index e729e9c..f2e6a63 100644 --- a/.gitignore +++ b/.gitignore @@ -6,10 +6,12 @@ # Build artifacts *.jcl .build-warnings +.mbt/ # IDE *.geany compile_commands.json +.cache/ # Environment .env diff --git a/.gitmodules b/.gitmodules index 9545b4b..6c06465 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "contrib/crent370_sdk"] - path = contrib/crent370_sdk - url = git@github.com:mvslovers/crent370_sdk.git +[submodule "mbt"] + path = mbt + url = git@github.com:mvslovers/mbt.git diff --git a/Makefile b/Makefile index 21036f7..900a642 100644 --- a/Makefile +++ b/Makefile @@ -1,41 +1,2 @@ -include config.mk - -# C source code files -C_FILES := src/lapi.c \ - src/lauxlib.c \ - src/lbaselib.c \ - src/lcode.c \ - src/lcorolib.c \ - src/ldblib.c \ - src/ldebug.c \ - src/ldo.c \ - src/ldump.c \ - src/lfunc.c \ - src/lgc.c \ - src/linit.c \ - src/liolib.c \ - src/llex.c \ - src/lmathlib.c \ - src/lmem.c \ - src/loadlib.c \ - src/lobject.c \ - src/lopcodes.c \ - src/loslib.c \ - src/lparser.c \ - src/lstate.c \ - src/lstring.c \ - src/lstrlib.c \ - src/ltable.c \ - src/ltablib.c \ - src/ltm.c \ - src/lua.c \ - src/luac.c \ - src/lundump.c \ - src/lutf8lib.c \ - src/lvm.c \ - src/lzio.c - -# Assembler source files -A_FILES := - -include rules.mk +MBT_ROOT := mbt +include $(MBT_ROOT)/mk/core.mk diff --git a/config.mk b/config.mk deleted file mode 100644 index 0f3936a..0000000 --- a/config.mk +++ /dev/null @@ -1,30 +0,0 @@ -# Root of the repository (auto-detected) -ROOT_DIR := $(dir $(lastword $(MAKEFILE_LIST))) - -# Load personalizable settings from .env --include .env - -export MVS_HOST MVS_PORT MVS_USER MVS_PASS -export MVS_JOBCLASS MVS_MSGCLASS - -# Tools path (mvsasm etc.) -export PATH := $(ROOT_DIR)scripts:$(PATH) - -# Cross-compiler -CC := c2asm370 -CFLAGS := -fverbose-asm -S -DLUA_USE_C89 -DLUA_USE_JUMPTABLE=0 - -# Include paths -INC_DIR := $(ROOT_DIR)include -INC1 := $(ROOT_DIR)contrib/crent370_sdk/inc -INCS := -I$(INC_DIR) -I$(INC1) - -CFLAGS += $(INCS) - -# Map .env variables to mvsasm exports -export MAC1=$(CRENT_MACLIB) -export MVSASM_PUNCH=$(LUA_PUNCH) -export MVSASM_SYSLMOD=$(LUA_SYSLMOD) - -# Warning collection file -export BUILD_WARNINGS := $(ROOT_DIR).build-warnings diff --git a/contrib/crent370_sdk b/contrib/crent370_sdk deleted file mode 160000 index dfd50aa..0000000 --- a/contrib/crent370_sdk +++ /dev/null @@ -1 +0,0 @@ -Subproject commit dfd50aae4160c3d2736bd5fc9b19c4bdea867b96 diff --git a/doc/.gitkeep b/doc/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/mbt b/mbt new file mode 160000 index 0000000..1392ff6 --- /dev/null +++ b/mbt @@ -0,0 +1 @@ +Subproject commit 1392ff67d08ff8ff47b62dcea3de087ac00f4f95 diff --git a/project.toml b/project.toml new file mode 100644 index 0000000..d41b1db --- /dev/null +++ b/project.toml @@ -0,0 +1,33 @@ +[project] +name = "lua370" +version = "1.0.0-dev" +type = "library" + +[build] +cflags = ["-DLUA_USE_C89", "-DLUA_USE_JUMPTABLE=0"] + +[link] +autocall = false + +[mvs.build.datasets.punch] +suffix = "OBJECT" +dsorg = "PO" +recfm = "FB" +lrecl = 80 +blksize = 3120 +space = ["TRK", 30, 10, 50] + +[mvs.build.datasets.ncalib] +suffix = "NCALIB" +dsorg = "PO" +recfm = "U" +lrecl = 0 +blksize = 32760 +space = ["TRK", 30, 10, 50] + +[dependencies] +"mvslovers/crent370" = ">=1.0.0" + +[artifacts] +mvs = true +headers = true diff --git a/rules.mk b/rules.mk deleted file mode 100644 index a19f785..0000000 --- a/rules.mk +++ /dev/null @@ -1,37 +0,0 @@ -# Derived file lists -S_FILES := $(C_FILES:.c=.s) -O_FILES := $(C_FILES:.c=.o) $(A_FILES:.asm=.o) - -all: $(S_FILES) $(O_FILES) - @if [ -s "$(BUILD_WARNINGS)" ]; then \ - echo ""; \ - echo "=== Assembly Warnings ==="; \ - printf "%-10s %-10s %s\n" "MODULE" "JOBID" "STATUS"; \ - printf "%-10s %-10s %s\n" "------" "------" "------"; \ - cat "$(BUILD_WARNINGS)"; \ - echo ""; \ - fi - @echo "Done" -.PHONY: all clean - -%.o: %.s - @echo "mvsasm $(notdir $<)" - @mvsasm "$<" - @touch "$@" - -%.o: %.asm - @echo "mvsasm $(notdir $<)" - @mvsasm "$<" - @touch "$@" - -%.s: %.c - @echo "Compile $(notdir $<)" - $(CC) $(CFLAGS) -c $< -o $@ -# Workaround: c2asm370 emits comment lines that reach column 72, which -# HLASM treats as a continuation indicator (CC 0004). Truncate all lines -# to 71 columns until the compiler is fixed. - @sed 's/^\(.\{71\}\).*/\1/' $@ > $@.tmp && mv $@.tmp $@ - -clean: - @rm -f $(S_FILES) $(O_FILES) *.jcl - @rm -f $(BUILD_WARNINGS) diff --git a/scripts/mvsasm b/scripts/mvsasm deleted file mode 100755 index 675cfef..0000000 --- a/scripts/mvsasm +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/bash -# mvsasm - Assemble and link MVS source via z/OS MF REST API -set -euo pipefail - -# --- Load .env (working directory first, then script's repo root) --- -SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" -ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" -if [[ -f "$PWD/.env" ]]; then - source "$PWD/.env" -elif [[ -f "$ROOT_DIR/.env" ]]; then - source "$ROOT_DIR/.env" -fi - -# --- Argument parsing --- -SOURCE="$1" -PUNCH="${MVSASM_PUNCH:-}" -SYSLMOD="${MVSASM_SYSLMOD:-}" - -JOBNAME=$(basename "$SOURCE" | tr '[:lower:]' '[:upper:]' | cut -d'.' -f1) -JOBNAME="${JOBNAME:0:8}" - -[[ -n "$PUNCH" ]] && PUNCH="$PUNCH($JOBNAME)" -[[ -n "$SYSLMOD" ]] && SYSLMOD="$SYSLMOD($JOBNAME)" - -LKED_SYSLIB="${MVSASM_SYSLMOD:-}" -JOBCLASS="${MVS_JOBCLASS:-A}" -MSGCLASS="${MVS_MSGCLASS:-H}" - -# --- Validate required settings --- -: "${MVS_HOST:?MVS_HOST not set (check .env)}" -: "${MVS_PORT:?MVS_PORT not set (check .env)}" -: "${MVS_USER:?MVS_USER not set (check .env)}" -: "${MVS_PASS:?MVS_PASS not set (check .env)}" - -BASE_URL="http://${MVS_HOST}:${MVS_PORT}/zosmf/restjobs/jobs" - -# URL-encode JOBNAME (# -> %23 etc.) -JOBNAME_ENC=$(printf '%s' "$JOBNAME" | sed 's/#/%23/g') - -# --- SYSLIB DD cards from MAC1..MAC9 --- -MACLIBS="" -for i in $(seq 1 9); do - var="MAC${i}" - val="${!var:-}" - [[ -n "$val" ]] && MACLIBS+="// DD DSN=$(echo "$val" | tr '[:lower:]' '[:upper:]'),DISP=SHR -" -done - -# --- SYSPUNCH DD --- -if [[ -n "$PUNCH" ]]; then - PUNCH_DD="//SYSPUNCH DD DSN=$PUNCH,DISP=SHR" -else - PUNCH_DD="//SYSPUNCH DD DSN=&&ASMOUT,DISP=(,PASS),UNIT=SYSALLDA, -// DCB=(LRECL=80,BLKSIZE=6160,RECFM=FB), -// SPACE=(6160,(500,500))" -fi - -# --- SYSLMOD DD --- -if [[ -n "$SYSLMOD" ]]; then - SYSLMOD_DD="//SYSLMOD DD DSN=$SYSLMOD,DISP=SHR" -else - SYSLMOD_DD="//SYSLMOD DD DSN=&&SYSLMOD(TEMPNAME),DISP=(,PASS),UNIT=SYSALLDA, -// DCB=(LRECL=0,BLKSIZE=15040,RECFM=U), -// SPACE=(15040,(500,500,5))" -fi - -# --- SYSLIN input for linker --- -LINKIN="${PUNCH:-&&ASMOUT}" - -# --- Generate JCL --- -if [[ "${MVSASM_KEEP_JCL:-0}" == "1" ]]; then - SRCDIR="$(dirname "$SOURCE")" - TEMPFILE="$SRCDIR/$JOBNAME.jcl" -else - TEMPFILE=$(mktemp) - trap 'rm -f "$TEMPFILE"' EXIT -fi - -cat > "$TEMPFILE" < "${TEMPFILE}.tmp" && mv "${TEMPFILE}.tmp" "$TEMPFILE" - -# --- Submit via curl --- -RESULT=$(curl -s -S --connect-timeout 10 --max-time 60 -X PUT \ - -u "${MVS_USER}:${MVS_PASS}" \ - -H "Content-Type: text/plain" \ - -H "X-IBM-Intrdr-Mode: TEXT" \ - -H "X-IBM-Intrdr-Lrecl: 80" \ - -H "X-IBM-Intrdr-Recfm: F" \ - --data-binary @"$TEMPFILE" \ - "$BASE_URL" 2>&1) || { - echo "mvsasm: connection failed for $JOBNAME" >&2 - echo "$RESULT" >&2 - exit 1 -} - -JOBID=$(echo "$RESULT" | jq -r '.jobid // empty' 2>/dev/null) || true -RETCODE=$(echo "$RESULT" | jq -r '.retcode // empty' 2>/dev/null) || true - -if [[ -z "$JOBID" ]]; then - echo "mvsasm: submit failed for $JOBNAME" >&2 - echo "$RESULT" >&2 - exit 1 -fi - -# --- Poll for job completion --- -while [[ -z "$RETCODE" || "$RETCODE" == "null" ]]; do - sleep 2 - STATUS=$(curl -s --connect-timeout 10 --max-time 30 -u "${MVS_USER}:${MVS_PASS}" \ - "$BASE_URL/$JOBNAME_ENC/$JOBID" 2>&1) - RETCODE=$(echo "$STATUS" | jq -r '.retcode // empty' 2>/dev/null) || true -done - -# --- Evaluate RC --- -# retcode format: "CC 0000", "CC 0004", "CC 0008", etc. -RC_NUM=$(echo "$RETCODE" | grep -oE '[0-9]+' | head -1) -RC_NUM=$((10#${RC_NUM:-9999})) - -if [[ "$RC_NUM" -gt 4 ]]; then - echo "mvsasm: $JOBNAME ($JOBID) FAILED RC=$RETCODE" >&2 - exit 1 -elif [[ "$RC_NUM" -eq 4 ]]; then - # CC=4: collect warning - if [[ -n "${BUILD_WARNINGS:-}" ]]; then - printf "%-10s %-10s %s\n" "$JOBNAME" "$JOBID" "CC 0004 (warning)" >> "$BUILD_WARNINGS" - else - echo "mvsasm: $JOBNAME ($JOBID) CC 0004 (warning)" >&2 - fi -fi - -exit 0 From ac7bd12d87e7a8d22b198e6359dd36e4221a8bc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Sat, 7 Mar 2026 13:57:13 +0100 Subject: [PATCH 02/10] chore: update mbt submodule --- mbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mbt b/mbt index 1392ff6..ff2144d 160000 --- a/mbt +++ b/mbt @@ -1 +1 @@ -Subproject commit 1392ff67d08ff8ff47b62dcea3de087ac00f4f95 +Subproject commit ff2144db2d202624dc6a3c595b11c1103e952b09 From 5450922962cc6370fff18e1ddb7a5d4aacc64e80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Sun, 8 Mar 2026 13:16:02 +0100 Subject: [PATCH 03/10] feat: update mbt to unified build with incremental stamps Update mbt submodule to latest main. Add [mvs.build.datasets.source] required by the new unified PDS-based build with SHA256 stamp-based incremental builds. --- mbt | 2 +- project.toml | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/mbt b/mbt index ff2144d..8e5d451 160000 --- a/mbt +++ b/mbt @@ -1 +1 @@ -Subproject commit ff2144db2d202624dc6a3c595b11c1103e952b09 +Subproject commit 8e5d451a68cbfc536950003f9e60e1db175ebe46 diff --git a/project.toml b/project.toml index d41b1db..9bc14b3 100644 --- a/project.toml +++ b/project.toml @@ -4,11 +4,19 @@ version = "1.0.0-dev" type = "library" [build] -cflags = ["-DLUA_USE_C89", "-DLUA_USE_JUMPTABLE=0"] +cflags = ["-O0", "-DLUA_USE_C89", "-DLUA_USE_JUMPTABLE=0"] [link] autocall = false +[mvs.build.datasets.source] +suffix = "SOURCE" +dsorg = "PO" +recfm = "FB" +lrecl = 80 +blksize = 3120 +space = ["TRK", 100, 50, 50] + [mvs.build.datasets.punch] suffix = "OBJECT" dsorg = "PO" From c1d273508a3a01c4844ca273e41f01b54467f8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Sun, 8 Mar 2026 13:30:56 +0100 Subject: [PATCH 04/10] chore: update mbt submodule (version define, release fix) --- mbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mbt b/mbt index 8e5d451..ec46ce3 160000 --- a/mbt +++ b/mbt @@ -1 +1 @@ -Subproject commit 8e5d451a68cbfc536950003f9e60e1db175ebe46 +Subproject commit ec46ce349c0501e52945587943075e554befb278 From caad15efc54963a02dee3705508246be4b3d2401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Sun, 8 Mar 2026 20:35:03 +0100 Subject: [PATCH 05/10] update mbt submodule (asm-step RENT fix) --- mbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mbt b/mbt index ec46ce3..06e8835 160000 --- a/mbt +++ b/mbt @@ -1 +1 @@ -Subproject commit ec46ce349c0501e52945587943075e554befb278 +Subproject commit 06e883567fb99b0e11fb2dc4f6704b9e1fe8005b From 6796f24c8a644525525de3fc0fae0e60af9f9280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Mon, 9 Mar 2026 18:20:37 +0100 Subject: [PATCH 06/10] mbt updated; blksize for ncal dataset fixed to 3350 fitting size --- mbt | 2 +- project.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mbt b/mbt index 06e8835..74dd3db 160000 --- a/mbt +++ b/mbt @@ -1 +1 @@ -Subproject commit 06e883567fb99b0e11fb2dc4f6704b9e1fe8005b +Subproject commit 74dd3dbf63f74f06b8f14b5f72f951cecafc0c1f diff --git a/project.toml b/project.toml index 9bc14b3..c968014 100644 --- a/project.toml +++ b/project.toml @@ -30,11 +30,11 @@ suffix = "NCALIB" dsorg = "PO" recfm = "U" lrecl = 0 -blksize = 32760 +blksize = 19069 space = ["TRK", 30, 10, 50] [dependencies] -"mvslovers/crent370" = ">=1.0.0" +"mvslovers/crent370" = ">=1.0.4" [artifacts] mvs = true From 61b8603d432e7efc19e0e7b56c60810da87326b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Mon, 9 Mar 2026 18:22:04 +0100 Subject: [PATCH 07/10] release: v1.0.0 --- project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.toml b/project.toml index c968014..48fce41 100644 --- a/project.toml +++ b/project.toml @@ -1,6 +1,6 @@ [project] name = "lua370" -version = "1.0.0-dev" +version = "1.0.0" type = "library" [build] From 4b70f040aff913fe8ad69030dc3b5e8567e0774a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Mon, 9 Mar 2026 18:22:07 +0100 Subject: [PATCH 08/10] chore: bump to 1.0.1-dev --- project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.toml b/project.toml index 48fce41..a5e0325 100644 --- a/project.toml +++ b/project.toml @@ -1,6 +1,6 @@ [project] name = "lua370" -version = "1.0.0" +version = "1.0.1-dev" type = "library" [build] From fa483f6bbd560a66947e845555e8f3f955fcbec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Mon, 9 Mar 2026 18:34:33 +0100 Subject: [PATCH 09/10] blksize for datasets fixed to match 3350 --- project.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.toml b/project.toml index a5e0325..614762f 100644 --- a/project.toml +++ b/project.toml @@ -14,7 +14,7 @@ suffix = "SOURCE" dsorg = "PO" recfm = "FB" lrecl = 80 -blksize = 3120 +blksize = 19040 space = ["TRK", 100, 50, 50] [mvs.build.datasets.punch] @@ -22,7 +22,7 @@ suffix = "OBJECT" dsorg = "PO" recfm = "FB" lrecl = 80 -blksize = 3120 +blksize = 19040 space = ["TRK", 30, 10, 50] [mvs.build.datasets.ncalib] From 4d3cdcf720a03dbe5a97d92744a8c92d6278d203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20Gro=C3=9Fmann?= Date: Mon, 9 Mar 2026 19:41:10 +0100 Subject: [PATCH 10/10] .gitignore updated --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index f2e6a63..86476d7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ # Build artifacts *.jcl +contrib/ +dist/ .build-warnings .mbt/