Skip to content

Optional Gradle build for apps, cn1libs and backends, on a shared build engine - #5922

Merged
shai-almog merged 36 commits into
masterfrom
gradle-bootstrap
Oct 1, 2026
Merged

shai-almog merged 36 commits into
masterfrom
gradle-bootstrap

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

An optional Gradle build for Codename One applications, cn1libs and backends, built on the Maven plugin's own implementation rather than beside it.

What a user gets

A single Gradle project: settings.gradle.kts (one plugin line), an optional build.gradle.kts, the wrapper, and src/main/.... Native directories (src/<platform>/<lang>) and backend/ appear only when generateNativeInterfaces or addBackend create them. Gradle projects are Java 17+ and leave out Maven-era legacy (legacy .cn1lib files, the legacy Designer task, the Java 8 target).

  • Project kinds: app, app + backend subproject, backend-only application, and cn1lib authoring. A Gradle cn1lib publishes the same Maven shape as cn1lib-archetype, so Maven apps can consume it and vice versa.
  • Tasks: run/debug, CSS, cn1Test, every cloud target plus local android-source/ios-source, -Pcodename1.stageOnly, native interfaces with a pre-build check that names a missing implementation, the desktop tools, runBackend/backendPackage, cn1Update. The configuration cache is on by default.
  • Getting a project: the initializr gains Build tool and Project type options (with Gradle IDE files and skill text); mvn cn1:convert-to-gradle converts a Maven or Ant project; cn1:generate-app-project -Dcn1.buildTool=gradle.
  • Supported range: Gradle 8.5 to the 9.6.0 the wrapper pins; older Gradle is refused with the fix.

How it is built

  • maven/project-model: one project-layout API for Ant, Maven and Gradle. The simulator, CSS compiler, Designer and the four GUI tools use it in place of their own copies of "where is the project".
  • maven/build-engine: the Maven-free build logic moved out of the Maven plugin (builders, annotation processors, compliance, CSS, packaging, native-interface stubs), behind a ProjectHost interface. The Maven mojos are now thin adapters; their 402 tests pass unchanged.
  • maven/codenameone-gradle-plugin (id com.codenameone) plus its marker artifact, released through the same R2 pipeline.

Maven fixes found along the way

  • The archetype's and initializr's win/linux modules never packaged src/main/c, so a Windows or Linux native-interface implementation never reached the build server. Found by the Maven/Gradle upload parity test.
  • The four cn1:settings/guibuilder/gamebuilder/certificatewizard launchers now share the Gradle tasks' DesktopTool (-824 lines); -o now applies to all of them, and each fails fast on a missing dependency.
  • Two SpotBugs findings, and headers on the files the move relocated.

Tests

  • Unit: project-model 14, build-engine 2168, Maven plugin 402, Gradle plugin 7, plus the css-cli, javase and Settings additions.
  • Integration (maven/integration-tests/gradle-*.sh, new workflow gradle-smoke.yml):
    • gradle-app-test.sh: convert, build, native-interface lifecycle, every target's upload jar, addBackend + /healthz.
    • gradle-maven-parity-test.sh: one app built by Maven and by Gradle uploads the same entries for seven cloud targets and generates equivalent android-source and ios-source projects, compared file by file (macOS job for iOS).
    • gradle-cn1lib-test.sh: a Gradle-built cn1lib consumed by a Gradle app and a Maven app.
    • gradle-migrate-test.sh: Ant (Java + Kotlin) and Maven to Gradle; a legacy .cn1lib is refused by name.
    • gradle-initializr-test.sh: all three initializr Gradle downloads build; the backend-only one packages to a native binary that serves /healthz.
    • gradle-tools-test.sh: Settings renders from cn1:settings and from ./gradlew settings.
  • CI runs these on JDK 17 and 21, and on Gradle 8.5 with 8.4 refused.

Docs

New Gradle-Project-Workflow chapter in the developer guide, plus updates to the Maven getting-started, native-interface, backend and appendix pages.

