[Gradle] Copy framework to BUILT_PRODUCTS_DIR in the embedAndSign task

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