[Native][Tests] Make it possible to run LLVM Clang

Not all K/N targets have Clang in their toolchain. Thus,
we need to run the one from LLVM in our tests.
This commit is contained in:
Sergey Bogolepov
2023-12-08 13:53:10 +02:00
committed by Space Team
parent c165171471
commit 2ed84f6a11
3 changed files with 29 additions and 1 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.konan.test.blackbox.support.runner.TestRunCheck
import org.jetbrains.kotlin.konan.test.blackbox.support.runner.TestRunChecks
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.Timeouts
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.configurables
import org.jetbrains.kotlin.konan.test.blackbox.support.util.ClangDistribution
import org.jetbrains.kotlin.konan.test.blackbox.support.util.DEFAULT_MODULE_NAME
import org.jetbrains.kotlin.konan.test.blackbox.support.util.compileWithClang
import org.jetbrains.kotlin.konan.test.blackbox.support.util.getAbsoluteFile
@@ -68,6 +69,7 @@ abstract class AbstractNativeCExportTest(
val includeDirectories = binaryLibrary.headerFile?.let { listOf(it.parentFile) } ?: emptyList()
val libraryName = binaryLibrary.libraryFile.nameWithoutExtension.substringAfter("lib")
compileWithClang(
clangDistribution = ClangDistribution.LlvmDistribution,
sourceFiles = cSources,
includeDirectories = includeDirectories,
outputFile = executableFile,
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.konan.test.blackbox.support.settings.LLDB
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.PipelineType
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.Timeouts
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.configurables
import org.jetbrains.kotlin.konan.test.blackbox.support.util.ClangDistribution
import org.jetbrains.kotlin.konan.test.blackbox.support.util.LLDBSessionSpec
import org.jetbrains.kotlin.konan.test.blackbox.support.util.compileWithClang
import org.junit.jupiter.api.Assumptions
@@ -224,6 +225,9 @@ class ObjCToKotlinSteppingInLLDBTest : AbstractNativeSimpleTest() {
val executableFile = File(buildDir, clangExecutableName)
compileWithClang(
// This code was initially written against clang from toolchain.
// Changing it to another one probably won't hurt, but it was not tested.
clangDistribution = ClangDistribution.Toolchain,
sourceFiles = listOf(clangFile),
outputFile = executableFile,
frameworkDirectories = listOf(buildDir),
@@ -9,9 +9,27 @@ import org.jetbrains.kotlin.konan.test.blackbox.AbstractNativeSimpleTest
import org.jetbrains.kotlin.konan.test.blackbox.support.settings.configurables
import java.io.File
/**
* Specifies which Clang should be used for compilation.
*/
internal enum class ClangDistribution {
/**
* Use Clang from target's toolchain.
* Note that not all targets do have a toolchain with Clang.
* For example, Apple targets do (from Xcode), and GCC-based Linux targets do not.
*/
Toolchain,
/**
* Use Clang from Kotlin/Native LLVM distribution.
*/
LlvmDistribution
}
// FIXME: absoluteTargetToolchain might not work correctly with KONAN_USE_INTERNAL_SERVER because
// :kotlin-native:dependencies:update is not a dependency of :native:native.tests:test where this test runs
internal fun AbstractNativeSimpleTest.compileWithClang(
clangDistribution: ClangDistribution = ClangDistribution.LlvmDistribution,
sourceFiles: List<File>,
outputFile: File,
includeDirectories: List<File> = emptyList(),
@@ -20,8 +38,12 @@ internal fun AbstractNativeSimpleTest.compileWithClang(
libraries: List<String> = emptyList(),
additionalLinkerFlags: List<String> = emptyList(),
) {
val clang = when (clangDistribution) {
ClangDistribution.Toolchain -> "${testRunSettings.configurables.absoluteTargetToolchain}/bin/clang"
ClangDistribution.LlvmDistribution -> "${testRunSettings.configurables.absoluteLlvmHome}/bin/clang"
}
val process = ProcessBuilder(
"${testRunSettings.configurables.absoluteTargetToolchain}/bin/clang",
clang,
*sourceFiles.map { it.absolutePath }.toTypedArray(),
*includeDirectories.flatMap { listOf("-I", it.absolutePath) }.toTypedArray(),
"-isysroot", testRunSettings.configurables.absoluteTargetSysRoot,