Not included

  • The initializr's Tweet template stays Maven-only: CodeRAD's annotation processor looks for a pom.xml.
  • The cloud starter canary has no Gradle leg: the console does not serve a Gradle starter yet.

🤖 Generated with Claude Code

…ld engine

Adds a Gradle plugin (id com.codenameone) that builds Codename One
applications, cn1libs and backends with a single small project: one
settings line, and native directories or a backend only when they are
created. It reuses the Maven plugin's implementation rather than
duplicating it:

- maven/project-model: one project-layout API for Ant, Maven and Gradle,
  now used by the simulator, CSS compiler, Designer and the GUI tools.
- maven/build-engine: the Maven-free build logic moved out of the Maven
  plugin behind a ProjectHost interface; the mojos are thin adapters.
- maven/codenameone-gradle-plugin and its marker artifact.

Also: initializr build-tool and project-type options, cn1:convert-to-gradle,
Gradle skill text, the developer guide chapter, and gradle-smoke.yml, which
holds Gradle to Maven parity (upload jars and generated android-source and
ios-source projects) and to the minimum Gradle version.

Maven fixes found on the way: the app archetype's win/linux modules never
packaged src/main/c, and the four desktop tool launchers now share one
implementation with the Gradle tasks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comment thread maven/integration-tests/inc/compare_generated_projects.py Outdated
Comment thread maven/integration-tests/inc/compare_generated_projects.py Outdated
@shai-almog

shai-almog commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

@github-actions

github-actions Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@github-actions

github-actions Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [Report archive]
    • ✅ ByteCodeTranslator: 0 findings (no issues)
    • ✅ android: 0 findings (no issues)
    • ✅ backend: 0 findings (no issues)
    • ✅ build-engine: 0 findings (no issues)
    • ✅ build-hint-catalog: 0 findings (no issues)
    • ✅ build-hint-tools: 0 findings (no issues)
    • ✅ codenameone-gradle-plugin: 0 findings (no issues)
    • ✅ codenameone-maven-plugin: 0 findings (no issues)
    • ✅ core-unittests: 0 findings (no issues)
    • ✅ ios: 0 findings (no issues)
    • ✅ project-model: 0 findings (no issues)
  • ✅ PMD: 0 findings (no issues) [Report archive]
  • ✅ Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@shai-almog

shai-almog commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 157 screenshots: 157 matched.

