From af4d5605cab6a731c61b0a9d4541dd501765ae5a Mon Sep 17 00:00:00 2001 From: Artem Daugel-Dauge Date: Mon, 4 Dec 2023 11:17:21 +0100 Subject: [PATCH] [Gradle] Copy framework to BUILT_PRODUCTS_DIR in the embedAndSign task ^KT-63821 Verification Pending --- .../kotlin/gradle/native/AppleFrameworkIT.kt | 162 +++++++++--------- .../gradle/plugin/PropertiesProvider.kt | 4 + .../plugin/mpp/apple/AppleXcodeTasks.kt | 59 ++++--- 3 files changed, 115 insertions(+), 110 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt index 7aec2dd27ed..ab6185fa784 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/AppleFrameworkIT.kt @@ -32,34 +32,39 @@ class AppleFrameworkIT : KGPBaseTest() { nativeProject( "sharedAppleFramework", gradleVersion, - buildOptions = defaultBuildOptions ) { - - val environmentVariables = mapOf( + val environmentVariables = EnvironmentalVariables( "CONFIGURATION" to "debug", "SDK_NAME" to "iphoneos123", "ARCHS" to "arm64", "TARGET_BUILD_DIR" to "no use", "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), + "BUILT_PRODUCTS_DIR" to projectPath.resolve("shared/build/builtProductsDir").toString(), ) - build( - "assembleDebugAppleFrameworkForXcodeIosArm64", - environmentVariables = EnvironmentalVariables(environmentVariables) - ) { + build("assembleDebugAppleFrameworkForXcodeIosArm64", environmentVariables = environmentVariables) { assertTasksExecuted(":shared:assembleDebugAppleFrameworkForXcodeIosArm64") - assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework") - assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework.dSYM") + assertDirectoryInProjectExists("shared/build/builtProductsDir/sdk.framework") + assertDirectoryInProjectExists("shared/build/builtProductsDir/sdk.framework.dSYM") + assertDirectoryInProjectDoesNotExist("shared/build/xcode-frameworks/sdk.framework") } - build( - "assembleCustomDebugAppleFrameworkForXcodeIosArm64", - environmentVariables = EnvironmentalVariables(environmentVariables) - ) { + build("clean") + + build("assembleDebugAppleFrameworkForXcodeIosArm64", "-Pkotlin.apple.copyFrameworkToBuiltProductsDir=false", environmentVariables = environmentVariables) { + assertTasksExecuted(":shared:assembleDebugAppleFrameworkForXcodeIosArm64") + + assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework") + assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework.dSYM") + + assertDirectoryInProjectDoesNotExist("shared/build/builtProductsDir/sdk.framework") + + } + + build("assembleCustomDebugAppleFrameworkForXcodeIosArm64", environmentVariables = environmentVariables) { assertTasksExecuted(":shared:assembleCustomDebugAppleFrameworkForXcodeIosArm64") - assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/lib.framework") - assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/lib.framework.dSYM") + assertDirectoryInProjectExists("shared/build/builtProductsDir/lib.framework") + assertDirectoryInProjectExists("shared/build/builtProductsDir/lib.framework.dSYM") } } } @@ -76,15 +81,15 @@ class AppleFrameworkIT : KGPBaseTest() { gradleVersion, buildOptions = defaultBuildOptions ) { - val environmentVariables = mapOf( + val environmentVariables = EnvironmentalVariables( "CONFIGURATION" to "Release", "SDK_NAME" to "iphonesimulator", "ARCHS" to "arm64 x86_64", "TARGET_BUILD_DIR" to "no use", "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), + "BUILT_PRODUCTS_DIR" to projectPath.resolve("shared/build/xcode-frameworks/Release/iphonesimulator").toString(), ) - build("assembleReleaseAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) { + build("assembleReleaseAppleFrameworkForXcode", environmentVariables = environmentVariables) { assertTasksExecuted(":shared:linkReleaseFrameworkIosSimulatorArm64") assertTasksExecuted(":shared:linkReleaseFrameworkIosX64") assertTasksExecuted(":shared:assembleReleaseAppleFrameworkForXcode") @@ -106,16 +111,16 @@ class AppleFrameworkIT : KGPBaseTest() { "sharedAppleFramework", gradleVersion, ) { - val environmentVariables = mapOf( + val environmentVariables = EnvironmentalVariables( "CONFIGURATION" to "debug", "SDK_NAME" to "macosx", "ARCHS" to "x86_64", "EXPANDED_CODE_SIGN_IDENTITY" to "-", "TARGET_BUILD_DIR" to testBuildDir.toString(), "FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), + "BUILT_PRODUCTS_DIR" to projectPath.resolve("shared/build/xcode-frameworks/debug/macosx").toString(), ) - build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) { + build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = environmentVariables) { assertTasksExecuted(":shared:assembleDebugAppleFrameworkForXcodeMacosX64") assertSymlinkInProjectExists("shared/build/xcode-frameworks/debug/macosx/sdk.framework/Headers") assertSymlinkExists(testBuildDir.resolve("build/xcode-derived/sdk.framework/Headers")) @@ -134,7 +139,7 @@ class AppleFrameworkIT : KGPBaseTest() { "sharedAppleFramework", gradleVersion, ) { - val environmentVariables = mapOf( + val environmentVariables = EnvironmentalVariables( "CONFIGURATION" to "debug", "SDK_NAME" to "iphoneos", "ARCHS" to "arm64", @@ -142,7 +147,7 @@ class AppleFrameworkIT : KGPBaseTest() { "FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived", "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) - build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) { + build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = environmentVariables) { assertDirectoryInProjectExists("build/xcode-derived/sdk.framework") } } @@ -159,7 +164,7 @@ class AppleFrameworkIT : KGPBaseTest() { "sharedAppleFramework", gradleVersion, ) { - val environmentVariables = mapOf( + val environmentVariables = EnvironmentalVariables( "CONFIGURATION" to "debug", "SDK_NAME" to "iphoneos", "ARCHS" to "arm64", @@ -168,7 +173,7 @@ class AppleFrameworkIT : KGPBaseTest() { "FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived", "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) - build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) { + build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = environmentVariables) { assertDirectoryInProjectExists("build/xcode-derived/sdk.framework") assertDirectoryInProjectDoesNotExist("build/xcode-derived/sdk.framework.DSYM") } @@ -198,7 +203,7 @@ class AppleFrameworkIT : KGPBaseTest() { "sharedAppleFramework", gradleVersion, ) { - val environmentVariables = mapOf( + val environmentVariables = EnvironmentalVariables( "CONFIGURATION" to "Debug", "SDK_NAME" to "iphoneos", "ARCHS" to "arm64", @@ -220,7 +225,7 @@ class AppleFrameworkIT : KGPBaseTest() { "shared:assembleCustomReleaseAppleFrameworkForXcodeIosX64", "shared:assembleCustomReleaseAppleFrameworkForXcodeIosArm64" ), - environmentVariables = EnvironmentalVariables(environmentVariables) + environmentVariables = environmentVariables ) } } @@ -295,17 +300,16 @@ class AppleFrameworkIT : KGPBaseTest() { gradleVersion, ) { val environmentVariables = EnvironmentalVariables( - mapOf( - "CONFIGURATION" to "Debug", - "SDK_NAME" to "iphoneos", - "ARCHS" to "arm64", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), - ) + "CONFIGURATION" to "Debug", + "SDK_NAME" to "iphoneos", + "ARCHS" to "arm64", + "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) + buildAndAssertAllTasks( registeredTasks = listOf( "shared:embedAndSignAppleFrameworkForXcode", - "shared:embedAndSignCustomAppleFrameworkForXcode" + "shared:embedAndSignCustomAppleFrameworkForXcode", ), notRegisteredTasks = listOf( "shared:assembleReleaseAppleFrameworkForXcodeIosX64", @@ -315,9 +319,9 @@ class AppleFrameworkIT : KGPBaseTest() { "shared:assembleCustomDebugAppleFrameworkForXcodeIosX64", "shared:assembleCustomReleaseAppleFrameworkForXcodeIosX64", "shared:assembleCustomDebugAppleFrameworkForXcodeIosArm64", - "shared:assembleCustomReleaseAppleFrameworkForXcodeIosArm64" + "shared:assembleCustomReleaseAppleFrameworkForXcodeIosArm64", ), - environmentVariables = environmentVariables + environmentVariables = environmentVariables, ) buildAndFail( ":shared:embedAndSignCustomAppleFrameworkForXcode", @@ -342,14 +346,12 @@ class AppleFrameworkIT : KGPBaseTest() { buildOptions = defaultBuildOptions ) { val environmentVariables = EnvironmentalVariables( - mapOf( - "CONFIGURATION" to "debug", - "SDK_NAME" to "iphoneos123", - "ARCHS" to "arm64", - "TARGET_BUILD_DIR" to "no use", - "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), - ) + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123", + "ARCHS" to "arm64", + "TARGET_BUILD_DIR" to "no use", + "FRAMEWORKS_FOLDER_PATH" to "no use", + "BUILT_PRODUCTS_DIR" to projectPath.resolve("shared/build/xcode-frameworks/debug/iphoneos123").toString(), ) subProject("shared").buildGradleKts.modify { @@ -379,14 +381,12 @@ class AppleFrameworkIT : KGPBaseTest() { gradleVersion, ) { val environmentVariables = EnvironmentalVariables( - mapOf( - "CONFIGURATION" to "debug", - "SDK_NAME" to "iphoneos123", - "ARCHS" to "arm64", - "TARGET_BUILD_DIR" to "no use", - "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), - ) + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123", + "ARCHS" to "arm64", + "TARGET_BUILD_DIR" to "no use", + "FRAMEWORKS_FOLDER_PATH" to "no use", + "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) subProject("shared").buildGradleKts.appendText( @@ -416,14 +416,12 @@ class AppleFrameworkIT : KGPBaseTest() { gradleVersion, ) { val environmentVariables = EnvironmentalVariables( - mapOf( - "CONFIGURATION" to "debug", - "SDK_NAME" to "iphoneos123", - "ARCHS" to "arm64", - "TARGET_BUILD_DIR" to "no use", - "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), - ) + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123", + "ARCHS" to "arm64", + "TARGET_BUILD_DIR" to "no use", + "FRAMEWORKS_FOLDER_PATH" to "no use", + "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) projectPath.resolve("shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Greeting.kt") @@ -447,14 +445,12 @@ class AppleFrameworkIT : KGPBaseTest() { gradleVersion, ) { val environmentVariables = EnvironmentalVariables( - mapOf( - "CONFIGURATION" to "debug", - "SDK_NAME" to "iphoneos123", - "ARCHS" to "arm64", - "TARGET_BUILD_DIR" to "no use", - "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), - ) + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123", + "ARCHS" to "arm64", + "TARGET_BUILD_DIR" to "no use", + "FRAMEWORKS_FOLDER_PATH" to "no use", + "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) projectPath.resolve("shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Greeting.kt") @@ -478,14 +474,12 @@ class AppleFrameworkIT : KGPBaseTest() { gradleVersion, ) { val environmentVariables = EnvironmentalVariables( - mapOf( - "CONFIGURATION" to "debug", - "SDK_NAME" to "iphoneos123", - "ARCHS" to "arm64", - "TARGET_BUILD_DIR" to "no use", - "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), - ) + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123", + "ARCHS" to "arm64", + "TARGET_BUILD_DIR" to "no use", + "FRAMEWORKS_FOLDER_PATH" to "no use", + "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) projectPath.resolve("shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Greeting.kt") @@ -513,14 +507,12 @@ class AppleFrameworkIT : KGPBaseTest() { gradleVersion, ) { val environmentVariables = EnvironmentalVariables( - mapOf( - "CONFIGURATION" to "debug", - "SDK_NAME" to "iphoneos123", - "ARCHS" to "arm64", - "TARGET_BUILD_DIR" to "no use", - "FRAMEWORKS_FOLDER_PATH" to "no use", - "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), - ) + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123", + "ARCHS" to "arm64", + "TARGET_BUILD_DIR" to "no use", + "FRAMEWORKS_FOLDER_PATH" to "no use", + "BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(), ) projectPath.resolve("shared/src/commonMain/kotlin/com/github/jetbrains/myapplication/Greeting.kt") diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index b2edefd8914..371f504ecee 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -498,6 +498,9 @@ internal class PropertiesProvider private constructor(private val project: Proje val konanDataDir: String? get() = property(PropertyNames.KONAN_DATA_DIR).orNull + val appleCopyFrameworkToBuiltProductsDir: Boolean + get() = booleanProperty(PropertyNames.KOTLIN_APPLE_COPY_FRAMEWORK_TO_BUILT_PRODUCTS_DIR) ?: true + /** * Allows suppressing the diagnostic [KotlinToolingDiagnostics.BuildToolsApiVersionInconsistency]. * Required only for Kotlin repo bootstrapping. @@ -640,6 +643,7 @@ internal class PropertiesProvider private constructor(private val project: Proje val KOTLIN_USER_HOME_DIR = property("kotlin.user.home") val KOTLIN_PROJECT_PERSISTENT_DIR = property("kotlin.project.persistent.dir") val KOTLIN_PROJECT_PERSISTENT_DIR_GRADLE_DISABLE_WRITE = property("kotlin.project.persistent.dir.gradle.disableWrite") + val KOTLIN_APPLE_COPY_FRAMEWORK_TO_BUILT_PRODUCTS_DIR = property("kotlin.apple.copyFrameworkToBuiltProductsDir") /** * Internal properties: builds get big non-suppressible warning when such properties are used diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt index 52baa4226a4..902d3eeef82 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt @@ -15,6 +15,7 @@ import org.gradle.api.tasks.* import org.gradle.process.ExecOperations import org.gradle.work.DisableCachingByDefault import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic import org.jetbrains.kotlin.gradle.plugin.mpp.Framework @@ -22,6 +23,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.plugin.mpp.apple.FrameworkCopy.Companion.dsymFile import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask +import org.jetbrains.kotlin.gradle.tasks.dependsOn import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.utils.getFile @@ -34,6 +36,7 @@ import java.io.IOException import java.nio.file.Files import javax.inject.Inject +@Suppress("ConstPropertyName") internal object AppleXcodeTasks { const val embedAndSignTaskPrefix = "embedAndSign" const val embedAndSignTaskPostfix = "AppleFrameworkForXcode" @@ -70,6 +73,9 @@ private object XcodeEnvironment { return File(configuration, sdk) } + val builtProductsDir: File? + get() = System.getenv("BUILT_PRODUCTS_DIR")?.let(::File) + val embeddedFrameworksDir: File? get() { val xcodeTargetBuildDir = System.getenv("TARGET_BUILD_DIR") ?: return null @@ -77,12 +83,6 @@ private object XcodeEnvironment { return File(xcodeTargetBuildDir, xcodeFrameworksFolderPath).absoluteFile } - val buildProductsDir: File? - get() { - val derivedFileDir = System.getenv("BUILT_PRODUCTS_DIR") ?: return null - return File(derivedFileDir).absoluteFile - } - val sign: String? get() = System.getenv("EXPANDED_CODE_SIGN_IDENTITY") val userScriptSandboxingEnabled: Boolean get() = System.getenv("ENABLE_USER_SCRIPT_SANDBOXING") == "YES" @@ -92,8 +92,8 @@ private object XcodeEnvironment { buildType=$buildType targets=$targets frameworkSearchDir=$frameworkSearchDir + builtProductDir=$builtProductsDir embeddedFrameworksDir=$embeddedFrameworksDir - buildProductsDir=$buildProductsDir sign=$sign userScriptSandboxingEnabled=$userScriptSandboxingEnabled """.trimIndent() @@ -118,9 +118,8 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta ) val envBuildType = XcodeEnvironment.buildType - val envFrameworkSearchDir = XcodeEnvironment.frameworkSearchDir - if (envBuildType == null || envTargets.isEmpty() || envFrameworkSearchDir == null) { + if (envBuildType == null || envTargets.isEmpty() || XcodeEnvironment.builtProductsDir == null) { val envConfiguration = System.getenv("CONFIGURATION") if (envTargets.isNotEmpty() && envConfiguration != null) { project.reportDiagnostic(KotlinToolingDiagnostics.UnknownAppleFrameworkBuildType(envConfiguration)) @@ -138,7 +137,7 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta needFatFramework -> locateOrRegisterTask(frameworkTaskName) { task -> task.description = "Packs $frameworkBuildType fat framework for Xcode" task.baseName = framework.baseName - task.destinationDirProperty.fileProvider(appleFrameworkDir(envFrameworkSearchDir)) + task.destinationDirProperty.fileProvider(appleFrameworkDir(frameworkTaskName)) task.isEnabled = frameworkBuildType == envBuildType }.also { it.configure { task -> task.from(framework) } @@ -149,12 +148,12 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta task.sourceFramework.fileProvider(framework.linkTaskProvider.flatMap { it.outputFile }) task.sourceDsym.fileProvider(dsymFile(task.sourceFramework.mapToFile())) task.dependsOn(framework.linkTaskProvider) - task.destinationDirectory.fileProvider(appleFrameworkDir(envFrameworkSearchDir)) + task.destinationDirectory.fileProvider(appleFrameworkDir(frameworkTaskName)) } } } -private fun fireEnvException(frameworkTaskName: String) { +private fun fireEnvException(frameworkTaskName: String): Nothing { val envBuildType = XcodeEnvironment.buildType val envConfiguration = System.getenv("CONFIGURATION") if (envConfiguration != null && envBuildType == null) { @@ -192,13 +191,13 @@ private enum class DirAccessibility { DOES_NOT_EXIST } -private fun buildProductsDirAccessibility(): DirAccessibility { - val buildProductsDir = XcodeEnvironment.buildProductsDir +private fun builtProductsDirAccessibility(): DirAccessibility { + val builtProductsDir = XcodeEnvironment.builtProductsDir - return if (buildProductsDir != null) { + return if (builtProductsDir != null) { try { - Files.createDirectories(buildProductsDir.toPath()) - val tempFile = File.createTempFile("sandbox", ".tmp", buildProductsDir) + Files.createDirectories(builtProductsDir.toPath()) + val tempFile = File.createTempFile("sandbox", ".tmp", builtProductsDir) if (tempFile.exists()) { tempFile.delete() } @@ -215,7 +214,6 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework val envBuildType = XcodeEnvironment.buildType val envTargets = XcodeEnvironment.targets val envEmbeddedFrameworksDir = XcodeEnvironment.embeddedFrameworksDir - val envFrameworkSearchDir = XcodeEnvironment.frameworkSearchDir val envSign = XcodeEnvironment.sign val userScriptSandboxingEnabled = XcodeEnvironment.userScriptSandboxingEnabled @@ -225,7 +223,7 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework AppleXcodeTasks.embedAndSignTaskPostfix ) - if (envBuildType == null || envTargets.isEmpty() || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == null) { + if (envBuildType == null || envTargets.isEmpty() || envEmbeddedFrameworksDir == null) { locateOrRegisterTask(frameworkTaskName) { task -> task.group = BasePlugin.BUILD_GROUP task.description = "Embed and sign ${framework.namePrefix} framework as requested by Xcode's environment variables" @@ -240,7 +238,7 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework task.group = BasePlugin.BUILD_GROUP task.description = "Check BUILT_PRODUCTS_DIR accessible and ENABLE_USER_SCRIPT_SANDBOXING not enabled" task.doFirst { - val dirAccessible = buildProductsDirAccessibility() + val dirAccessible = builtProductsDirAccessibility() when (dirAccessible) { DirAccessibility.NOT_ACCESSIBLE -> fireSandboxException(frameworkTaskName) DirAccessibility.DOES_NOT_EXIST, @@ -268,13 +266,14 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework } val assembleTask = registerAssembleAppleFrameworkTask(framework) ?: return + assembleTask.dependsOn(checkSandboxAndWriteProtectionTask) + if (framework.buildType != envBuildType || !envTargets.contains(framework.konanTarget)) return embedAndSignTask.configure { task -> val frameworkFile = framework.outputFile - task.dependsOn(checkSandboxAndWriteProtectionTask) task.dependsOn(assembleTask) - task.sourceFramework.fileProvider(appleFrameworkDir(envFrameworkSearchDir).map { it.resolve(frameworkFile.name) }) + task.sourceFramework.fileProvider(appleFrameworkDir(frameworkTaskName).map { it.resolve(frameworkFile.name) }) task.destinationDirectory.set(envEmbeddedFrameworksDir) if (envSign != null) { task.doLast { @@ -297,10 +296,20 @@ private val Framework.namePrefix: String ) /** - * If [frameworkSearchDir] is absolute use it, otherwise make it relative to buildDir/xcode-frameworks + * [XcodeEnvironment.builtProductsDir] if not disabled. + * + * Or if [XcodeEnvironment.frameworkSearchDir] is absolute use it, otherwise make it relative to buildDir/xcode-frameworks */ -private fun Project.appleFrameworkDir(frameworkSearchDir: File): Provider = - layout.buildDirectory.dir("xcode-frameworks").map { it.asFile.resolve(frameworkSearchDir) } +private fun Project.appleFrameworkDir(frameworkTaskName: String): Provider { + return if (project.kotlinPropertiesProvider.appleCopyFrameworkToBuiltProductsDir) { + project.provider { XcodeEnvironment.builtProductsDir ?: fireEnvException(frameworkTaskName) } + } else { + layout.buildDirectory.dir("xcode-frameworks").map { + it.asFile.resolve(XcodeEnvironment.frameworkSearchDir ?: fireEnvException(frameworkTaskName)) + } + } +} + /** * macOS frameworks contain symlinks which are resolved/removed by the Gradle [Copy] task.