Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CI(docs/チェックリスト.md §7)。基本は ubuntu(ルート build / integration-test のモジュールビルド /
# TestKit の分割実行 / Maven ビルド)で、OS 分岐は必要な範囲のみ: macos = Apple ターゲットのネイティブツールチェーン確認
# (ルート build のみ)・windows = mingwX64 の実行テストのみ(native の box 実行はホスト依存ゲートで
# (ルート build と公開可能ターゲットの検査)・windows = mingwX64 の実行テストのみ(native の box 実行はホスト依存ゲートで
# Windows でしか走らない)。main への push では加えて依存グラフを登録する。
# アクションはコミットハッシュで固定する(末尾コメントの vX.Y.Z は参照用。更新は Dependabot が追随する)。
name: build
Expand Down Expand Up @@ -199,6 +199,9 @@ jobs:
path: ~/.konan
key: konan-${{ runner.os }}-${{ hashFiles('gradle/libs.versions.toml') }}
- run: ./gradlew build
# CD と同じランナーで、宣言ターゲットが全て公開できることを確かめる(賄えないターゲットの
# publication は静かに落ちるため、公開時ではなく PR の時点で検出する)
- run: ./gradlew :sealed-class-enumizer-runtime-api:checkPublishableTargets

native-windows:
needs: changes
Expand Down
6 changes: 6 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,12 @@ jobs:
exit 1
fi

# ランナーが宣言ターゲットを全て賄えることを先に確かめる。賄えないターゲットの publication は
# kotlin.native.ignoreDisabledTargets により静かに落ち、成果物が欠けたまま公開が成功してしまう。
# 実行時の担保は publish タスクの依存としても掛かっており、ここは長いゲートの前で落とすための前倒し
- name: Verify all declared targets are publishable
run: ./gradlew :sealed-class-enumizer-runtime-api:checkPublishableTargets

# 公開前のゲート。CI と同じ範囲を 1 ジョブで通す
- run: ./gradlew build
- run: >-
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ Label uniqueness within a hierarchy is enforced at compile time.
| Version format | `<KotlinVersion>-<pluginVersion>`, e.g. `2.4.10-0.1.0` |
| Build environment | Gradle 9+ or Maven 3.9+ / JDK 17+ |
| runtime-api (JVM) | Java 8+ bytecode |
| runtime-api targets | `jvm`, `js`, `wasmJs`, `wasmWasi`, `linuxX64`, `mingwX64`, `macosX64`, `macosArm64`, `iosArm64`, `iosSimulatorArm64`, `iosX64` |
| runtime-api targets | `jvm`, `js`, `wasmJs`, `wasmWasi`, `linuxX64`, `linuxArm64`, `mingwX64`, `macosX64`, `macosArm64`, `iosArm64`, `iosSimulatorArm64`, `iosX64`, `androidNativeArm32`, `androidNativeArm64`, `androidNativeX64`, `androidNativeX86` |

## Known limitations

Expand Down
5 changes: 3 additions & 2 deletions docs/実装ノート.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@

## 1. モジュール構成

- `runtime-api`(MPP: jvm / js / wasmJs / wasmWasi / linuxX64 / mingwX64 / macosX64 /
macosArm64 / iosArm64 / iosSimulatorArm64 / iosX64)・`compiler-plugin`・`gradle-plugin`(plugin id
- `runtime-api`(MPP: jvm / js / wasmJs / wasmWasi / linuxX64 / linuxArm64 / mingwX64 / macosX64 /
macosArm64 / iosArm64 / iosSimulatorArm64 / iosX64 / androidNativeArm32 / androidNativeArm64 /
androidNativeX64 / androidNativeX86)・`compiler-plugin`・`gradle-plugin`(plugin id
`io.github.projectmapk.sealed-class-enumizer`)・`maven-plugin`(kotlin-maven-plugin の拡張。
利用側が `<compilerPlugins>` へ書く名前は `sealed-class-enumizer`)。
パッケージルートは `io.github.projectmapk.sealedClassEnumizer`(group=io.github.projectmapk に統一)。
Expand Down
28 changes: 28 additions & 0 deletions runtime-api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import com.vanniktech.maven.publish.JavadocJar
import com.vanniktech.maven.publish.KotlinMultiplatform
import org.gradle.api.publish.maven.tasks.PublishToMavenRepository
import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl
import org.jetbrains.kotlin.gradle.dsl.JvmTarget

Expand All @@ -26,6 +27,7 @@ kotlin {

@OptIn(ExperimentalWasmDsl::class) wasmWasi { nodejs() }
linuxX64()
linuxArm64()
// macosX64 は Intel Mac 廃止に伴い KGP 2.4 で非推奨化されたが、代替ターゲットは無く
// (macosArm64 は別アーキテクチャ)、Intel Mac 向け klib の公開を維持するため宣言を残す。
// KGP から関数が削除された時点で改めて対応する
Expand All @@ -37,6 +39,12 @@ kotlin {
iosArm64()
iosSimulatorArm64()
iosX64()
// Android NDK 向けの native ターゲット。Android/JVM(androidTarget)とは別物であり、
// そちらは jvm variant が受ける(KGP の platform.type 互換規則)
androidNativeArm32()
androidNativeArm64()
androidNativeX64()
androidNativeX86()
mingwX64()
}

Expand All @@ -47,3 +55,23 @@ mavenPublishing {
signAllPublications()
configure(KotlinMultiplatform(javadocJar = JavadocJar.Empty()))
}

// 公開の取りこぼしの検知。ホストが対応しないターゲットは kotlin.native.ignoreDisabledTargets により
// publication ごと静かに落ち、成果物が欠けたまま公開が成功してしまうため、リモートへの公開時に
// 宣言ターゲットが全て publishable であることを確かめる。
// ローカル公開は対象にしない(ホスト差の吸収は integration-test のフィクスチャ経路の前提であり、
// 検査するのは配布物を作る経路に限る)
val checkPublishableTargets =
tasks.register("checkPublishableTargets") {
val unpublishable = kotlin.targets.filterNot { it.publishable }.map { it.name }.sorted()
doLast {
if (unpublishable.isNotEmpty()) {
throw GradleException(
"このホストでは公開できないターゲットがあります: ${unpublishable.joinToString()}。" +
"宣言した全ターゲットを賄えるホストで公開してください"
)
}
}
}

tasks.withType<PublishToMavenRepository>().configureEach { dependsOn(checkPublishableTargets) }