diff --git a/kotlin-native/backend.native/tests/build.gradle b/kotlin-native/backend.native/tests/build.gradle index 66e3dac0170..617d0d5e06b 100644 --- a/kotlin-native/backend.native/tests/build.gradle +++ b/kotlin-native/backend.native/tests/build.gradle @@ -4214,7 +4214,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/smoke.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcsmoke.dylib" @@ -4240,7 +4240,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args fileTree("$projectDir/interop/objc/tests/") { include '**/*.m' } args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjctests.dylib" @@ -4260,7 +4260,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args "$projectDir/interop/objc_with_initializer/objc_misc.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcmisc.dylib" @@ -4277,7 +4277,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/msg_send/messaging.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcmessaging.dylib" @@ -4295,7 +4295,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/foreignException/objc_wrap.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcexception.dylib" @@ -4314,7 +4314,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/foreignException/objc_wrap.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcexception.dylib" @@ -4333,7 +4333,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/foreignException/objc_wrap.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcexception.dylib" @@ -4372,7 +4372,7 @@ if (PlatformInfo.isAppleTarget(project)) { doBeforeBuild { mkdir(buildDir) - execKonanClang(project.target) { + execClangForCompilerTests(project.target) { args "$projectDir/interop/objc/kt42172/objclib.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjc_kt42172.dylib" diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompilationDatabase.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompilationDatabase.kt index bc789441020..b4dddca6e9f 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompilationDatabase.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/CompilationDatabase.kt @@ -65,7 +65,7 @@ open class GenerateCompilationDatabase @Inject constructor(@Input val target: St fun run() { val plugin = project.convention.getPlugin(ExecClang::class.java) val executable = plugin.resolveExecutable(executable) - val args = listOf(executable) + compilerFlags + plugin.konanArgs(target) + val args = listOf(executable) + compilerFlags + plugin.clangArgsForCppRuntime(target) val entries: List = files.map { Entry.create(srcRoot, it, args, outputDir) } Entry.writeListTo(outputFile, entries) } diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt index 8370c072ec0..6bed369b1d4 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/ExecClang.kt @@ -30,13 +30,13 @@ class ExecClang(private val project: Project) { private val platformManager = project.project(":kotlin-native").findProperty("platformManager") as PlatformManager - private fun konanArgs(target: KonanTarget): List { + private fun clangArgsForCppRuntime(target: KonanTarget): List { return platformManager.platform(target).clang.clangArgsForKonanSources.asList() } - fun konanArgs(targetName: String?): List { + fun clangArgsForCppRuntime(targetName: String?): List { val target = platformManager.targetManager(targetName).target - return konanArgs(target) + return clangArgsForCppRuntime(target) } fun resolveExecutable(executableOrNull: String?): String { @@ -82,21 +82,46 @@ class ExecClang(private val project: Project) { // (nullable, which means host) target name. fun execKonanClang(target: String?, action: Action): ExecResult { - return this.execClang(konanArgs(target), action) + return this.execClang(clangArgsForCppRuntime(target), action) } fun execKonanClang(target: KonanTarget, action: Action): ExecResult { - return this.execClang(konanArgs(target), action) + return this.execClang(clangArgsForCppRuntime(target), action) } fun execKonanClang(target: String?, closure: Closure): ExecResult { - return this.execClang(konanArgs(target), closure) + return this.execClang(clangArgsForCppRuntime(target), closure) } fun execKonanClang(target: KonanTarget, closure: Closure): ExecResult { - return this.execClang(konanArgs(target), closure) + return this.execClang(clangArgsForCppRuntime(target), closure) } + /** + * Execute Clang the way that produced object file is compatible with + * the one that produced by Kotlin/Native for given [target]. It means: + * 1. We pass flags that set sysroot. + * 2. We call Clang from toolchain in case of Apple target. + */ + fun execClangForCompilerTests(target: KonanTarget, action: Action): ExecResult { + val defaultArgs = platformManager.platform(target).clang.clangArgs + return project.exec(Action { + action.execute(this) + executable = if (target.family.isAppleFamily) { + resolveToolchainExecutable(target, executable) + } else { + resolveExecutable(executable) + } + args = defaultArgs + args + }) + } + + /** + * @see execClangForCompilerTests + */ + fun execClangForCompilerTests(target: KonanTarget, closure: Closure): ExecResult = + execClangForCompilerTests(target, ConfigureUtil.configureUsing(closure)) + // The toolchain ones execute clang from the toolchain. fun execToolchainClang(target: String?, action: Action): ExecResult { @@ -119,8 +144,6 @@ class ExecClang(private val project: Project) { return this.execToolchainClang(target, ConfigureUtil.configureUsing(closure)) } - // These ones are private, so one has to choose either Bare or Konan. - private fun execClang(defaultArgs: List, closure: Closure): ExecResult { return this.execClang(defaultArgs, ConfigureUtil.configureUsing(closure)) } diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt index ac8885fdd38..5952c5ce13e 100644 --- a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/Utils.kt @@ -376,11 +376,8 @@ fun Project.buildStaticLibrary(cSources: Collection, output: File, objDir: val platform = platformManager.platform(testTarget) objDir.mkdirs() - exec { - commandLine(platform.clang.clangC( - "-c", - *cSources.map { it.absolutePath }.toTypedArray() - )) + ExecClang(project).execClangForCompilerTests(testTarget) { + args = listOf("-c", *cSources.map { it.absolutePath }.toTypedArray()) workingDir(objDir) }