Native Android coverage

  • 📊 Line coverage: 9.37% (9335/99611 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 9.10% (47873/525841), branch 3.61% (1798/49819), complexity 3.58% (1903/53096), method 5.53% (1544/27918), class 11.06% (414/3742)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 9.37% (9335/99611 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 9.10% (47873/525841), branch 3.61% (1798/49819), complexity 3.58% (1903/53096), method 5.53% (1544/27918), class 11.06% (414/3742)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • okio.okio.Buffer – 0.00% (0/687 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 468ms / native 119ms = 3.9x speedup
SIMD float-mul (64K x300) java 174ms / native 128ms = 1.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 90.000 ms
Base64 CN1 decode 86.000 ms
Base64 native encode 429.000 ms
Base64 encode ratio (CN1/native) 0.210x (79.0% faster)
Base64 native decode 292.000 ms
Base64 decode ratio (CN1/native) 0.295x (70.5% faster)
Image encode benchmark status skipped (SIMD unsupported)

@github-actions

github-actions Bot commented Sep 28, 2026 •

Copy link
Copy Markdown
Contributor

✅ ByteCodeTranslator Quality Report

Test & Coverage

  • ✅ Tests: 740 total, 0 failed, 57 skipped

Benchmark Results

  • Execution Time: 15178 ms

  • Hotspots (Top 20 sampled methods):

    • 6.28% java.util.ArrayList.indexOf (90 samples)
    • 5.16% com.codename1.tools.translator.IteratorEscape.ctorOnlyStoresParamsIntoThis (74 samples)
    • 4.32% com.codename1.tools.translator.BytecodeMethod.equals (62 samples)
    • 4.11% org.objectweb.asm.tree.analysis.Frame.merge (59 samples)
    • 3.42% java.lang.StringBuilder.append (49 samples)
    • 2.93% java.lang.String.equals (42 samples)
    • 2.44% java.lang.System.identityHashCode (35 samples)
    • 2.44% java.util.HashMap.hash (35 samples)
    • 1.67% com.codename1.tools.translator.IteratorEscape.mangle (24 samples)
    • 1.60% com.codename1.tools.translator.ByteCodeClass.hasDeclaredMethod (23 samples)
    • 1.39% com.codename1.tools.translator.NativeSymbolIndex.<init> (20 samples)
    • 1.39% com.codename1.tools.translator.bytecodes.Invoke.resolveDirectTarget (20 samples)
    • 1.32% java.lang.StringCoding.encode (19 samples)
    • 1.32% org.objectweb.asm.ClassReader.readCode (19 samples)
    • 1.19% java.util.TreeMap.getEntry (17 samples)
    • 1.19% com.codename1.tools.translator.BytecodeMethod.optimize (17 samples)
    • 1.12% com.codename1.tools.translator.JavascriptReachability.enqueueResolved (16 samples)
    • 1.12% com.codename1.tools.translator.Parser.collectTypeTests (16 samples)
    • 0.98% org.objectweb.asm.tree.analysis.Analyzer.analyze (14 samples)
    • 0.98% java.util.HashMap.putVal (14 samples)
  • ⚠️ Coverage report not generated.

Static Analysis

  • ✅ SpotBugs: no findings (report was not generated by the build).
  • ⚠️ PMD report not generated.
  • ⚠️ Checkstyle report not generated.

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 193 screenshots: 193 matched.
✅ JavaScript-port screenshot tests passed.

shai-almog and others added 2 commits September 28, 2026 18:41
…w setup

- build-engine: declare JUnit before the ports. Maven orders the test
  classpath by declaration, and the Android platform jar's junit.* stubs
  shadowed JUnit 4, so the Vintage engine discovered no tests in a reactor
  build. Move the JavaScript proxy test-resource copy here with its test.
- Gradle plugin: pin Kotlin compile tasks to the Java 17 target; on JDK 21
  the Kotlin plugin refused the differing Java and Kotlin targets.
- Integration scripts skip without a JDK 17+ (ant.yml runs all.sh on JDK 8
  only); gradle-smoke.yml sets CN1_GRADLE_REQUIRED so it cannot skip.
- gradle-smoke.yml: Zulu 8 on macOS ARM64, a display for the Settings build.
- GUI Builder: its test still expected file://C:/, the form the shared fsUrl
  replaced with file:///C:/; drop the stale doc comment.
- Close files in compare_generated_projects.py.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
# Conflicts:
#	maven/build-engine/src/main/java/com/codename1/builders/JavaScriptBuildHints.java
#	maven/build-engine/src/test/java/com/codename1/builders/JavaScriptBuildHintsTest.java
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 28, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-01T16:50:50.979185Z 4ec9f72 Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ff31b922b3

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/codenameone-gradle-plugin/src/main/java/com/codename1/gradle/Cn1libs.java Outdated
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
- Gradle apps now take the platform artifacts of every cn1lib in the graph,
  not only declared ones: Maven activates codename1.platform in each pom, so
  a cn1lib used by another cn1lib contributes its native code too. Gradle
  cn1libs can use cn1libs (api scope), published as <type>pom</type>.
- A cn1lib without CSS publishes no cn1css bundle (publishing failed).
- Conversion keeps the backend's own dependencies in backend/build.gradle.kts
  and maps test-scoped dependencies to testImplementation.
- cn1Css clears its output when CSS is switched off or theme.css is gone.
- prepareSimulator reruns when the classpath or settings change.
- A versionless com.codenameone dependency gets the framework version.
- Cached native outputs are rebuilt when a build hint changes, tracked by a
  digest of the codename1.* properties.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 74764975a5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread Ports/JavaSE/src/com/codename1/impl/javase/Executor.java
Comment thread maven/codenameone-gradle-plugin/src/main/java/com/codename1/gradle/Cn1libs.java Outdated
- Native uploads carry src/<platform>/resources beside the native sources, as
  a Maven platform module packages src/main/resources (parity test covers it).
- cn1Test scans every test output directory, so Kotlin tests are found; the
  runner gains a multi-directory prepare().
- Kotlin + Java projects: jars keep one copy of the ORM enhancer's
  per-directory bookkeeping file instead of failing on the duplicate.
- Hot reload's direct recompile uses the project's Java level (17 for Gradle,
  the settings file's for Maven and Ant) instead of a fixed 1.8.
- compileJava/compileKotlin declare skipComplianceCheck and the codename1.*
  overrides as inputs, so a native build after a hot-reload compile reruns
  the compliance check.
- Conversion keeps com.codenameone cn1libs and add-ons, dropping only the
  artifacts the plugin supplies, and carries an Ant project's own lib/ jars.
- Versionless com.codenameone cn1libs get the framework version in the
  platform-artifact walk too; a Gradle cn1lib's JavaSE code compiles against
  the JavaSE jars of the cn1libs it uses.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

shai-almog commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 166 screenshots: 166 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 280 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 54ms / native 2ms = 27.0x speedup
SIMD float-mul (64K x300) java 55ms / native 3ms = 18.3x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 45.000 ms
Base64 CN1 decode 54.000 ms
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 7.000 ms
Image createMask ratio (SIMD on/off) 1.000x (0.0% slower)
Image applyMask (SIMD off) 61.000 ms
Image applyMask (SIMD on) 41.000 ms
Image applyMask ratio (SIMD on/off) 0.672x (32.8% faster)
Image modifyAlpha (SIMD off) 45.000 ms
Image modifyAlpha (SIMD on) 35.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.778x (22.2% faster)
Image modifyAlpha removeColor (SIMD off) 51.000 ms
Image modifyAlpha removeColor (SIMD on) 31.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.608x (39.2% faster)

ParparVM vs HotSpot (JDK 25): macOS arm64

Runner CPU: Apple M1 (Virtual) (baseline macos-arm64)

Ratios are ParparVM / JDK 25: below 1.00x ParparVM is faster (time) or smaller (RAM). Median of 5 interleaved, paired rounds; every run's output was verified. A regression is a ratio more than 15% (time) / 15% (RAM) above its baseline in vm/selfhost/perf-baseline.json (more, for a row whose calibration runs were noisier; the file records it), and for RAM also more than 0.05x above it in absolute terms. Both run unpinned on all of the runner's CPUs, with their own default thread counts.

Benchmark Cores Time RAM Status
hello (HelloCodenameOne) 3 0.82x (base 0.96x, -14.7%) 1.20x (base 1.34x, -10.5%) ok
translator (self) 3 0.58x (base 0.54x, +8.4%) 0.79x (base 0.74x, +7.2%) ok
intArithmetic 3 1.06x (base 1.03x, +2.7%) 0.12x (base 0.12x, -0.2%) ok
longArithmetic 3 1.11x (base 1.03x, +8.3%) 0.11x (base 0.11x, +1.6%) ok
mathTranscendental 3 0.94x (base 1.01x, -6.9%) 0.12x (base 0.12x, +0.2%) ok
arraySequential 3 0.45x (base 0.42x, +6.1%) 0.53x (base 0.53x, -0.3%) ok
arrayRandom 3 0.98x (base 0.99x, -0.9%) 0.32x (base 0.32x, -0.1%) ok
objectAllocation 3 3.91x (base 3.70x, +5.9%) 0.55x (base 0.48x, +14.8%) ok
valueEscape 3 0.51x (base 0.51x, -0.3%) 0.09x (base 0.09x, +3.3%) ok
hashMapChurn 3 0.95x (base 1.18x, -18.9%) 0.08x (base 0.07x, +15.3%) ok
stringBuilding 3 0.68x (base 0.84x, -18.9%) 0.41x (base 0.54x, -23.9%) better than baseline
recursion 3 1.33x (base 1.24x, +7.7%) 0.12x (base 0.12x, -1.7%) ok
quicksort 3 0.95x (base 1.01x, -6.3%) 0.11x (base 0.11x, -0.8%) ok

Result: no regression

@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fbe34d5f9b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
- Native-interface generation and verification scan every main classes
  directory, so Kotlin interfaces are checked and a pure Kotlin project no
  longer fails input validation.
- Kotlin cn1libs get the compliance check.
- Java and Kotlin keep separate class directories (a shared one lost the
  Kotlin classes on a Java full recompile); a generated file present in both
  now fails the build by name instead of shipping one language's registry.
- Conversion interpolates ${...} versions from the pom and its parents and
  comments out, with a warning, any it cannot resolve; a Kotlin backend gets
  the Kotlin plugin in its own script, and counts as touched.
- transcodeSvg tracks src/main/lottie; cn1Css honours codename1.cssTheme from
  Gradle properties and overrides.
- The initializr offers Gradle only once the plugin is published at the
  version it generates against; update-cn1-version.sh sets the flag from the
  repository.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 146c72e503

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
- Backends process Kotlin controllers and entities, and runBackend finds the
  generated entry point in either classes directory.
- Annotation processing gets the source set's real directories, and reruns
  when the settings file changes (it picks the entry point).
- transcodeSvg starts from empty outputs, so a deleted asset's class and
  registry entry go away.
- Cached native outputs are rebuilt when a file on the upload classpath
  changes, such as a jar replaced in place.
- codenameone { mainClass } now reaches every task, as the settings file's
  packageName and mainName overrides.
- Conversion resolves versions left to dependencyManagement, keeps
  classifiers and artifact types, comments out what it cannot resolve, and a
  Kotlin backend under a Kotlin app names no second plugin version.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

shai-almog commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 155 screenshots: 155 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 1638 seconds

Build and Run Timing

Metric Duration
Simulator Boot 0 ms
Simulator Boot (Run) 1000 ms
App Install 14000 ms
App Launch 1000 ms
Test Execution 372000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 447ms / native 4ms = 111.7x speedup
SIMD float-mul (64K x300) java 140ms / native 17ms = 8.2x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 57.000 ms
Base64 CN1 decode 159.000 ms
Base64 native encode 684.000 ms
Base64 encode ratio (CN1/native) 0.083x (91.7% faster)
Base64 native decode 501.000 ms
Base64 decode ratio (CN1/native) 0.317x (68.3% faster)
Base64 SIMD encode 85.000 ms
Base64 encode ratio (SIMD/CN1) 1.491x (49.1% slower)
Base64 SIMD decode 51.000 ms
Base64 decode ratio (SIMD/CN1) 0.321x (67.9% faster)
Base64 encode ratio (SIMD/native) 0.124x (87.6% faster)
Base64 decode ratio (SIMD/native) 0.102x (89.8% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 6.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.333x (66.7% faster)
Image applyMask (SIMD off) 53.000 ms
Image applyMask (SIMD on) 70.000 ms
Image applyMask ratio (SIMD on/off) 1.321x (32.1% slower)
Image modifyAlpha (SIMD off) 109.000 ms
Image modifyAlpha (SIMD on) 45.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.413x (58.7% faster)
Image modifyAlpha removeColor (SIMD off) 44.000 ms
Image modifyAlpha removeColor (SIMD on) 58.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.318x (31.8% slower)

@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6b09f581af

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread Ports/JavaSE/src/com/codename1/impl/javase/SourceChangeWatcher.java
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
@shai-almog

shai-almog commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator Author

Compared 154 screenshots: 154 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 468 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 80ms / native 7ms = 11.4x speedup
SIMD float-mul (64K x300) java 51ms / native 3ms = 17.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 54.000 ms
Base64 CN1 decode 55.000 ms
Base64 native encode 652.000 ms
Base64 encode ratio (CN1/native) 0.083x (91.7% faster)
Base64 native decode 307.000 ms
Base64 decode ratio (CN1/native) 0.179x (82.1% faster)
Base64 SIMD encode 52.000 ms
Base64 encode ratio (SIMD/CN1) 0.963x (3.7% faster)
Base64 SIMD decode 46.000 ms
Base64 decode ratio (SIMD/CN1) 0.836x (16.4% faster)
Base64 encode ratio (SIMD/native) 0.080x (92.0% faster)
Base64 decode ratio (SIMD/native) 0.150x (85.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 8.000 ms
Image createMask (SIMD on) 6.000 ms
Image createMask ratio (SIMD on/off) 0.750x (25.0% faster)
Image applyMask (SIMD off) 54.000 ms
Image applyMask (SIMD on) 43.000 ms
Image applyMask ratio (SIMD on/off) 0.796x (20.4% faster)
Image modifyAlpha (SIMD off) 39.000 ms
Image modifyAlpha (SIMD on) 75.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.923x (92.3% slower)
Image modifyAlpha removeColor (SIMD off) 50.000 ms
Image modifyAlpha removeColor (SIMD on) 55.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.100x (10.0% slower)

…eload

- Conversion reads dependencies as Maven resolves them: inherited from parent
  poms, with exclusions, system-scoped jars carried into libs/, the pom's
  repositories declared, and only the Kotlin artifacts the Kotlin plugin
  supplies left out (kotlin-reflect and org.jetbrains:annotations stay).
- A backend counts as the untouched skeleton only when its code and settings
  match the generated template, so customised generated routes are kept.
- cn1Css and generateGuiSources start from empty outputs, so a deleted theme
  or CodeRAD view no longer lingers.
- Hot reload compiles against, and writes Kotlin classes to, Gradle's Kotlin
  classes directory.
- backendPackage compiles the source set's configured directories.
- addBackend in a build that applies the plugin from the root build script
  writes a backend script that applies it too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…; hot reload outside the project

Codename One builds Java 17 bytecode only -- Android runs nothing newer, and
the compliance check transpiles newer class files down to 17 on purpose.
Two earlier review fixes assumed a build may target a higher release; they
are withdrawn:
- the Kotlin JVM target is pinned to 17 again, not to compileJava's release;
- hot reload recompiles at 17; the cn1.hotReload.release property is gone.
The release check, the guide and the skill no longer say "17 or newer", and
conversion keeps forcing 17, with the reason in a comment.

Also:
- cn1lib(project(":maps")) packages that library's platform jars: a Gradle
  cn1lib exposes each one in a consumable configuration, and the build
  tasks no longer capture the Project in lambdas, which the configuration
  cache had to store once a dependency is a project of the build.
- A cn1lib platform profile's dependency takes its version from
  <dependencyManagement> when the pom leaves it out.
- Hot reload treats a source root the launch names as the running
  project's, even outside the project directory.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b99fa20e7f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Ports/JavaSE/src/com/codename1/impl/javase/Simulator.java
…rectory

- A Gradle cn1lib exposes its cn1css zip to applications of the same build,
  and an application declaring cn1lib(project(":maps")) compiles it into its
  theme, as it does a published library's.
- Gradle's run and debug pass the build directory (cn1.buildDir), and the
  simulator's project layout honours it, so simulator.properties, the
  classes and the processed resources are found under a relocated build
  directory.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2ae983c4b9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
…epositories warn

- A cn1lib's -javase pom carries each javaseImplementation dependency's
  exclusions (a non-transitive one as *:*), so consumers drop what the
  library dropped.
- Conversion reads <scope> and <type> through the pom's properties, as
  Maven's effective model does.
- When the settings script declares the repositories (or a strict mode),
  the plugin still adds none -- under the default mode a project repository
  would make Gradle drop the settings' ones, a mirror with them -- but warns,
  naming the line to add, when none is the Codename One repository.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 555d4f6aec

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/AppBuilder.java Outdated
… in conversion

- The app-extension signing preflight looks where packaging takes the
  extensions from (layout().iosAppExtensionsDir()), so a Gradle build's
  src/ios/app_extensions is checked before the build is sent.
- Conversion resolves properties defined by profiles a plain Maven build
  activates.
- backendPackage keeps the compile classpath, as Maven's backend-package
  does; a comment says why a runtimeOnly library has no place in a
  ParparVM-translated binary.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: aa778898b4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleProjectTemplate.java Outdated
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

… stays literal

- Gradle's run passes the project's path (cn1.gradleProjectPath), and the
  simulator's layout uses it for the build-tool fallback's cn1Compile, so
  a project whose path is decoupled from its directory recompiles.
- The project name is escaped for the Kotlin string in settings.gradle.kts:
  a main class may hold a $, which Kotlin would read as a template.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: aa778898b4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
- Conversion resolves source and resource roots through the pom's
  properties, and never deletes a conventional root because of one it
  cannot resolve (that cost the project its sources).
- A scope given by <dependencyManagement> applies to a dependency that
  declares none, as in Maven's effective model.
- A Gradle cn1lib that uses cn1lib(project(":maps")) publishes a dependency
  on maps-lib (type pom), which is what Maven consumers resolve, rather
  than the project's name or its -common publication.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f1b690b817

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/build-engine/src/main/java/com/codename1/maven/GradleConversion.java Outdated
shai-almog and others added 2 commits October 1, 2026 17:46
…sion

- The staged Ant project gets the icon codename1.icon names at its relative
  path, which build.xml hands every target; only icon.png was staged, so a
  custom icon never reached the cloud build (Maven's builds too).
- Conversion reads <sourceDirectory>, <testSourceDirectory>, <resources>
  and build-helper sources through the local parent poms, as Maven's
  effective model does.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…plates

Master's Spring-style backend beans (#5908) land in build-engine, where the
annotation processors moved: the dev-tools switch goes through BackendPackager
for both plugins (-Pcn1.backend.devTools for Gradle), the bean tests run there
with their SQLite driver, and the Gradle backend templates gain the Greeter
service the archetype now injects into Api. Conversion's untouched-skeleton
check expects that pair, and the Gradle backend checks call /greet so the
wiring is exercised, not just /healthz. The skill's new backend references
give the Gradle tasks beside the Maven goals.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bffdc7502f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread maven/codenameone-gradle-plugin/src/main/java/com/codename1/gradle/Cn1libs.java Outdated
…in Settings

A published cn1lib's common jar no longer carries Gradle module metadata. Gradle
prefers the .module, and java-library's named a project cn1lib by its plain
-common jar, so a Gradle application got the inner library's classes and none
of its platform jars. Without it Gradle reads the same pom Maven reads, and
the build host now leaves a <type>pom</type> dependency's .pom file off the
classpath, as Maven does, instead of opening it as a jar -- which also covers
Maven-built cn1libs that depend on another cn1lib.

A cn1lib platform dependency reached on two paths keeps both edges when their
exclusions differ, so one path's exclusion no longer drops what the other
keeps. codename1.kind applies to the root project only: a -P or gradle.properties
value reaches every subproject and turned the included backend into an app.
Settings writes Maven's LATEST/RELEASE as Gradle's latest.release. Conversion
says when it leaves an untouched backend skeleton behind.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@shai-almog

Copy link
Copy Markdown
Collaborator Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4ec9f72410

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +203 to +206
for (Element dep : children(dependencies, "dependency")) {
String scope = interpolate(text(child(dep, "scope")), props);
if ("test".equals(scope) || "provided".equals(scope) || "system".equals(scope)) {
continue;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Skip optional dependencies in cn1lib platform profiles

When a Maven-published cn1lib marks a dependency inside a codename1.platform profile as <optional>true</optional>, Maven does not propagate that dependency to applications consuming the cn1lib, but this parser filters only by scope and adds the optional coordinate to the Gradle platform configuration. A Gradle application therefore packages platform code and transitives that the library deliberately kept optional, potentially introducing conflicting native implementations; exclude optional profile dependencies when constructing the consumer configurations.

Useful? React with 👍 / 👎.

Comment on lines +128 to +130
Set<org.gradle.api.artifacts.result.ResolvedComponentResult> components;
try {
components = graph.getIncoming().getResolutionResult().getAllComponents();

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Traverse cn1libs introduced by platform profiles

When cn1lib A declares cn1lib B only inside a codename1.platform profile, B is absent from this one-time runtimeClasspath component set because Gradle does not activate A's profile. Reading A later adds B's -lib POM to the platform configuration, which brings in B's common classes, but B's own platform profiles are never inspected, so the native build omits B's Android/iOS implementation; expand or iterate over the platform graphs until newly introduced cn1libs have contributed their profiles too.

Useful? React with 👍 / 👎.

Comment on lines +496 to +497
upload.from(platformProvider.map(p -> platformFiles.containsKey(p)
? platformFiles.get(p) : Collections.emptyList()));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Resolve platform dependencies with the runtime graph

When the application/runtime graph selects g:a:2 but a cn1lib's active platform profile requests g:a:1, these independently resolved platform files are appended to the runtime classpath rather than participating in the same conflict resolution. The upload therefore contains both versions, and jar merging can overwrite duplicate classes according to iteration order, whereas Maven's profile-enabled graph selects one version; constrain or resolve the platform edges together with the runtime graph before assembling the upload.

Useful? React with 👍 / 👎.

Comment on lines +295 to +297
File dir = from.nativeSourceDir(p);
if (hasFiles(dir)) {
copyTreeExcept(dir, to.nativeSourceDir(p), extras);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Move converted JavaSE resources to the resource source set

When an Ant project's native/javase directory contains non-Java resources used by its simulator implementation, the Ant build copies those files into native/internal_tmp, but conversion copies them into src/javase/java alongside the sources. The Gradle JavaSE source set reads resources only from src/javase/resources, so these files are omitted from its output and resource lookups fail after conversion; separate non-source files into the JavaSE resource directory.

Useful? React with 👍 / 👎.

@shai-almog
shai-almog merged commit 60c4f31 into master Oct 1, 2026
53 of 59 checks passed
@shai-almog
shai-almog deleted the gradle-bootstrap branch October 1, 2026 16:55
shai-almog added a commit that referenced this pull request Oct 1, 2026
…ilation

Master moved the builders into maven/build-engine (#5922); this branch's
builder changes and its builder tests (NativeThemes, desktop window size,
iOS icons, macOS strip settings) follow them there.

Conflicts:
- GenerateAppProjectMojo: master's header.
- copyright-header-exclusions.txt: both sides' entries.
- SKILL.md description: master's Maven-or-Gradle wording plus the Flutter
  triggers.

flutter-bench.yml also watches maven/build-engine/**, as master's other
plugin-watching workflows now do.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
shai-almog added a commit that referenced this pull request Oct 2, 2026
…and-cleanup

#5922 moved the plugin's processors and the backend packager into
maven/build-engine. Resolved by moving this branch's work onto that layout:

- The backend test pass (BackendTestGenerator, BackendTests) lives in the build
  engine, on its Log/BuildExecutionException types.
- The compiled test run is BackendTestPackager, a BackendPackager subclass in
  the engine, over extension hooks added to BackendPackager. BackendTestMojo is a
  thin Maven front for it, as BackendPackageMojo is for BackendPackager; the
  AbstractBackendNativeMojo this branch had is gone.
- Gradle backends get the same support: codenameone-backend-test and JUnit 5 on
  the test classpath, a JVM per test class, the test pass after compileTestJava,
  and a backendTest task for the compiled run. The Gradle backend template and
  the initializr's Gradle downloads carry the sample tests, and gradle-smoke runs
  them.
- The Gradle Greeter template uses @component, not the removed @service.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant