KT-65741 Add Swift Export KGP tasks
This commit is contained in:
committed by
Space Team
parent
eabd2f0fc7
commit
d76a6d6a9c
@@ -74,6 +74,7 @@ dependencies {
|
||||
}
|
||||
commonCompileOnly(project(":kotlin-tooling-metadata"))
|
||||
commonCompileOnly(project(":compiler:build-tools:kotlin-build-statistics"))
|
||||
commonCompileOnly(project(":native:swift:swift-export-standalone"))
|
||||
commonCompileOnly(commonDependency("org.jetbrains.intellij.deps:asm-all")) { isTransitive = false }
|
||||
|
||||
commonImplementation(project(":kotlin-gradle-plugin-idea"))
|
||||
@@ -90,6 +91,10 @@ dependencies {
|
||||
commonRuntimeOnly(project(":kotlin-util-klib"))
|
||||
commonRuntimeOnly(project(":kotlin-compiler-embeddable"))
|
||||
|
||||
if (kotlinBuildProperties.isSwiftExportPluginPublishingEnabled) {
|
||||
embedded(project(":native:swift:swift-export-embeddable"))
|
||||
}
|
||||
|
||||
embedded(project(":kotlin-gradle-build-metrics"))
|
||||
embedded(project(":kotlin-gradle-statistics"))
|
||||
embedded(commonDependency("org.jetbrains.intellij.deps:asm-all")) { isTransitive = false }
|
||||
|
||||
+4
@@ -500,6 +500,9 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
||||
val cocoapodsExecutablePath: RegularFile?
|
||||
get() = property(PropertyNames.KOTLIN_APPLE_COCOAPODS_EXECUTABLE).orNull?.let { RegularFile { File(it) } }
|
||||
|
||||
val swiftExportEnabled: Boolean
|
||||
get() = booleanProperty(PropertyNames.KOTLIN_SWIFT_EXPORT_ENABLED) ?: false
|
||||
|
||||
/**
|
||||
* Allows the user to specify a custom location for the Kotlin/Native distribution.
|
||||
* This property takes precedence over the 'KONAN_DATA_DIR' environment variable.
|
||||
@@ -662,6 +665,7 @@ internal class PropertiesProvider private constructor(private val project: Proje
|
||||
val KOTLIN_NATIVE_TOOLCHAIN_ENABLED = property("kotlin.native.toolchain.enabled")
|
||||
val KOTLIN_APPLE_COPY_FRAMEWORK_TO_BUILT_PRODUCTS_DIR = property("kotlin.apple.copyFrameworkToBuiltProductsDir")
|
||||
val KOTLIN_APPLE_COCOAPODS_EXECUTABLE = property("kotlin.apple.cocoapods.bin")
|
||||
val KOTLIN_SWIFT_EXPORT_ENABLED = property("kotlin.swift-export.enabled")
|
||||
|
||||
/**
|
||||
* Internal properties: builds get big non-suppressible warning when such properties are used
|
||||
|
||||
+15
-5
@@ -22,9 +22,9 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
|
||||
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.swiftexport.registerSwiftExportTask
|
||||
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.*
|
||||
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||
import org.jetbrains.kotlin.gradle.tasks.registerTask
|
||||
import org.jetbrains.kotlin.gradle.utils.getFile
|
||||
@@ -139,13 +139,13 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta
|
||||
task.description = "Packs $frameworkBuildType fat framework for Xcode"
|
||||
task.baseName = framework.baseName
|
||||
task.destinationDirProperty.fileProvider(appleFrameworkDir(frameworkTaskName))
|
||||
task.isEnabled = frameworkBuildType == envBuildType
|
||||
task.isEnabled = !project.kotlinPropertiesProvider.swiftExportEnabled && frameworkBuildType == envBuildType
|
||||
}.also {
|
||||
it.configure { task -> task.from(framework) }
|
||||
}
|
||||
else -> registerTask<FrameworkCopy>(frameworkTaskName) { task ->
|
||||
task.description = "Packs $frameworkBuildType ${frameworkTarget.name} framework for Xcode"
|
||||
task.isEnabled = frameworkBuildType == envBuildType
|
||||
task.isEnabled = !project.kotlinPropertiesProvider.swiftExportEnabled && frameworkBuildType == envBuildType
|
||||
task.sourceFramework.fileProvider(framework.linkTaskProvider.flatMap { it.outputFile })
|
||||
task.sourceDsym.fileProvider(dsymFile(task.sourceFramework.mapToFile()))
|
||||
task.dependsOn(framework.linkTaskProvider)
|
||||
@@ -220,6 +220,13 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework
|
||||
|
||||
val frameworkTaskName = framework.embedAndSignTaskName()
|
||||
|
||||
val swiftExportTask: TaskProvider<*>? =
|
||||
if (project.kotlinPropertiesProvider.swiftExportEnabled && XcodeEnvironment.targets.contains(framework.target.konanTarget)) {
|
||||
registerSwiftExportTask(framework)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
if (envBuildType == null || envTargets.isEmpty() || envEmbeddedFrameworksDir == null) {
|
||||
locateOrRegisterTask<DefaultTask>(frameworkTaskName) { task ->
|
||||
task.group = BasePlugin.BUILD_GROUP
|
||||
@@ -250,7 +257,7 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework
|
||||
val embedAndSignTask = locateOrRegisterTask<EmbedAndSignTask>(frameworkTaskName) { task ->
|
||||
task.group = BasePlugin.BUILD_GROUP
|
||||
task.description = "Embed and sign ${framework.namePrefix} framework as requested by Xcode's environment variables"
|
||||
task.isEnabled = !framework.isStatic
|
||||
task.isEnabled = !(project.kotlinPropertiesProvider.swiftExportEnabled || framework.isStatic)
|
||||
task.inputs.apply {
|
||||
property("type", envBuildType)
|
||||
property("targets", envTargets)
|
||||
@@ -270,6 +277,9 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework
|
||||
embedAndSignTask.configure { task ->
|
||||
val frameworkFile = framework.outputFile
|
||||
task.dependsOn(assembleTask)
|
||||
if (swiftExportTask != null) {
|
||||
task.dependsOn(swiftExportTask)
|
||||
}
|
||||
task.sourceFramework.fileProvider(appleFrameworkDir(frameworkTaskName).map { it.resolve(frameworkFile.name) })
|
||||
task.destinationDirectory.set(envEmbeddedFrameworksDir)
|
||||
if (envSign != null) {
|
||||
|
||||
+157
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.file.Directory
|
||||
import org.gradle.api.file.DirectoryProperty
|
||||
import org.gradle.api.file.RegularFile
|
||||
import org.gradle.api.provider.Property
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.provider.ProviderFactory
|
||||
import org.gradle.api.tasks.*
|
||||
import org.gradle.work.DisableCachingByDefault
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.AppleXcodeTasks
|
||||
import org.jetbrains.kotlin.gradle.utils.appendLine
|
||||
import org.jetbrains.kotlin.gradle.utils.listFilesOrEmpty
|
||||
import org.jetbrains.kotlin.gradle.utils.mapToFile
|
||||
import org.jetbrains.kotlin.gradle.utils.runCommand
|
||||
import org.jetbrains.kotlin.utils.keysToMap
|
||||
import java.io.File
|
||||
import javax.inject.Inject
|
||||
|
||||
@DisableCachingByDefault(because = "Swift Export is experimental, so no caching for now")
|
||||
abstract class BuildSyntheticProjectWithSwiftExportPackage : DefaultTask() {
|
||||
|
||||
@get:Inject
|
||||
abstract val providerFactory: ProviderFactory
|
||||
|
||||
@get:Input
|
||||
abstract val swiftApiModuleName: Property<String>
|
||||
|
||||
@get:Input
|
||||
abstract val swiftLibraryName: Property<String>
|
||||
|
||||
@get:Input
|
||||
val inheritedBuildSettingsFromEnvironment: Map<String, Provider<String>>
|
||||
get() = listOf(
|
||||
"CONFIGURATION", "ARCHS", "ONLY_ACTIVE_ARCH",
|
||||
).keysToMap {
|
||||
providerFactory.environmentVariable(it)
|
||||
}
|
||||
|
||||
@get:Optional
|
||||
@get:Input
|
||||
val targetDeviceIdentifier: Provider<String> get() = providerFactory.environmentVariable("TARGET_DEVICE_IDENTIFIER")
|
||||
|
||||
@get:Input
|
||||
val platformName: Provider<String> get() = providerFactory.environmentVariable("PLATFORM_NAME")
|
||||
|
||||
@get:OutputDirectory
|
||||
val syntheticInterfacesPath: Provider<Directory> get() = syntheticProjectDirectory.map { it.dir("dd-interfaces") }
|
||||
|
||||
private val syntheticObjectFilesDirectory get() = syntheticProjectDirectory.map { it.dir("dd-o-files") }
|
||||
|
||||
@get:OutputFile
|
||||
val syntheticLibraryPath: Provider<RegularFile> get() = syntheticObjectFilesDirectory.map { it.file("lib${swiftLibraryName.get()}.a") }
|
||||
|
||||
@get:OutputDirectory
|
||||
val syntheticBuildIntermediatesPath: Provider<File> get() = syntheticProjectDirectory.map { it.dir("dd-other") }.mapToFile()
|
||||
|
||||
@get:Internal
|
||||
abstract val syntheticProjectDirectory: DirectoryProperty
|
||||
|
||||
@TaskAction
|
||||
fun run() {
|
||||
val syntheticProjectPath = setUpSyntheticProject()
|
||||
val syntheticObjectFilesDirectory = buildSyntheticProject(syntheticProjectPath)
|
||||
packObjectFilesIntoLibrary(syntheticObjectFilesDirectory)
|
||||
}
|
||||
|
||||
private fun setUpSyntheticProject(): File {
|
||||
val syntheticForSpm = syntheticProjectDirectory.get().asFile
|
||||
val syntheticProjectPath = syntheticForSpm.resolve("synthetic.xcodeproj")
|
||||
syntheticProjectPath.mkdirs()
|
||||
|
||||
val pbxprojPath = syntheticProjectPath.resolve("project.pbxproj")
|
||||
val syntheticProjectTemplate =
|
||||
AppleXcodeTasks.javaClass.getResourceAsStream("/spm/project.pbxproj") ?: error("Missing synthetic project resource")
|
||||
|
||||
pbxprojPath.outputStream().writer().use { pbxprojWriter ->
|
||||
syntheticProjectTemplate.reader().forEachLine { line ->
|
||||
pbxprojWriter
|
||||
.append(line.replace(SYNTHETIC_PROJECT_MARKER, swiftApiModuleName.get()))
|
||||
.appendLine()
|
||||
}
|
||||
}
|
||||
return syntheticProjectPath
|
||||
}
|
||||
|
||||
private fun buildSyntheticProject(syntheticProjectPath: File): File {
|
||||
val syntheticObjectFilesDirectory = this.syntheticObjectFilesDirectory.get().asFile
|
||||
val intermediatesDestination = mapOf(
|
||||
// Thin/universal object files
|
||||
"TARGET_BUILD_DIR" to syntheticObjectFilesDirectory.canonicalPath,
|
||||
// .swiftmodule interface
|
||||
"BUILT_PRODUCTS_DIR" to syntheticInterfacesPath.get().asFile.canonicalPath
|
||||
)
|
||||
val inheritedBuildSettings = inheritedBuildSettingsFromEnvironment.mapValues {
|
||||
it.value.get()
|
||||
}
|
||||
|
||||
// FIXME: This will not work with dynamic libraries
|
||||
runCommand(
|
||||
listOf(
|
||||
"xcodebuild",
|
||||
"build",
|
||||
"-derivedDataPath", syntheticBuildIntermediatesPath.get().canonicalPath,
|
||||
"-project", syntheticProjectPath.canonicalPath,
|
||||
"-scheme", swiftLibraryName.get(),
|
||||
"-destination", destination(),
|
||||
) + (inheritedBuildSettings + intermediatesDestination).map { (k, v) -> "$k=$v" }
|
||||
)
|
||||
return syntheticObjectFilesDirectory
|
||||
}
|
||||
|
||||
private fun packObjectFilesIntoLibrary(syntheticObjectFilesDirectory: File) {
|
||||
val objectFilePaths = syntheticObjectFilesDirectory.listFilesOrEmpty().filter {
|
||||
it.extension == "o"
|
||||
}.map { it.canonicalPath }
|
||||
if (objectFilePaths.isEmpty()) {
|
||||
error("Synthetic project build didn't produce any object files")
|
||||
}
|
||||
|
||||
runCommand(
|
||||
listOf(
|
||||
"libtool", "-static",
|
||||
"-o", syntheticLibraryPath.get().asFile.canonicalPath,
|
||||
) + objectFilePaths,
|
||||
)
|
||||
}
|
||||
|
||||
private fun destination(): String {
|
||||
val deviceId: String? = targetDeviceIdentifier.orNull
|
||||
if (deviceId != null) return "id=$deviceId"
|
||||
|
||||
val platformName = platformName.orNull ?: error("Missing a target device identifier and a platform name")
|
||||
val platform = mapOf(
|
||||
"iphonesimulator" to "iOS Simulator",
|
||||
"iphoneos" to "iOS",
|
||||
"watchsimulator" to "watchOS Simulator",
|
||||
"watchos" to "watchOS",
|
||||
"appletvos" to "tvOS",
|
||||
"appletvsimulator" to "tvOS Simulator",
|
||||
"macosx" to "macOS",
|
||||
)[platformName] ?: error("Unknown PLATFORM_NAME $platformName")
|
||||
|
||||
return "generic/platform=$platform"
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val SYNTHETIC_PROJECT_MARKER = "<SwiftExportModuleName>"
|
||||
}
|
||||
|
||||
}
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.file.DirectoryProperty
|
||||
import org.gradle.api.file.FileSystemOperations
|
||||
import org.gradle.api.file.ProjectLayout
|
||||
import org.gradle.api.file.RegularFileProperty
|
||||
import org.gradle.api.model.ObjectFactory
|
||||
import org.gradle.api.provider.ProviderFactory
|
||||
import org.gradle.api.tasks.*
|
||||
import org.gradle.work.DisableCachingByDefault
|
||||
import java.io.File
|
||||
import javax.inject.Inject
|
||||
|
||||
@DisableCachingByDefault(because = "This task only copies files")
|
||||
abstract class CopySwiftExportIntermediatesForConsumer @Inject constructor(
|
||||
objectFactory: ObjectFactory,
|
||||
projectLayout: ProjectLayout,
|
||||
providerFactory: ProviderFactory,
|
||||
private val fileSystem: FileSystemOperations
|
||||
) : DefaultTask() {
|
||||
|
||||
@get:InputDirectory
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val includeBridgeDirectory: RegularFileProperty
|
||||
|
||||
@get:InputFile
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val kotlinLibraryPath: RegularFileProperty
|
||||
|
||||
@get:InputFile
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val syntheticLibraryPath: RegularFileProperty
|
||||
|
||||
@get:InputDirectory
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val syntheticInterfacesPath: RegularFileProperty
|
||||
|
||||
@get:InputDirectory
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
val builtProductsDirectory: DirectoryProperty = objectFactory.directoryProperty().convention(
|
||||
projectLayout.dir(providerFactory.environmentVariable("BUILT_PRODUCTS_DIR").map {
|
||||
File(it)
|
||||
})
|
||||
)
|
||||
|
||||
@get:OutputDirectory
|
||||
val syntheticInterfacesDestinationPath: DirectoryProperty = objectFactory.directoryProperty().convention(
|
||||
builtProductsDirectory.flatMap {
|
||||
projectLayout.dir(providerFactory.provider {
|
||||
it.asFile.resolve("KotlinBridge")
|
||||
})
|
||||
}
|
||||
)
|
||||
|
||||
@TaskAction
|
||||
fun copy() {
|
||||
fileSystem.copy {
|
||||
it.from(kotlinLibraryPath)
|
||||
it.from(syntheticInterfacesPath)
|
||||
it.from(syntheticLibraryPath)
|
||||
it.into(builtProductsDirectory)
|
||||
}
|
||||
fileSystem.copy {
|
||||
it.from(includeBridgeDirectory)
|
||||
it.into(syntheticInterfacesDestinationPath)
|
||||
}
|
||||
}
|
||||
}
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.file.DirectoryProperty
|
||||
import org.gradle.api.file.RegularFileProperty
|
||||
import org.gradle.api.provider.Property
|
||||
import org.gradle.api.tasks.*
|
||||
import org.gradle.work.DisableCachingByDefault
|
||||
import org.jetbrains.kotlin.gradle.utils.appendLine
|
||||
import org.jetbrains.kotlin.gradle.utils.getFile
|
||||
import org.jetbrains.kotlin.incremental.createDirectory
|
||||
import org.jetbrains.kotlin.incremental.deleteRecursivelyOrThrow
|
||||
|
||||
@DisableCachingByDefault(because = "Swift Export is experimental, so no caching for now")
|
||||
abstract class GenerateSPMPackageFromSwiftExport : DefaultTask() {
|
||||
|
||||
@get:Input
|
||||
abstract val swiftApiModuleName: Property<String>
|
||||
|
||||
@get:Input
|
||||
abstract val headerBridgeModuleName: Property<String>
|
||||
|
||||
@get:Input
|
||||
abstract val swiftLibraryName: Property<String>
|
||||
|
||||
@get:Input
|
||||
abstract val kotlinLibraryName: Property<String>
|
||||
|
||||
@get:InputFile
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val swiftApiPath: RegularFileProperty
|
||||
|
||||
@get:InputFile
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val headerBridgePath: RegularFileProperty
|
||||
|
||||
@get:InputFile
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val libraryPath: RegularFileProperty
|
||||
|
||||
@get:OutputDirectory
|
||||
abstract val packagePath: DirectoryProperty
|
||||
|
||||
@get:Internal
|
||||
val headerBridgeIncludePath get() = headerBridgeModulePath.resolve("include")
|
||||
|
||||
private val swiftApiModule get() = swiftApiModuleName.get()
|
||||
private val headerBridgeModule get() = headerBridgeModuleName.get()
|
||||
private val spmPackageRootPath get() = packagePath.getFile()
|
||||
|
||||
private val sourcesPath get() = spmPackageRootPath.resolve("Sources")
|
||||
private val swiftApiModulePath get() = sourcesPath.resolve(swiftApiModule)
|
||||
private val headerBridgeModulePath get() = sourcesPath.resolve(headerBridgeModule)
|
||||
|
||||
@TaskAction
|
||||
fun generate() {
|
||||
preparePackageDirectory()
|
||||
createHeaderTarget()
|
||||
createSwiftTarget()
|
||||
createPackageManifest()
|
||||
}
|
||||
|
||||
private fun preparePackageDirectory() {
|
||||
if (spmPackageRootPath.exists()) {
|
||||
spmPackageRootPath.deleteRecursivelyOrThrow()
|
||||
}
|
||||
swiftApiModulePath.createDirectory()
|
||||
headerBridgeIncludePath.createDirectory()
|
||||
}
|
||||
|
||||
private fun createHeaderTarget() {
|
||||
headerBridgePath.get().asFile.copyTo(
|
||||
headerBridgeIncludePath.resolve("Kotlin.h")
|
||||
)
|
||||
headerBridgeIncludePath.resolve("module.modulemap").writeText(
|
||||
"""
|
||||
module $headerBridgeModule {
|
||||
umbrella "."
|
||||
export *
|
||||
|
||||
link "${swiftLibraryName.get()}"
|
||||
link "${kotlinLibraryName.get()}"
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
headerBridgeModulePath.resolve("linkingStub.c").writeText("\n")
|
||||
}
|
||||
|
||||
private fun createSwiftTarget() {
|
||||
swiftApiModulePath.resolve("Kotlin.swift").writer().use { kotlinApi ->
|
||||
swiftApiPath.get().asFile.reader().forEachLine {
|
||||
kotlinApi.append(it).appendLine()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun createPackageManifest() {
|
||||
val manifest = spmPackageRootPath.resolve("Package.swift")
|
||||
manifest.writeText(
|
||||
"""
|
||||
// swift-tools-version: 5.9
|
||||
|
||||
import PackageDescription
|
||||
let package = Package(
|
||||
name: "$swiftApiModule",
|
||||
products: [
|
||||
.library(
|
||||
name: "${swiftApiModule}Library",
|
||||
targets: ["$swiftApiModule"]
|
||||
),
|
||||
],
|
||||
targets: [
|
||||
.target(
|
||||
name: "$swiftApiModule",
|
||||
dependencies: ["$headerBridgeModule"]
|
||||
),
|
||||
.target(
|
||||
name: "$headerBridgeModule"
|
||||
)
|
||||
]
|
||||
)
|
||||
""".trimIndent()
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
+222
@@ -0,0 +1,222 @@
|
||||
/*
|
||||
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport
|
||||
|
||||
import org.gradle.api.NamedDomainObjectContainer
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.file.Directory
|
||||
import org.gradle.api.plugins.BasePlugin
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.api.tasks.TaskProvider
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
|
||||
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
|
||||
import org.jetbrains.kotlin.gradle.plugin.kotlinPluginLifecycle
|
||||
import org.jetbrains.kotlin.gradle.plugin.mpp.*
|
||||
import org.jetbrains.kotlin.gradle.tasks.dependsOn
|
||||
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
|
||||
import org.jetbrains.kotlin.gradle.utils.*
|
||||
import org.jetbrains.kotlin.gradle.utils.future
|
||||
import org.jetbrains.kotlin.gradle.utils.getOrCreate
|
||||
import org.jetbrains.kotlin.gradle.utils.konanDistribution
|
||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||
import org.jetbrains.kotlin.gradle.utils.mapToFile
|
||||
|
||||
fun Project.registerSwiftExportTask(
|
||||
framework: Framework,
|
||||
): TaskProvider<*> {
|
||||
return registerSwiftExportTask(
|
||||
swiftApiModuleName = framework.baseNameProvider,
|
||||
target = framework.target,
|
||||
buildType = framework.buildType,
|
||||
)
|
||||
}
|
||||
|
||||
private fun Project.registerSwiftExportTask(
|
||||
swiftApiModuleName: Provider<String>,
|
||||
target: KotlinNativeTarget,
|
||||
buildType: NativeBuildType,
|
||||
): TaskProvider<*> {
|
||||
val taskNamePrefix = lowerCamelCaseName(
|
||||
target.disambiguationClassifier ?: target.name,
|
||||
buildType.getName(),
|
||||
)
|
||||
val mainCompilation = target.compilations.getByName("main")
|
||||
|
||||
val swiftExportTask = registerSwiftExportRun(
|
||||
swiftApiModuleName = swiftApiModuleName,
|
||||
taskNamePrefix = taskNamePrefix,
|
||||
mainCompilation = mainCompilation,
|
||||
)
|
||||
val staticLibrary = registerSwiftExportCompilationAndGetBinary(
|
||||
buildType = buildType,
|
||||
compilations = target.compilations,
|
||||
binaries = target.binaries,
|
||||
mainCompilation = mainCompilation,
|
||||
swiftExportTask = swiftExportTask,
|
||||
)
|
||||
|
||||
val kotlinStaticLibraryName = staticLibrary.linkTaskProvider.flatMap { it.binary.baseNameProvider }
|
||||
val swiftApiLibraryName = swiftApiModuleName.map { it + "Library" }
|
||||
|
||||
val syntheticBuildRoot = layout.buildDirectory.dir("${taskNamePrefix}SPMPackage")
|
||||
val packageGenerationTask = registerPackageGeneration(
|
||||
taskNamePrefix = taskNamePrefix,
|
||||
swiftApiModuleName = swiftApiModuleName,
|
||||
swiftApiLibraryName = swiftApiLibraryName,
|
||||
kotlinStaticLibraryName = kotlinStaticLibraryName,
|
||||
swiftExportTask = swiftExportTask,
|
||||
staticLibrary = staticLibrary,
|
||||
syntheticBuildRoot = syntheticBuildRoot,
|
||||
)
|
||||
val syntheticProjectBuild = registerSyntheticProjectBuild(
|
||||
taskNamePrefix = taskNamePrefix,
|
||||
swiftApiModuleName = swiftApiModuleName,
|
||||
swiftApiLibraryName = swiftApiLibraryName,
|
||||
syntheticBuildRoot = syntheticBuildRoot,
|
||||
packageGenerationTask = packageGenerationTask,
|
||||
)
|
||||
|
||||
return registerCopyTask(
|
||||
taskNamePrefix = taskNamePrefix,
|
||||
staticLibrary = staticLibrary,
|
||||
packageGenerationTask = packageGenerationTask,
|
||||
syntheticProjectBuild = syntheticProjectBuild,
|
||||
)
|
||||
}
|
||||
|
||||
private fun Project.registerSwiftExportRun(
|
||||
swiftApiModuleName: Provider<String>,
|
||||
taskNamePrefix: String,
|
||||
mainCompilation: KotlinCompilation<*>,
|
||||
): TaskProvider<SwiftExportTask> {
|
||||
val swiftExportTaskName = taskNamePrefix + "SwiftExport"
|
||||
return locateOrRegisterTask<SwiftExportTask>(swiftExportTaskName) { task ->
|
||||
val directoryProvider = project.future {
|
||||
kotlinPluginLifecycle.await(KotlinPluginLifecycle.Stage.AfterFinaliseRefinesEdges)
|
||||
mainCompilation.allKotlinSourceSets.flatMap {
|
||||
it.kotlin.srcDirs
|
||||
}
|
||||
}
|
||||
|
||||
val outputs = layout.buildDirectory.dir(swiftExportTaskName)
|
||||
val swiftIntermediates = outputs.map { it.dir("swiftIntermediates") }
|
||||
val kotlinIntermediates = outputs.map { it.dir("kotlinIntermediates") }
|
||||
|
||||
// Input
|
||||
task.sourceRoots.from(project.files(directoryProvider.getOrThrow()))
|
||||
task.bridgeModuleName.set(swiftApiModuleName.map { "${it}Bridge" })
|
||||
task.debugMode.set(true)
|
||||
task.konanDistribution.set(konanDistribution.root)
|
||||
|
||||
// Output
|
||||
task.swiftApiPath.set(swiftIntermediates.map { it.file("KotlinAPI.swift") })
|
||||
task.headerBridgePath.set(swiftIntermediates.map { it.file("KotlinBridge.h") })
|
||||
task.kotlinBridgePath.set(kotlinIntermediates.map { it.file("KotlinBridge.kt") })
|
||||
}
|
||||
}
|
||||
|
||||
private fun registerSwiftExportCompilationAndGetBinary(
|
||||
buildType: NativeBuildType,
|
||||
compilations: NamedDomainObjectContainer<KotlinNativeCompilation>,
|
||||
binaries: KotlinNativeBinaryContainer,
|
||||
mainCompilation: KotlinCompilation<*>,
|
||||
swiftExportTask: TaskProvider<SwiftExportTask>,
|
||||
): StaticLibrary {
|
||||
val swiftExportCompilationName = "swiftExportMain"
|
||||
val swiftExportBinary = "swiftExportBinary"
|
||||
|
||||
compilations.getOrCreate(
|
||||
swiftExportCompilationName,
|
||||
invokeWhenCreated = { swiftExportCompilation ->
|
||||
swiftExportCompilation.associateWith(mainCompilation)
|
||||
swiftExportCompilation.defaultSourceSet.kotlin.srcDir(swiftExportTask.map { it.kotlinBridgePath.getFile().parent })
|
||||
swiftExportCompilation.compileTaskProvider.configure {
|
||||
it.compilerOptions.optIn.add("kotlin.experimental.ExperimentalNativeApi")
|
||||
}
|
||||
|
||||
binaries.staticLib(swiftExportBinary) { staticLib ->
|
||||
staticLib.compilation = swiftExportCompilation
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
return binaries.getStaticLib(
|
||||
swiftExportBinary,
|
||||
buildType
|
||||
)
|
||||
}
|
||||
|
||||
private fun Project.registerPackageGeneration(
|
||||
taskNamePrefix: String,
|
||||
swiftApiModuleName: Provider<String>,
|
||||
swiftApiLibraryName: Provider<String>,
|
||||
kotlinStaticLibraryName: Provider<String>,
|
||||
swiftExportTask: TaskProvider<SwiftExportTask>,
|
||||
staticLibrary: StaticLibrary,
|
||||
syntheticBuildRoot: Provider<Directory>,
|
||||
): TaskProvider<GenerateSPMPackageFromSwiftExport> {
|
||||
val spmPackageGenTaskName = taskNamePrefix + "GenerateSPMPackage"
|
||||
val packageGenerationTask = locateOrRegisterTask<GenerateSPMPackageFromSwiftExport>(spmPackageGenTaskName) { task ->
|
||||
task.group = BasePlugin.BUILD_GROUP
|
||||
task.description = "Generates $taskNamePrefix SPM Package"
|
||||
|
||||
// Input
|
||||
task.swiftApiPath.set(swiftExportTask.flatMap { it.swiftApiPath })
|
||||
task.headerBridgePath.set(swiftExportTask.flatMap { it.headerBridgePath })
|
||||
task.headerBridgeModuleName.set(swiftExportTask.flatMap { it.bridgeModuleName })
|
||||
task.libraryPath.set { staticLibrary.linkTaskProvider.flatMap { it.outputFile }.get() }
|
||||
task.swiftLibraryName.set(swiftApiLibraryName)
|
||||
task.kotlinLibraryName.set(kotlinStaticLibraryName)
|
||||
task.swiftApiModuleName.set(swiftApiModuleName)
|
||||
|
||||
// Output
|
||||
task.packagePath.set(syntheticBuildRoot.flatMap { root ->
|
||||
swiftApiModuleName.map { root.dir(it) }
|
||||
})
|
||||
}
|
||||
|
||||
packageGenerationTask.dependsOn(staticLibrary.linkTaskProvider)
|
||||
return packageGenerationTask
|
||||
}
|
||||
|
||||
private fun Project.registerSyntheticProjectBuild(
|
||||
taskNamePrefix: String,
|
||||
swiftApiModuleName: Provider<String>,
|
||||
swiftApiLibraryName: Provider<String>,
|
||||
syntheticBuildRoot: Provider<Directory>,
|
||||
packageGenerationTask: TaskProvider<*>,
|
||||
): TaskProvider<BuildSyntheticProjectWithSwiftExportPackage> {
|
||||
val buildTaskName = taskNamePrefix + "BuildSyntheticProject"
|
||||
val syntheticProjectBuild = locateOrRegisterTask<BuildSyntheticProjectWithSwiftExportPackage>(buildTaskName) { task ->
|
||||
task.group = BasePlugin.BUILD_GROUP
|
||||
task.description = "Builds $taskNamePrefix synthetic project"
|
||||
task.swiftApiModuleName.set(swiftApiModuleName)
|
||||
task.swiftLibraryName.set(swiftApiLibraryName)
|
||||
task.syntheticProjectDirectory.set(syntheticBuildRoot)
|
||||
}
|
||||
syntheticProjectBuild.dependsOn(packageGenerationTask)
|
||||
return syntheticProjectBuild
|
||||
}
|
||||
|
||||
private fun Project.registerCopyTask(
|
||||
taskNamePrefix: String,
|
||||
staticLibrary: StaticLibrary,
|
||||
packageGenerationTask: TaskProvider<GenerateSPMPackageFromSwiftExport>,
|
||||
syntheticProjectBuild: TaskProvider<BuildSyntheticProjectWithSwiftExportPackage>,
|
||||
): TaskProvider<*> {
|
||||
val copyTaskName = taskNamePrefix + "CopySyntheticProjectIntermediates"
|
||||
val copyTask = locateOrRegisterTask<CopySwiftExportIntermediatesForConsumer>(copyTaskName) { task ->
|
||||
task.group = BasePlugin.BUILD_GROUP
|
||||
task.description = "Copy $taskNamePrefix synthetic project intermediates"
|
||||
task.includeBridgeDirectory.convention(layout.file(packageGenerationTask.map { it.headerBridgeIncludePath }))
|
||||
task.kotlinLibraryPath.convention(layout.file(staticLibrary.linkTaskProvider.flatMap { it.outputFile }))
|
||||
task.syntheticLibraryPath.convention(layout.file(syntheticProjectBuild.flatMap { it.syntheticLibraryPath.mapToFile() }))
|
||||
task.syntheticInterfacesPath.convention(layout.file(syntheticProjectBuild.flatMap { it.syntheticInterfacesPath.mapToFile() }))
|
||||
}
|
||||
copyTask.dependsOn(syntheticProjectBuild)
|
||||
return copyTask
|
||||
}
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport
|
||||
|
||||
import org.gradle.api.DefaultTask
|
||||
import org.gradle.api.file.ConfigurableFileCollection
|
||||
import org.gradle.api.file.DirectoryProperty
|
||||
import org.gradle.api.file.RegularFileProperty
|
||||
import org.gradle.api.provider.Property
|
||||
import org.gradle.api.tasks.*
|
||||
import org.gradle.work.DisableCachingByDefault
|
||||
import org.jetbrains.kotlin.gradle.internal.LogType
|
||||
import org.jetbrains.kotlin.gradle.internal.processLogMessage
|
||||
import org.jetbrains.kotlin.gradle.utils.getFile
|
||||
import org.jetbrains.kotlin.konan.target.Distribution
|
||||
import org.jetbrains.kotlin.swiftexport.standalone.*
|
||||
|
||||
@DisableCachingByDefault(because = "Swift Export is experimental, so no caching for now")
|
||||
abstract class SwiftExportTask : DefaultTask(), SwiftExportLogger {
|
||||
|
||||
@get:Input
|
||||
abstract val bridgeModuleName: Property<String>
|
||||
|
||||
@get:Input
|
||||
abstract val debugMode: Property<Boolean>
|
||||
|
||||
@get:InputDirectory
|
||||
@get:PathSensitive(PathSensitivity.ABSOLUTE)
|
||||
abstract val konanDistribution: DirectoryProperty
|
||||
|
||||
@get:InputFiles
|
||||
@get:PathSensitive(PathSensitivity.RELATIVE)
|
||||
abstract val sourceRoots: ConfigurableFileCollection
|
||||
|
||||
@get:OutputFile
|
||||
abstract val swiftApiPath: RegularFileProperty
|
||||
|
||||
@get:OutputFile
|
||||
abstract val headerBridgePath: RegularFileProperty
|
||||
|
||||
@get:OutputFile
|
||||
abstract val kotlinBridgePath: RegularFileProperty
|
||||
|
||||
@TaskAction
|
||||
fun run() {
|
||||
runSwiftExport(
|
||||
input = SwiftExportInput(
|
||||
sourceRoot = sourceRoots.filter { it.exists() }.map { it.toPath() }.first()
|
||||
),
|
||||
config = SwiftExportConfig(
|
||||
settings = mapOf(
|
||||
SwiftExportConfig.DEBUG_MODE_ENABLED to debugMode.getOrElse(false).toString(),
|
||||
SwiftExportConfig.BRIDGE_MODULE_NAME to bridgeModuleName.getOrElse(SwiftExportConfig.DEFAULT_BRIDGE_MODULE_NAME),
|
||||
),
|
||||
this,
|
||||
distribution = Distribution(konanDistribution.getFile().absolutePath),
|
||||
),
|
||||
output = SwiftExportOutput(
|
||||
swiftApi = swiftApiPath.get().asFile.toPath(),
|
||||
kotlinBridges = kotlinBridgePath.get().asFile.toPath(),
|
||||
cHeaderBridges = headerBridgePath.get().asFile.toPath(),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
override fun report(severity: SwiftExportLogger.Severity, message: String) {
|
||||
logger.processLogMessage(message, severity.logType())
|
||||
}
|
||||
}
|
||||
|
||||
private fun SwiftExportLogger.Severity.logType(): LogType = when (this) {
|
||||
SwiftExportLogger.Severity.Info -> LogType.INFO
|
||||
SwiftExportLogger.Severity.Warning -> LogType.WARN
|
||||
SwiftExportLogger.Severity.Error -> LogType.ERROR
|
||||
else -> LogType.LOG
|
||||
}
|
||||
+5
-1
@@ -31,6 +31,10 @@ import org.jetbrains.kotlin.gradle.targets.native.CreateFatFrameworksSetupAction
|
||||
import org.jetbrains.kotlin.gradle.targets.native.KotlinNativeConfigureBinariesSideEffect
|
||||
import org.jetbrains.kotlin.gradle.targets.native.SetupEmbedAndSignAppleFrameworkTaskSideEffect
|
||||
import org.jetbrains.kotlin.gradle.targets.native.internal.*
|
||||
import org.jetbrains.kotlin.gradle.targets.native.internal.AddKotlinPlatformIntegersSupportLibrary
|
||||
import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizedCInteropApiElementsConfigurationsSetupAction
|
||||
import org.jetbrains.kotlin.gradle.targets.native.internal.SetupCInteropApiElementsConfigurationSideEffect
|
||||
import org.jetbrains.kotlin.gradle.targets.native.internal.SetupKotlinNativePlatformDependenciesForLegacyImport
|
||||
import org.jetbrains.kotlin.gradle.targets.native.tasks.artifact.KotlinArtifactsExtensionSetupAction
|
||||
import org.jetbrains.kotlin.gradle.tooling.RegisterBuildKotlinToolingMetadataTask
|
||||
|
||||
@@ -148,4 +152,4 @@ private val Project.isJvm get() = kotlinJvmExtensionOrNull != null
|
||||
|
||||
private val Project.isJs get() = kotlinExtensionOrNull is KotlinJsProjectExtension
|
||||
|
||||
private val Project.isAndroid get() = kotlinExtension is KotlinAndroidProjectExtension
|
||||
private val Project.isAndroid get() = kotlinExtension is KotlinAndroidProjectExtension
|
||||
|
||||
@@ -0,0 +1,907 @@
|
||||
// !$*UTF8*$!
|
||||
{
|
||||
archiveVersion = 1;
|
||||
classes = {
|
||||
};
|
||||
objectVersion = 56;
|
||||
objects = {
|
||||
|
||||
/* Begin PBXCopyFilesBuildPhase section */
|
||||
05F2823A27BFF52F00A213D9 /* Embed App Extensions */ = {
|
||||
isa = PBXCopyFilesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
dstPath = "";
|
||||
dstSubfolderSpec = 13;
|
||||
files = (
|
||||
);
|
||||
name = "Embed App Extensions";
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
05F281E327BFA36E00A213D9 /* ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "ios.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
05F2820027BFF4EB00A213D9 /* macos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "macos.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
05F2821827BFF52C00A213D9 /* watchos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "watchos.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
05F2824827BFF63B00A213D9 /* tvos.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "tvos.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
05F2824827BFF73B00A213D9 /* <SwiftExportModuleName> */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = <SwiftExportModuleName>; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
05F281E027BFA36E00A213D9 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
05F2825A27BFF65D00A213D9
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
05F281FD27BFF4EB00A213D9 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
05F2825A27BFF65D00A213D9
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
05F2824527BFF63B00A213D9 /* Frameworks */ = {
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
05F2825A27BFF65D00A213D9
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
05F281BA27BFA02500A213D9 = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
05F2824827BFF73B00A213D9 /* <SwiftExportModuleName> */,
|
||||
05F281C627BFA08C00A213D9 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
05F281C627BFA08C00A213D9 /* Products */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
05F281E327BFA36E00A213D9 /* ios.app */,
|
||||
05F2820027BFF4EB00A213D9 /* macos.app */,
|
||||
05F2821827BFF52C00A213D9 /* watchos.app */,
|
||||
05F2824827BFF63B00A213D9 /* tvos.app */,
|
||||
);
|
||||
name = Products;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
|
||||
/* Begin PBXNativeTarget section */
|
||||
05F281E227BFA36E00A213D9 /* ios */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 05F281F927BFA37000A213D9 /* Build configuration list for PBXNativeTarget "ios" */;
|
||||
buildPhases = (
|
||||
05F281DF27BFA36E00A213D9 /* Sources */,
|
||||
05F281E027BFA36E00A213D9 /* Frameworks */,
|
||||
05F281E127BFA36E00A213D9 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "ios";
|
||||
packageProductDependencies = (
|
||||
05F2825A27BFF64D00A213D9 /* <SwiftExportModuleName> */,
|
||||
);
|
||||
productName = "ios";
|
||||
productReference = 05F281E327BFA36E00A213D9 /* ios.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
05F281FF27BFF4EB00A213D9 /* macos */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 05F2821027BFF4ED00A213D9 /* Build configuration list for PBXNativeTarget "macos" */;
|
||||
buildPhases = (
|
||||
05F281FC27BFF4EB00A213D9 /* Sources */,
|
||||
05F281FD27BFF4EB00A213D9 /* Frameworks */,
|
||||
05F281FE27BFF4EB00A213D9 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "macos";
|
||||
productName = "macos-app";
|
||||
productReference = 05F2820027BFF4EB00A213D9 /* macos.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
05F2821727BFF52B00A213D9 /* watchos */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 05F2823B27BFF52F00A213D9 /* Build configuration list for PBXNativeTarget "watchos" */;
|
||||
buildPhases = (
|
||||
05F2821627BFF52B00A213D9 /* Resources */,
|
||||
05F2823A27BFF52F00A213D9 /* Embed App Extensions */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "watchos";
|
||||
productName = "watchos";
|
||||
productReference = 05F2821827BFF52C00A213D9 /* watchos.app */;
|
||||
productType = "com.apple.product-type.application.watchapp2";
|
||||
};
|
||||
05F2824727BFF63B00A213D9 /* tvos */ = {
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 05F2825A27BFF63D00A213D9 /* Build configuration list for PBXNativeTarget "tvos" */;
|
||||
buildPhases = (
|
||||
05F2824427BFF63B00A213D9 /* Sources */,
|
||||
05F2824527BFF63B00A213D9 /* Frameworks */,
|
||||
05F2824627BFF63B00A213D9 /* Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
dependencies = (
|
||||
);
|
||||
name = "tvos";
|
||||
productName = "tvos";
|
||||
productReference = 05F2824827BFF63B00A213D9 /* tvos.app */;
|
||||
productType = "com.apple.product-type.application";
|
||||
};
|
||||
/* End PBXNativeTarget section */
|
||||
|
||||
/* Begin PBXProject section */
|
||||
05F281BB27BFA02500A213D9 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = 1;
|
||||
LastUpgradeCheck = 1320;
|
||||
TargetAttributes = {
|
||||
05F281E227BFA36E00A213D9 = {
|
||||
CreatedOnToolsVersion = 15.0;
|
||||
};
|
||||
05F281FF27BFF4EB00A213D9 = {
|
||||
CreatedOnToolsVersion = 15.0;
|
||||
};
|
||||
05F2821727BFF52B00A213D9 = {
|
||||
CreatedOnToolsVersion = 15.0;
|
||||
};
|
||||
05F2824727BFF63B00A213D9 = {
|
||||
CreatedOnToolsVersion = 15.0;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = 05F281BE27BFA02500A213D9 /* Build configuration list for PBXProject "<SwiftExportModuleName>" */;
|
||||
compatibilityVersion = "Xcode 15.0";
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 05F281BA27BFA02500A213D9;
|
||||
productRefGroup = 05F281C627BFA08C00A213D9 /* Products */;
|
||||
projectDirPath = "";
|
||||
projectRoot = "";
|
||||
targets = (
|
||||
05F281E227BFA36E00A213D9 /* ios */,
|
||||
05F281FF27BFF4EB00A213D9 /* macos */,
|
||||
05F2821727BFF52B00A213D9 /* watchos */,
|
||||
05F2824727BFF63B00A213D9 /* tvos */,
|
||||
);
|
||||
};
|
||||
/* End PBXProject section */
|
||||
|
||||
/* Begin PBXResourcesBuildPhase section */
|
||||
05F281E127BFA36E00A213D9 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
05F281FE27BFF4EB00A213D9 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
05F2821627BFF52B00A213D9 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
05F2824627BFF63B00A213D9 /* Resources */ = {
|
||||
isa = PBXResourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
05F281DF27BFA36E00A213D9 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
05F281FC27BFF4EB00A213D9 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
05F2824427BFF63B00A213D9 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin XCBuildConfiguration section */
|
||||
05F281BF27BFA02500A213D9 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
05F281C027BFA02500A213D9 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
05F281FA27BFA37000A213D9 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "";
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
||||
INFOPLIST_KEY_UIMainStoryboardFile = Main;
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.ios";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
05F281FB27BFA37000A213D9 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_FILE = "";
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
||||
INFOPLIST_KEY_UIMainStoryboardFile = Main;
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 15.2;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.ios";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = iphoneos;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
TARGETED_DEVICE_FAMILY = "1,2";
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
05F2821127BFF4ED00A213D9 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "macos-app/macos_app.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||
INFOPLIST_KEY_NSMainStoryboardFile = Main;
|
||||
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.1;
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.macos-app";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = macosx;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
05F2821227BFF4ED00A213D9 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_ENTITLEMENTS = "macos-app/macos_app.entitlements";
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COMBINE_HIDPI_IMAGES = YES;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_NSHumanReadableCopyright = "";
|
||||
INFOPLIST_KEY_NSMainStoryboardFile = Main;
|
||||
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/../Frameworks",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 12.1;
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.macos-app";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = macosx;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
05F2823C27BFF52F00A213D9 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IBSC_MODULE = watchos_target_WatchKit_Extension;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "watchos";
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.watchos.watchkitapp";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 8.3;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
05F2823D27BFF52F00A213D9 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
IBSC_MODULE = watchos_target_WatchKit_Extension;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = "watchos";
|
||||
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.watchos.watchkitapp";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 8.3;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
05F2825B27BFF63D00A213D9 /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
ENABLE_TESTABILITY = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_DYNAMIC_NO_PIC = NO;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
||||
INFOPLIST_KEY_UIMainStoryboardFile = Main;
|
||||
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||
MTL_FAST_MATH = YES;
|
||||
ONLY_ACTIVE_ARCH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.tvos";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = appletvos;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
TARGETED_DEVICE_FAMILY = 3;
|
||||
TVOS_DEPLOYMENT_TARGET = 15.2;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
05F2825C27BFF63D00A213D9 /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = "App Icon & Top Shelf Image";
|
||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
CLANG_ENABLE_OBJC_ARC = YES;
|
||||
CLANG_ENABLE_OBJC_WEAK = YES;
|
||||
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
|
||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||
CLANG_WARN_COMMA = YES;
|
||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
|
||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
|
||||
CLANG_WARN_EMPTY_BODY = YES;
|
||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||
CLANG_WARN_INT_CONVERSION = YES;
|
||||
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
|
||||
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
|
||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
||||
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
|
||||
CLANG_WARN_STRICT_PROTOTYPES = YES;
|
||||
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
|
||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||
CODE_SIGN_STYLE = Automatic;
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 1;
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
ENABLE_NS_ASSERTIONS = NO;
|
||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||
GCC_C_LANGUAGE_STANDARD = gnu11;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
|
||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
GENERATE_INFOPLIST_FILE = YES;
|
||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
||||
INFOPLIST_KEY_UIMainStoryboardFile = Main;
|
||||
INFOPLIST_KEY_UIUserInterfaceStyle = Automatic;
|
||||
LD_RUNPATH_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"@executable_path/Frameworks",
|
||||
);
|
||||
MARKETING_VERSION = 1.0;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
MTL_FAST_MATH = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.dummy.tvos";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = appletvos;
|
||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||
TARGETED_DEVICE_FAMILY = 3;
|
||||
TVOS_DEPLOYMENT_TARGET = 15.2;
|
||||
VALIDATE_PRODUCT = YES;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
/* End XCBuildConfiguration section */
|
||||
|
||||
/* Begin XCConfigurationList section */
|
||||
05F281BE27BFA02500A213D9 /* Build configuration list for PBXProject "<SwiftExportModuleName>" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
05F281BF27BFA02500A213D9 /* Debug */,
|
||||
05F281C027BFA02500A213D9 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
05F281F927BFA37000A213D9 /* Build configuration list for PBXNativeTarget "ios" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
05F281FA27BFA37000A213D9 /* Debug */,
|
||||
05F281FB27BFA37000A213D9 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
05F2821027BFF4ED00A213D9 /* Build configuration list for PBXNativeTarget "macos" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
05F2821127BFF4ED00A213D9 /* Debug */,
|
||||
05F2821227BFF4ED00A213D9 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
05F2823B27BFF52F00A213D9 /* Build configuration list for PBXNativeTarget "watchos" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
05F2823C27BFF52F00A213D9 /* Debug */,
|
||||
05F2823D27BFF52F00A213D9 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
05F2825A27BFF63D00A213D9 /* Build configuration list for PBXNativeTarget "tvos" */ = {
|
||||
isa = XCConfigurationList;
|
||||
buildConfigurations = (
|
||||
05F2825B27BFF63D00A213D9 /* Debug */,
|
||||
05F2825C27BFF63D00A213D9 /* Release */,
|
||||
);
|
||||
defaultConfigurationIsVisible = 0;
|
||||
defaultConfigurationName = Release;
|
||||
};
|
||||
/* End XCConfigurationList section */
|
||||
|
||||
/* Begin XCSwiftPackageProductDependency section */
|
||||
05F2825A27BFF64D00A213D9 /* LocalLibrary */ = {
|
||||
isa = XCSwiftPackageProductDependency;
|
||||
productName = <SwiftExportModuleName>Library;
|
||||
};
|
||||
/* End XCSwiftPackageProductDependency section */
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
05F2825A27BFF65D00A213D9 /* LocalLibrary in Frameworks */ = {isa = PBXBuildFile; productRef = 05F2825A27BFF64D00A213D9 /* LocalLibrary */; };
|
||||
/* End PBXBuildFile section */
|
||||
};
|
||||
rootObject = 05F281BB27BFA02500A213D9 /* Project object */;
|
||||
}
|
||||
Reference in New Issue
Block a user