diff --git a/.gitea/workflows/ci-dev.yaml b/.gitea/workflows/ci-dev.yaml index 7106c5f..2aabc27 100644 --- a/.gitea/workflows/ci-dev.yaml +++ b/.gitea/workflows/ci-dev.yaml @@ -4,9 +4,6 @@ on: push: branches: - dev - pull_request: - branches: - - dev jobs: build-and-test: diff --git a/.gitea/workflows/ci-stage.yaml b/.gitea/workflows/ci-stage.yaml index 06f946d..165bed9 100644 --- a/.gitea/workflows/ci-stage.yaml +++ b/.gitea/workflows/ci-stage.yaml @@ -1,4 +1,4 @@ -name: El SDK CI — stage +name: El SDK CI - stage on: push: @@ -19,7 +19,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Enforce source branch (stage ← dev only) + - name: Enforce source branch (stage <- dev only) if: github.event_name == 'pull_request' run: | SOURCE="${GITHUB_HEAD_REF}" @@ -27,7 +27,7 @@ jobs: echo "ERROR: Stage branch only accepts PRs from 'dev'. Source was: '${SOURCE}'" exit 1 fi - echo "Source branch check passed: ${SOURCE} → stage" + echo "Source branch check passed: ${SOURCE} -> stage" - name: Install build dependencies run: | @@ -37,18 +37,21 @@ jobs: # Gen2: compile the bootstrap C source into a working elc binary - name: Build elc from bootstrap (gen2) run: | + # -Wl,--allow-multiple-definition: elc-bootstrap.c and el_runtime.c both define + # is_digit/is_whitespace; bootstrap predates the text-processing primitives commit gcc -O2 \ -I el-compiler/runtime \ dist/elc-bootstrap.c \ el-compiler/runtime/el_runtime.c \ - -lcurl -lpthread \ + -lcurl -lpthread -lm \ + -Wl,--allow-multiple-definition \ -o dist/elc-gen2 chmod +x dist/elc-gen2 echo "gen2 elc built" dist/elc-gen2 --version || true # Gen3: use gen2 to compile the El compiler from its own El source (self-host) - - name: Self-host: compile El compiler with gen2 (gen3) + - name: Self-host compile El compiler with gen2 (gen3) run: | mkdir -p dist/platform dist/elc-gen2 el-compiler/src/compiler.el > dist/elc-gen3.c @@ -56,37 +59,130 @@ jobs: -I el-compiler/runtime \ dist/elc-gen3.c \ el-compiler/runtime/el_runtime.c \ - -lcurl -lpthread \ + -lcurl -lpthread -lm \ -o dist/platform/elc chmod +x dist/platform/elc echo "gen3 (self-hosted) elc built" dist/platform/elc --version || true - - name: Run tests — text + - name: Run tests - text run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/text/run.sh - - name: Run tests — calendar + - name: Run tests - calendar run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/calendar/run.sh - - name: Run tests — time + - name: Run tests - time run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/time/run.sh - - name: Run tests — html_sanitizer + - name: Run tests - html_sanitizer run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/html_sanitizer/run.sh + # Native El test suites (elc --test, compile-link-run) + - name: Run tests - native (core) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_core.el > /tmp/el_native_core.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_core.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_core + /tmp/el_native_core + + - name: Run tests - native (text) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_text.el > /tmp/el_native_text.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_text.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_text + /tmp/el_native_text + + - name: Run tests - native (string) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_string.el > /tmp/el_native_string.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_string.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_string + /tmp/el_native_string + + - name: Run tests - native (math) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_math.el > /tmp/el_native_math.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_math.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_math + /tmp/el_native_math + + - name: Run tests - native (state) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_state.el > /tmp/el_native_state.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_state.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_state + /tmp/el_native_state + + - name: Run tests - native (time) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_time.el > /tmp/el_native_time.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_time.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_time + /tmp/el_native_time + + - name: Run tests - native (json) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_json.el > /tmp/el_native_json.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_json.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_json + /tmp/el_native_json + + - name: Run tests - native (env) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_env.el > /tmp/el_native_env.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_env.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_env + /tmp/el_native_env + + - name: Run tests - native (fs) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_fs.el > /tmp/el_native_fs.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_fs.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_fs + /tmp/el_native_fs + + # Publish only after merge (push event), not on PR validation runs - name: Publish El SDK to Artifact Registry (stage) + if: github.event_name == 'push' env: GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }} run: | diff --git a/.gitea/workflows/sdk-release.yaml b/.gitea/workflows/sdk-release.yaml index ae9f1fd..7227b73 100644 --- a/.gitea/workflows/sdk-release.yaml +++ b/.gitea/workflows/sdk-release.yaml @@ -4,6 +4,9 @@ on: push: branches: - main + pull_request: + branches: + - main jobs: build-and-release: @@ -16,7 +19,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Enforce source branch (main ← stage only) + - name: Enforce source branch (main <- stage only) if: github.event_name == 'pull_request' run: | SOURCE="${GITHUB_HEAD_REF}" @@ -24,7 +27,7 @@ jobs: echo "ERROR: Main branch only accepts PRs from 'stage'. Source was: '${SOURCE}'" exit 1 fi - echo "Source branch check passed: ${SOURCE} → main" + echo "Source branch check passed: ${SOURCE} -> main" - name: Install build dependencies run: | @@ -34,18 +37,21 @@ jobs: # Gen2: compile the bootstrap C source into a working elc binary - name: Build elc from bootstrap (gen2) run: | + # -Wl,--allow-multiple-definition: elc-bootstrap.c and el_runtime.c both define + # is_digit/is_whitespace; bootstrap predates the text-processing primitives commit gcc -O2 \ -I el-compiler/runtime \ dist/elc-bootstrap.c \ el-compiler/runtime/el_runtime.c \ - -lcurl -lpthread \ + -lcurl -lpthread -lm \ + -Wl,--allow-multiple-definition \ -o dist/elc-gen2 chmod +x dist/elc-gen2 echo "gen2 elc built" dist/elc-gen2 --version || true # Gen3: use gen2 to compile the El compiler from its own El source (self-host) - - name: Self-host: compile El compiler with gen2 (gen3) + - name: Self-host compile El compiler with gen2 (gen3) run: | mkdir -p dist/platform dist/elc-gen2 el-compiler/src/compiler.el > dist/elc-gen3.c @@ -53,7 +59,7 @@ jobs: -I el-compiler/runtime \ dist/elc-gen3.c \ el-compiler/runtime/el_runtime.c \ - -lcurl -lpthread \ + -lcurl -lpthread -lm \ -o dist/platform/elc chmod +x dist/platform/elc echo "gen3 (self-hosted) elc built" @@ -68,7 +74,7 @@ jobs: -I el-compiler/runtime \ dist/elb.c \ el-compiler/runtime/el_runtime.c \ - -lcurl -lpthread \ + -lcurl -lpthread -lm \ -o dist/bin/elb chmod +x dist/bin/elb echo "elb built" @@ -81,7 +87,7 @@ jobs: -I el-compiler/runtime \ dist/epm.c \ el-compiler/runtime/el_runtime.c \ - -lcurl -lpthread \ + -lcurl -lpthread -lm \ -o dist/bin/epm chmod +x dist/bin/epm echo "epm built" @@ -94,37 +100,129 @@ jobs: -I el-compiler/runtime \ dist/el-install.c \ el-compiler/runtime/el_runtime.c \ - -lcurl -lpthread \ + -lcurl -lpthread -lm \ -o dist/bin/el-install chmod +x dist/bin/el-install echo "el-install built" - - name: Run tests — text + - name: Run tests - text run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/text/run.sh - - name: Run tests — calendar + - name: Run tests - calendar run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/calendar/run.sh - - name: Run tests — time + - name: Run tests - time run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/time/run.sh - - name: Run tests — html_sanitizer + - name: Run tests - html_sanitizer run: | ELC="$(pwd)/dist/platform/elc" \ EL_HOME="$(pwd)" \ bash tests/html_sanitizer/run.sh - # Bundle the SDK tarball — runs from the repo root to reference lang/ paths correctly + # Native El test suites (elc --test, compile-link-run) + - name: Run tests - native (core) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_core.el > /tmp/el_native_core.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_core.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_core + /tmp/el_native_core + + - name: Run tests - native (text) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_text.el > /tmp/el_native_text.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_text.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_text + /tmp/el_native_text + + - name: Run tests - native (string) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_string.el > /tmp/el_native_string.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_string.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_string + /tmp/el_native_string + + - name: Run tests - native (math) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_math.el > /tmp/el_native_math.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_math.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_math + /tmp/el_native_math + + - name: Run tests - native (state) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_state.el > /tmp/el_native_state.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_state.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_state + /tmp/el_native_state + + - name: Run tests - native (time) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_time.el > /tmp/el_native_time.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_time.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_time + /tmp/el_native_time + + - name: Run tests - native (json) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_json.el > /tmp/el_native_json.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_json.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_json + /tmp/el_native_json + + - name: Run tests - native (env) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_env.el > /tmp/el_native_env.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_env.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_env + /tmp/el_native_env + + - name: Run tests - native (fs) + run: | + set -euo pipefail + ELC="$(pwd)/dist/platform/elc" + RUNTIME="$(pwd)/el-compiler/runtime" + "$ELC" --test tests/native/test_fs.el > /tmp/el_native_fs.c + gcc -O2 -I "$RUNTIME" /tmp/el_native_fs.c "$RUNTIME/el_runtime.c" \ + -lcurl -lpthread -lm -o /tmp/el_native_fs + /tmp/el_native_fs + + # Bundle the SDK tarball - runs from the repo root to reference lang/ paths correctly - name: Bundle SDK tarball + if: github.event_name == 'push' working-directory: ${{ github.workspace }} run: | mkdir -p dist/sdk/bin dist/sdk/runtime @@ -140,6 +238,7 @@ jobs: # Publish / update the `latest` release with all SDK assets - name: Publish latest release + if: github.event_name == 'push' working-directory: ${{ github.workspace }} env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} @@ -198,6 +297,7 @@ jobs: echo "Release published successfully" - name: Publish El SDK to Artifact Registry (prod) + if: github.event_name == 'push' env: GCP_SA_KEY: ${{ secrets.GCP_SA_KEY }} run: | @@ -239,6 +339,7 @@ jobs: rm -f /tmp/gcp-key.json - name: Dispatch el-sdk-updated to downstream repos + if: github.event_name == 'push' env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} GITEA_API: https://git.neuralplatform.ai/api/v1