Use toolchain clang for runtime tests on mac (#4632)

This commit is contained in:
Alexander Shabalin
2021-01-12 17:06:05 +03:00
committed by Nikolay Krasko
parent 3eb2ec5cc1
commit aed23ff098
2 changed files with 53 additions and 6 deletions
@@ -50,6 +50,22 @@ class ExecClang(private val project: Project) {
} }
} }
fun resolveToolchainExecutable(target: KonanTarget, executableOrNull: String?): String {
val executable = executableOrNull ?: "clang"
if (listOf("clang", "clang++").contains(executable)) {
// TODO: This is copied from `BitcodeCompiler`. Consider sharing the code instead.
val platform = platformManager.platform(target)
return if (target.family.isAppleFamily) {
"${platform.absoluteTargetToolchain}/usr/bin/$executable"
} else {
"${platform.absoluteTargetToolchain}/bin/$executable"
}
} else {
throw GradleException("unsupported clang executable: $executable")
}
}
// The bare ones invoke clang with system default sysroot. // The bare ones invoke clang with system default sysroot.
fun execBareClang(action: Action<in ExecSpec>): ExecResult { fun execBareClang(action: Action<in ExecSpec>): ExecResult {
@@ -81,6 +97,30 @@ class ExecClang(private val project: Project) {
return this.execClang(konanArgs(target), closure) return this.execClang(konanArgs(target), closure)
} }
// The toolchain ones execute clang from the toolchain.
fun execToolchainClang(target: String?, action: Action<in ExecSpec>): ExecResult {
return this.execToolchainClang(platformManager.targetManager(target).target, action)
}
fun execToolchainClang(target: String?, closure: Closure<in ExecSpec>): ExecResult {
return this.execToolchainClang(platformManager.targetManager(target).target, ConfigureUtil.configureUsing(closure))
}
fun execToolchainClang(target: KonanTarget, action: Action<in ExecSpec>): ExecResult {
val extendedAction = Action<ExecSpec> { execSpec ->
action.execute(execSpec)
execSpec.apply {
executable = resolveToolchainExecutable(target, executable)
}
}
return project.exec(extendedAction)
}
fun execToolchainClang(target: KonanTarget, closure: Closure<in ExecSpec>): ExecResult {
return this.execToolchainClang(target, ConfigureUtil.configureUsing(closure))
}
// These ones are private, so one has to choose either Bare or Konan. // These ones are private, so one has to choose either Bare or Konan.
private fun execClang(defaultArgs: List<String>, closure: Closure<in ExecSpec>): ExecResult { private fun execClang(defaultArgs: List<String>, closure: Closure<in ExecSpec>): ExecResult {
@@ -17,10 +17,10 @@ import org.jetbrains.kotlin.konan.target.*
open class CompileNativeTest @Inject constructor( open class CompileNativeTest @Inject constructor(
@InputFile val inputFile: File, @InputFile val inputFile: File,
@Input val target: String @Input val target: KonanTarget,
) : DefaultTask() { ) : DefaultTask() {
@OutputFile @OutputFile
var outputFile = project.buildDir.resolve("bin/test/$target/${inputFile.nameWithoutExtension}.o") var outputFile = project.buildDir.resolve("bin/test/${target.name}/${inputFile.nameWithoutExtension}.o")
@Input @Input
val clangArgs = mutableListOf<String>() val clangArgs = mutableListOf<String>()
@@ -28,9 +28,16 @@ open class CompileNativeTest @Inject constructor(
@TaskAction @TaskAction
fun compile() { fun compile() {
val plugin = project.convention.getPlugin(ExecClang::class.java) val plugin = project.convention.getPlugin(ExecClang::class.java)
plugin.execBareClang { if (target.family.isAppleFamily) {
it.executable = "clang++" plugin.execToolchainClang(target) {
it.args = clangArgs + listOf(inputFile.absolutePath, "-o", outputFile.absolutePath) it.executable = "clang++"
it.args = clangArgs + listOf(inputFile.absolutePath, "-o", outputFile.absolutePath)
}
} else {
plugin.execBareClang {
it.executable = "clang++"
it.args = clangArgs + listOf(inputFile.absolutePath, "-o", outputFile.absolutePath)
}
} }
} }
} }
@@ -218,7 +225,7 @@ fun createTestTask(
"${testTaskName}Compile", "${testTaskName}Compile",
CompileNativeTest::class.java, CompileNativeTest::class.java,
llvmLinkTask.outputFile, llvmLinkTask.outputFile,
target konanTarget,
).apply { ).apply {
dependsOn(llvmLinkTask) dependsOn(llvmLinkTask)
clangArgs.addAll(clangFlags.clangFlags) clangArgs.addAll(clangFlags.clangFlags)