KT-62745: add missing BUILT_PRODUCTS_DIR test
This commit is contained in:
committed by
Space Team
parent
259a2f5ec0
commit
f4097db0c2
+88
-25
@@ -13,8 +13,9 @@ import org.junit.jupiter.api.DisplayName
|
|||||||
import org.junit.jupiter.api.condition.OS
|
import org.junit.jupiter.api.condition.OS
|
||||||
import org.junit.jupiter.api.io.TempDir
|
import org.junit.jupiter.api.io.TempDir
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
import kotlin.io.path.absolutePathString
|
import java.nio.file.attribute.PosixFilePermission
|
||||||
import kotlin.io.path.appendText
|
import kotlin.io.path.*
|
||||||
|
|
||||||
|
|
||||||
@OsCondition(supportedOn = [OS.MAC], enabledOnCI = [OS.MAC])
|
@OsCondition(supportedOn = [OS.MAC], enabledOnCI = [OS.MAC])
|
||||||
@DisplayName("Tests for K/N with Apple Framework")
|
@DisplayName("Tests for K/N with Apple Framework")
|
||||||
@@ -28,27 +29,34 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
fun shouldAssembleAppleFrameworkForXcodeForIosArm64(
|
fun shouldAssembleAppleFrameworkForXcodeForIosArm64(
|
||||||
gradleVersion: GradleVersion,
|
gradleVersion: GradleVersion,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
nativeProject(
|
nativeProject(
|
||||||
"sharedAppleFramework",
|
"sharedAppleFramework",
|
||||||
gradleVersion,
|
gradleVersion,
|
||||||
buildOptions = defaultBuildOptions,
|
buildOptions = defaultBuildOptions
|
||||||
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(),
|
||||||
) {
|
)
|
||||||
|
|
||||||
build("assembleDebugAppleFrameworkForXcodeIosArm64") {
|
build(
|
||||||
|
"assembleDebugAppleFrameworkForXcodeIosArm64",
|
||||||
|
environmentVariables = EnvironmentalVariables(environmentVariables)
|
||||||
|
) {
|
||||||
assertTasksExecuted(":shared:assembleDebugAppleFrameworkForXcodeIosArm64")
|
assertTasksExecuted(":shared:assembleDebugAppleFrameworkForXcodeIosArm64")
|
||||||
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework")
|
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework")
|
||||||
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework.dSYM")
|
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/sdk.framework.dSYM")
|
||||||
}
|
}
|
||||||
|
|
||||||
build("assembleCustomDebugAppleFrameworkForXcodeIosArm64") {
|
build(
|
||||||
|
"assembleCustomDebugAppleFrameworkForXcodeIosArm64",
|
||||||
|
environmentVariables = EnvironmentalVariables(environmentVariables)
|
||||||
|
) {
|
||||||
assertTasksExecuted(":shared:assembleCustomDebugAppleFrameworkForXcodeIosArm64")
|
assertTasksExecuted(":shared:assembleCustomDebugAppleFrameworkForXcodeIosArm64")
|
||||||
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/lib.framework")
|
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/lib.framework")
|
||||||
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/lib.framework.dSYM")
|
assertDirectoryInProjectExists("shared/build/xcode-frameworks/debug/iphoneos123/lib.framework.dSYM")
|
||||||
@@ -73,7 +81,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
build("assembleReleaseAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
build("assembleReleaseAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
||||||
assertTasksExecuted(":shared:linkReleaseFrameworkIosSimulatorArm64")
|
assertTasksExecuted(":shared:linkReleaseFrameworkIosSimulatorArm64")
|
||||||
@@ -103,7 +112,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
||||||
assertTasksExecuted(":shared:assembleDebugAppleFrameworkForXcodeMacosX64")
|
assertTasksExecuted(":shared:assembleDebugAppleFrameworkForXcodeMacosX64")
|
||||||
@@ -129,7 +139,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"SDK_NAME" to "iphoneos",
|
"SDK_NAME" to "iphoneos",
|
||||||
"ARCHS" to "arm64",
|
"ARCHS" to "arm64",
|
||||||
"TARGET_BUILD_DIR" to projectPath.absolutePathString(),
|
"TARGET_BUILD_DIR" to projectPath.absolutePathString(),
|
||||||
"FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived"
|
"FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived",
|
||||||
|
"BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(),
|
||||||
)
|
)
|
||||||
build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
||||||
assertDirectoryInProjectExists("build/xcode-derived/sdk.framework")
|
assertDirectoryInProjectExists("build/xcode-derived/sdk.framework")
|
||||||
@@ -154,7 +165,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"ARCHS" to "arm64",
|
"ARCHS" to "arm64",
|
||||||
"EXPANDED_CODE_SIGN_IDENTITY" to "-",
|
"EXPANDED_CODE_SIGN_IDENTITY" to "-",
|
||||||
"TARGET_BUILD_DIR" to projectPath.absolutePathString(),
|
"TARGET_BUILD_DIR" to projectPath.absolutePathString(),
|
||||||
"FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived"
|
"FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived",
|
||||||
|
"BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(),
|
||||||
)
|
)
|
||||||
build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
build(":shared:embedAndSignAppleFrameworkForXcode", environmentVariables = EnvironmentalVariables(environmentVariables)) {
|
||||||
assertDirectoryInProjectExists("build/xcode-derived/sdk.framework")
|
assertDirectoryInProjectExists("build/xcode-derived/sdk.framework")
|
||||||
@@ -192,7 +204,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"ARCHS" to "arm64",
|
"ARCHS" to "arm64",
|
||||||
"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 "testFrameworksDir"
|
"FRAMEWORKS_FOLDER_PATH" to "testFrameworksDir",
|
||||||
|
"BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(),
|
||||||
)
|
)
|
||||||
buildAndAssertAllTasks(
|
buildAndAssertAllTasks(
|
||||||
registeredTasks = listOf(
|
registeredTasks = listOf(
|
||||||
@@ -229,14 +242,44 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"EXPANDED_CODE_SIGN_IDENTITY" to "-",
|
"EXPANDED_CODE_SIGN_IDENTITY" to "-",
|
||||||
"TARGET_BUILD_DIR" to projectPath.absolutePathString(),
|
"TARGET_BUILD_DIR" to projectPath.absolutePathString(),
|
||||||
"FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived",
|
"FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived",
|
||||||
"ENABLE_USER_SCRIPT_SANDBOXING" to "YES"
|
"ENABLE_USER_SCRIPT_SANDBOXING" to "YES",
|
||||||
|
"BUILT_PRODUCTS_DIR" to iosBuildProductsDir().absolutePathString(),
|
||||||
)
|
)
|
||||||
buildAndFail(
|
buildAndFail(
|
||||||
":shared:embedAndSignAppleFrameworkForXcode",
|
":shared:embedAndSignAppleFrameworkForXcode",
|
||||||
environmentVariables = EnvironmentalVariables(environmentVariables)
|
environmentVariables = EnvironmentalVariables(environmentVariables)
|
||||||
) {
|
) {
|
||||||
assertTasksFailed(":shared:embedAndSignAppleFrameworkForXcode")
|
assertTasksFailed(":shared:checkSandboxAndWriteProtection")
|
||||||
assertOutputContains("Sandboxing for user scripts is currently enabled")
|
assertOutputContains("You have sandboxing for user scripts enabled.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@DisplayName("embedAndSignAppleFrameworkForXcode was registered with missing BUILT_PRODUCTS_DIR directory")
|
||||||
|
@OptIn(EnvironmentalVariablesOverride::class)
|
||||||
|
@GradleTest
|
||||||
|
fun shouldFailEmbedAndSignAppleFrameworkForXcodeWithMissingBuildProductsDir(
|
||||||
|
gradleVersion: GradleVersion,
|
||||||
|
) {
|
||||||
|
nativeProject(
|
||||||
|
"sharedAppleFramework",
|
||||||
|
gradleVersion,
|
||||||
|
) {
|
||||||
|
val environmentVariables = mapOf(
|
||||||
|
"CONFIGURATION" to "Debug",
|
||||||
|
"SDK_NAME" to "iphoneos",
|
||||||
|
"ARCHS" to "arm64",
|
||||||
|
"EXPANDED_CODE_SIGN_IDENTITY" to "-",
|
||||||
|
"TARGET_BUILD_DIR" to projectPath.absolutePathString(),
|
||||||
|
"FRAMEWORKS_FOLDER_PATH" to "build/xcode-derived",
|
||||||
|
"BUILT_PRODUCTS_DIR" to iosBuildProductsDir(true).absolutePathString(),
|
||||||
|
)
|
||||||
|
buildAndFail(
|
||||||
|
":shared:embedAndSignAppleFrameworkForXcode",
|
||||||
|
environmentVariables = EnvironmentalVariables(environmentVariables)
|
||||||
|
) {
|
||||||
|
assertTasksFailed(":shared:checkSandboxAndWriteProtection")
|
||||||
|
assertOutputContains("BUILT_PRODUCTS_DIR is not accessible, probably you have sandboxing for user scripts enabled.")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -255,7 +298,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
mapOf(
|
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(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
buildAndAssertAllTasks(
|
buildAndAssertAllTasks(
|
||||||
@@ -303,7 +347,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -339,7 +384,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -375,7 +421,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -405,7 +452,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -435,7 +483,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -469,7 +518,8 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
"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(),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -534,4 +584,17 @@ class AppleFrameworkIT : KGPBaseTest() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val GradleProject.darwinBuildProductsDir: Path
|
||||||
|
get() = projectPath.resolve("DerivedSources").apply {
|
||||||
|
if (notExists()) {
|
||||||
|
createDirectory()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun GradleProject.iosBuildProductsDir(writeProtected: Boolean = false): Path = darwinBuildProductsDir.apply {
|
||||||
|
if (writeProtected) {
|
||||||
|
setPosixFilePermissions(setOf(PosixFilePermission.OWNER_READ))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+89
-33
@@ -30,11 +30,14 @@ import org.jetbrains.kotlin.gradle.utils.mapToFile
|
|||||||
import org.jetbrains.kotlin.konan.target.KonanTarget
|
import org.jetbrains.kotlin.konan.target.KonanTarget
|
||||||
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
|
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.io.IOException
|
||||||
|
import java.nio.file.Files
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
internal object AppleXcodeTasks {
|
internal object AppleXcodeTasks {
|
||||||
const val embedAndSignTaskPrefix = "embedAndSign"
|
const val embedAndSignTaskPrefix = "embedAndSign"
|
||||||
const val embedAndSignTaskPostfix = "AppleFrameworkForXcode"
|
const val embedAndSignTaskPostfix = "AppleFrameworkForXcode"
|
||||||
|
const val checkSandboxAndWriteProtection = "checkSandboxAndWriteProtection"
|
||||||
}
|
}
|
||||||
|
|
||||||
private object XcodeEnvironment {
|
private object XcodeEnvironment {
|
||||||
@@ -74,9 +77,15 @@ 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: String? get() = System.getenv("ENABLE_USER_SCRIPT_SANDBOXING")
|
val userScriptSandboxingEnabled: Boolean get() = System.getenv("ENABLE_USER_SCRIPT_SANDBOXING") == "YES"
|
||||||
|
|
||||||
override fun toString() = """
|
override fun toString() = """
|
||||||
XcodeEnvironment:
|
XcodeEnvironment:
|
||||||
@@ -84,7 +93,9 @@ private object XcodeEnvironment {
|
|||||||
targets=$targets
|
targets=$targets
|
||||||
frameworkSearchDir=$frameworkSearchDir
|
frameworkSearchDir=$frameworkSearchDir
|
||||||
embeddedFrameworksDir=$embeddedFrameworksDir
|
embeddedFrameworksDir=$embeddedFrameworksDir
|
||||||
|
buildProductsDir=$buildProductsDir
|
||||||
sign=$sign
|
sign=$sign
|
||||||
|
userScriptSandboxingEnabled=$userScriptSandboxingEnabled
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,6 +154,63 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun fireEnvException(frameworkTaskName: String) {
|
||||||
|
val envBuildType = XcodeEnvironment.buildType
|
||||||
|
val envConfiguration = System.getenv("CONFIGURATION")
|
||||||
|
if (envConfiguration != null && envBuildType == null) {
|
||||||
|
throw IllegalStateException(
|
||||||
|
"Unable to detect Kotlin framework build type for CONFIGURATION=$envConfiguration automatically. " +
|
||||||
|
"Specify 'KOTLIN_FRAMEWORK_BUILD_TYPE' to 'debug' or 'release'" +
|
||||||
|
"\n$XcodeEnvironment"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
throw IllegalStateException(
|
||||||
|
"Please run the $frameworkTaskName task from Xcode " +
|
||||||
|
"('SDK_NAME', 'CONFIGURATION', 'TARGET_BUILD_DIR', 'ARCHS' and 'FRAMEWORKS_FOLDER_PATH' not provided)" +
|
||||||
|
"\n$XcodeEnvironment"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun fireSandboxException(frameworkTaskName: String) {
|
||||||
|
val userScriptSandboxingEnabled = XcodeEnvironment.userScriptSandboxingEnabled
|
||||||
|
val message = if (userScriptSandboxingEnabled) "You " else "BUILT_PRODUCTS_DIR is not accessible, probably you "
|
||||||
|
throw IllegalStateException(
|
||||||
|
message +
|
||||||
|
"have sandboxing for user scripts enabled." +
|
||||||
|
"\nTo make the $frameworkTaskName task pass, disable this feature. " +
|
||||||
|
"\nIn your Xcode project, navigate to \"Build Setting\", " +
|
||||||
|
"and under \"Build Options\" set \"User script sandboxing\" (ENABLE_USER_SCRIPT_SANDBOXING) to \"NO\". " +
|
||||||
|
"\nThen, run \"./gradlew --stop\" to stop the Gradle daemon" +
|
||||||
|
"\nFor more information, see documentation: https://jb.gg/ltd9e6"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum class DirAccessibility {
|
||||||
|
ACCESSIBLE,
|
||||||
|
NOT_ACCESSIBLE,
|
||||||
|
DOES_NOT_EXIST
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun buildProductsDirAccessibility(): DirAccessibility {
|
||||||
|
val buildProductsDir = XcodeEnvironment.buildProductsDir
|
||||||
|
|
||||||
|
return if (buildProductsDir != null) {
|
||||||
|
try {
|
||||||
|
Files.createDirectories(buildProductsDir.toPath())
|
||||||
|
val tempFile = File.createTempFile("sandbox", ".tmp", buildProductsDir)
|
||||||
|
if (tempFile.exists()) {
|
||||||
|
tempFile.delete()
|
||||||
|
}
|
||||||
|
DirAccessibility.ACCESSIBLE
|
||||||
|
} catch (e: IOException) {
|
||||||
|
DirAccessibility.NOT_ACCESSIBLE
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DirAccessibility.DOES_NOT_EXIST
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework) {
|
internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework) {
|
||||||
val envBuildType = XcodeEnvironment.buildType
|
val envBuildType = XcodeEnvironment.buildType
|
||||||
val envTargets = XcodeEnvironment.targets
|
val envTargets = XcodeEnvironment.targets
|
||||||
@@ -151,48 +219,37 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework
|
|||||||
val envSign = XcodeEnvironment.sign
|
val envSign = XcodeEnvironment.sign
|
||||||
val userScriptSandboxingEnabled = XcodeEnvironment.userScriptSandboxingEnabled
|
val userScriptSandboxingEnabled = XcodeEnvironment.userScriptSandboxingEnabled
|
||||||
|
|
||||||
val frameworkTaskName = lowerCamelCaseName(AppleXcodeTasks.embedAndSignTaskPrefix, framework.namePrefix, AppleXcodeTasks.embedAndSignTaskPostfix)
|
val frameworkTaskName = lowerCamelCaseName(
|
||||||
|
AppleXcodeTasks.embedAndSignTaskPrefix,
|
||||||
|
framework.namePrefix,
|
||||||
|
AppleXcodeTasks.embedAndSignTaskPostfix
|
||||||
|
)
|
||||||
|
|
||||||
if (envBuildType == null || envTargets.isEmpty() || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == null) {
|
if (envBuildType == null || envTargets.isEmpty() || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == 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"
|
||||||
task.doFirst {
|
task.doFirst {
|
||||||
val envConfiguration = System.getenv("CONFIGURATION")
|
fireEnvException(frameworkTaskName)
|
||||||
if (envConfiguration != null && envBuildType == null) {
|
|
||||||
throw IllegalStateException(
|
|
||||||
"Unable to detect Kotlin framework build type for CONFIGURATION=$envConfiguration automatically. " +
|
|
||||||
"Specify 'KOTLIN_FRAMEWORK_BUILD_TYPE' to 'debug' or 'release'" +
|
|
||||||
"\n$XcodeEnvironment"
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
throw IllegalStateException(
|
|
||||||
"Please run the $frameworkTaskName task from Xcode " +
|
|
||||||
"('SDK_NAME', 'CONFIGURATION', 'TARGET_BUILD_DIR', 'ARCHS' and 'FRAMEWORKS_FOLDER_PATH' not provided)" +
|
|
||||||
"\n$XcodeEnvironment"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (userScriptSandboxingEnabled == "YES") {
|
val checkSandboxAndWriteProtectionTask = locateOrRegisterTask<DefaultTask>(AppleXcodeTasks.checkSandboxAndWriteProtection) { task ->
|
||||||
locateOrRegisterTask<DefaultTask>(frameworkTaskName) { task ->
|
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 = "Embed and sign ${framework.namePrefix} framework as requested by Xcode's environment variables"
|
task.doFirst {
|
||||||
task.doFirst {
|
val dirAccessible = buildProductsDirAccessibility()
|
||||||
throw IllegalStateException(
|
when (dirAccessible) {
|
||||||
"You have sandboxing for user scripts enabled. " +
|
DirAccessibility.NOT_ACCESSIBLE -> fireSandboxException(frameworkTaskName)
|
||||||
"\nTo make the $frameworkTaskName task pass, disable this feature. " +
|
DirAccessibility.DOES_NOT_EXIST,
|
||||||
"\nIn your Xcode project, navigate to \"Build Setting\", " +
|
DirAccessibility.ACCESSIBLE
|
||||||
"and under \"Build Options\" set \"User script sandboxing\" (ENABLE_USER_SCRIPT_SANDBOXING) to \"NO\". " +
|
-> if (userScriptSandboxingEnabled) {
|
||||||
"\nThen, run \"./gradlew --stop\" to stop the Gradle daemon" +
|
fireSandboxException(frameworkTaskName)
|
||||||
"\nFor more information, see documentation: https://jb.gg/ltd9e6"
|
}
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val embedAndSignTask = locateOrRegisterTask<FrameworkCopy>(frameworkTaskName) { task ->
|
val embedAndSignTask = locateOrRegisterTask<FrameworkCopy>(frameworkTaskName) { task ->
|
||||||
@@ -203,12 +260,10 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework
|
|||||||
property("type", envBuildType)
|
property("type", envBuildType)
|
||||||
property("targets", envTargets)
|
property("targets", envTargets)
|
||||||
property("embeddedFrameworksDir", envEmbeddedFrameworksDir)
|
property("embeddedFrameworksDir", envEmbeddedFrameworksDir)
|
||||||
|
property("userScriptSandboxingEnabled", userScriptSandboxingEnabled)
|
||||||
if (envSign != null) {
|
if (envSign != null) {
|
||||||
property("sign", envSign)
|
property("sign", envSign)
|
||||||
}
|
}
|
||||||
if (userScriptSandboxingEnabled != null) {
|
|
||||||
property("userScriptSandboxingEnabled", userScriptSandboxingEnabled)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,6 +272,7 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework
|
|||||||
|
|
||||||
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(envFrameworkSearchDir).map { it.resolve(frameworkFile.name) })
|
||||||
task.destinationDirectory.set(envEmbeddedFrameworksDir)
|
task.destinationDirectory.set(envEmbeddedFrameworksDir)
|
||||||
|
|||||||
Reference in New Issue
Block a user