diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f1cd5d4..b851575 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,7 +12,7 @@ concurrency: jobs: gradle_check: - name: Gradle check + name: Gradle check (JVM, Linux, JS) runs-on: ubuntu-latest steps: - name: Checkout @@ -27,3 +27,20 @@ jobs: - name: Run checks run: ./gradlew -Dorg.gradle.jvmargs=-Xmx4096m check + + macos_check: + name: Gradle check (iOS) + runs-on: macos-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: 21 + cache: 'gradle' + + - name: Run checks + run: ./gradlew -Dorg.gradle.jvmargs=-Xmx4096m check diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 01783c9..36e04b9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,7 +8,7 @@ on: jobs: maven_publish: name: Release build and publish - runs-on: ubuntu-latest + runs-on: macos-latest steps: - name: Checkout uses: actions/checkout@v6 @@ -35,6 +35,15 @@ jobs: ORG_GRADLE_PROJECT_signingInMemoryKeyPassword: ${{ secrets.SIGNING_PASSWORD }} ORG_GRADLE_PROJECT_signingInMemoryKey: ${{ secrets.GPG_KEY_CONTENTS }} + - name: Build iOS XCFramework + run: ./gradlew -Dorg.gradle.jvmargs=-Xmx4096m -Pversion=${{ env.VERSION }} --no-configuration-cache :jecnaapi-ios:podPublishReleaseXCFramework + + - name: Upload iOS XCFramework + uses: actions/upload-artifact@v4 + with: + name: JecnaapiIOS-xcframework + path: jecnaapi-ios/build/cocoapods/xcframework/release/JecnaapiIOS.xcframework + gh_release: name: Create GitHub Release needs: maven_publish @@ -44,6 +53,16 @@ jobs: steps: - name: Checkout uses: actions/checkout@v6 + + - name: Download iOS XCFramework + uses: actions/download-artifact@v4 + with: + name: JecnaapiIOS-xcframework + path: JecnaapiIOS.xcframework + + - name: Create XCFramework zip + run: zip -r JecnaapiIOS-${{ github.ref_name }}-xcframework.zip JecnaapiIOS.xcframework/ + - name: Create Release uses: softprops/action-gh-release@v2 with: @@ -51,6 +70,7 @@ jobs: name: ${{ github.ref_name }} tag_name: ${{ github.ref_name }} generate_release_notes: true + files: JecnaapiIOS-${{ github.ref_name }}-xcframework.zip update_readme: name: Update project version in README diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5026729..dfe19f4 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -21,6 +21,7 @@ ktor-client-encoding = { module = "io.ktor:ktor-client-encoding", version.ref = ktor-client-engine-java = { module = "io.ktor:ktor-client-java", version.ref = "ktor" } ktor-client-engine-curl = { module = "io.ktor:ktor-client-curl", version.ref = "ktor" } ktor-client-engine-js = { module = "io.ktor:ktor-client-js", version.ref = "ktor" } +ktor-client-engine-darwin = { module = "io.ktor:ktor-client-darwin", version.ref = "ktor" } ktor-client-engine-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" } [plugins] diff --git a/jecnaapi-canteen/build.gradle.kts b/jecnaapi-canteen/build.gradle.kts index 432e028..4bd6aef 100644 --- a/jecnaapi-canteen/build.gradle.kts +++ b/jecnaapi-canteen/build.gradle.kts @@ -11,6 +11,9 @@ plugins { kotlin { jvm() linuxX64() + iosX64() + iosArm64() + iosSimulatorArm64() js { browser { testTask { enabled = false } @@ -21,6 +24,7 @@ kotlin { testTask { enabled = false } } } + applyDefaultHierarchyTemplate() androidLibrary { namespace = "io.github.tomhula.jecnaapi.canteen" compileSdk = 36 @@ -35,9 +39,14 @@ kotlin { jvmMain.dependencies { runtimeOnly(libs.ktor.client.engine.java) } - nativeMain.dependencies { + val linuxX64Main by getting + linuxX64Main.dependencies { runtimeOnly(libs.ktor.client.engine.curl) } + val iosMain by getting + iosMain.dependencies { + runtimeOnly(libs.ktor.client.engine.darwin) + } jsMain.dependencies { runtimeOnly(libs.ktor.client.engine.js) } diff --git a/jecnaapi-core/build.gradle.kts b/jecnaapi-core/build.gradle.kts index c8bbb7f..fbbe3fb 100644 --- a/jecnaapi-core/build.gradle.kts +++ b/jecnaapi-core/build.gradle.kts @@ -1,6 +1,5 @@ @file:OptIn(ExperimentalWasmDsl::class) -import org.gradle.internal.execution.caching.CachingState.enabled import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl plugins { @@ -13,6 +12,9 @@ plugins { kotlin { jvm() linuxX64() + iosX64() + iosArm64() + iosSimulatorArm64() js { browser { testTask { enabled = false } @@ -23,6 +25,7 @@ kotlin { testTask { enabled = false } } } + applyDefaultHierarchyTemplate() androidLibrary { namespace = "io.github.tomhula.jecnaapi.core" compileSdk = 36 @@ -38,9 +41,14 @@ kotlin { jvmMain.dependencies { runtimeOnly(libs.ktor.client.engine.java) } - nativeMain.dependencies { + val linuxX64Main by getting + linuxX64Main.dependencies { runtimeOnly(libs.ktor.client.engine.curl) } + val iosMain by getting + iosMain.dependencies { + runtimeOnly(libs.ktor.client.engine.darwin) + } jsMain.dependencies { runtimeOnly(libs.ktor.client.engine.js) } diff --git a/jecnaapi-ios/build.gradle.kts b/jecnaapi-ios/build.gradle.kts new file mode 100644 index 0000000..7fcba18 --- /dev/null +++ b/jecnaapi-ios/build.gradle.kts @@ -0,0 +1,33 @@ +plugins { + kotlin("multiplatform") + kotlin("native.cocoapods") +} + +kotlin { + iosX64() + iosArm64() + iosSimulatorArm64() + + sourceSets { + commonMain.dependencies { + api(project(":jecnaapi-jecna")) + api(project(":jecnaapi-canteen")) + } + } + + cocoapods { + name = "JecnaapiIOS" + version = project.version.toString() + summary = "JecnaAPI umbrella framework for iOS" + homepage = "https://github.com/tomhula/JecnaAPI" + license = "GNU GPLv3" + ios.deploymentTarget = "15.0" + framework { + baseName = "JecnaapiIOS" + isStatic = true + export(project(":jecnaapi-jecna")) + export(project(":jecnaapi-canteen")) + transitiveExport = true + } + } +} diff --git a/jecnaapi-jecna/build.gradle.kts b/jecnaapi-jecna/build.gradle.kts index f870ab6..3f44380 100644 --- a/jecnaapi-jecna/build.gradle.kts +++ b/jecnaapi-jecna/build.gradle.kts @@ -1,6 +1,5 @@ @file:OptIn(ExperimentalWasmDsl::class) -import org.gradle.internal.execution.caching.CachingState.enabled import org.jetbrains.kotlin.gradle.ExperimentalWasmDsl plugins { @@ -13,6 +12,9 @@ plugins { kotlin { jvm() linuxX64() + iosX64() + iosArm64() + iosSimulatorArm64() js { browser { testTask { enabled = false } @@ -23,6 +25,7 @@ kotlin { testTask { enabled = false } } } + applyDefaultHierarchyTemplate() androidLibrary { namespace = "io.github.tomhula.jecnaapi.jecna" compileSdk = 36 @@ -40,9 +43,14 @@ kotlin { jvmMain.dependencies { runtimeOnly(libs.ktor.client.engine.java) } - nativeMain.dependencies { + val linuxX64Main by getting + linuxX64Main.dependencies { runtimeOnly(libs.ktor.client.engine.curl) } + val iosMain by getting + iosMain.dependencies { + runtimeOnly(libs.ktor.client.engine.darwin) + } jsMain.dependencies { runtimeOnly(libs.ktor.client.engine.js) } diff --git a/settings.gradle.kts b/settings.gradle.kts index 947d216..18606c3 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ rootProject.name = "jecnaapi" -include("jecnaapi-core", "jecnaapi-jecna", "jecnaapi-canteen", "jecnaapi-jecna-java") +include("jecnaapi-core", "jecnaapi-jecna", "jecnaapi-canteen", "jecnaapi-jecna-java", "jecnaapi-ios") pluginManagement { repositories {