From 4931b2f05b7dcedd27cd479beb631bd2e3e00252 Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Wed, 16 Aug 2017 17:05:29 +0700 Subject: [PATCH] build: Refactor dependencies updating --- backend.native/build.gradle | 2 - .../kotlin/backend/konan/Distribution.kt | 2 +- build.gradle | 12 +- .../org/jetbrains/kotlin/KonanTest.groovy | 2 + dependencies/build.gradle | 114 +++++++----------- .../kotlin/konan/target/KonanProperties.kt | 5 +- tools/helpers/build.gradle | 1 - 7 files changed, 57 insertions(+), 81 deletions(-) diff --git a/backend.native/build.gradle b/backend.native/build.gradle index a9c7e8c7362..d9d62faf92c 100644 --- a/backend.native/build.gradle +++ b/backend.native/build.gradle @@ -237,5 +237,3 @@ protobuf { artifact = "com.google.protobuf:protoc:${protobufVersion}" } } - - diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt index c1628ddb8ba..029a3c6c89a 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/Distribution.kt @@ -55,7 +55,7 @@ class Distribution(val targetManager: TargetManager, } else { KonanProperties(host, properties, dependenciesDir) } - val dependencies = targetProperties.hostTargetList("dependencies") + val dependencies = targetProperties.dependencies val llvmHome = hostProperties.absoluteLlvmHome val hostSysRoot = hostProperties.absoluteTargetSysRoot diff --git a/build.gradle b/build.gradle index 703f13cef99..70e1446e8f6 100644 --- a/build.gradle +++ b/build.gradle @@ -22,11 +22,11 @@ defaultTasks 'clean', 'dist' convention.plugins.platformInfo = new PlatformInfo() ext { - konanPropertiesFile = project(':backend.native').file('konan.properties') - konanProperties = PropertiesKt.loadProperties(konanPropertiesFile.absolutePath) + konanPropertiesFile = project(':backend.native').file('konan.properties') + konanProperties = PropertiesKt.loadProperties(konanPropertiesFile.absolutePath) - dependenciesDir = rootProject.file("dist/dependencies") - clangManager = new ClangManager(konanProperties, dependenciesDir.absolutePath) + dependenciesDir = rootProject.file("dist/dependencies") + clangManager = new ClangManager(konanProperties, dependenciesDir.absolutePath) } allprojects { @@ -74,7 +74,7 @@ void setupClang(Project project) { toolChains { gcc(Gcc) { - path "$mingwWithLlvmDir/bin" + path "$llvmDir/bin" } } } else { @@ -326,4 +326,4 @@ task clean { } delete bundle.outputs.files } -} +} \ No newline at end of file diff --git a/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy b/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy index c0a44db40e6..006a9711ce2 100644 --- a/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy +++ b/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/KonanTest.groovy @@ -100,6 +100,8 @@ abstract class KonanTest extends JavaExec { try { main = 'org.jetbrains.kotlin.cli.bc.K2NativeKt' classpath = project.configurations.cli_bc + // TODO: Remove helpers classpath when downloading is moved into 'shared' project. + classpath += project.project(":tools:helpers").sourceSets.main.runtimeClasspath enableAssertions = true args = ["-output", output, *filesToCompile, diff --git a/dependencies/build.gradle b/dependencies/build.gradle index 69d6e8a5cb7..e92939772e1 100644 --- a/dependencies/build.gradle +++ b/dependencies/build.gradle @@ -14,7 +14,8 @@ * limitations under the License. */ -import static DependencyTaskKind.* + +import groovy.transform.stc.ClosureParams import org.jetbrains.kotlin.konan.target.* import static org.jetbrains.kotlin.konan.target.KonanTarget.* import org.jetbrains.kotlin.konan.properties.KonanProperties @@ -185,86 +186,61 @@ class HelperNativeDep extends TgzNativeDep { } } -enum DependencyTaskKind { - LIBFFI("Libffi"), SYSROOT("Sysroot") +enum DependencyKind { + LLVM( "llvm", { it.llvmHome }, { "llvmDir" } ), + GCC_TOOLCHAIN( "gccToolchain", { it.gccToolchain }, { "gccToolchainDir" }), + SYSROOT( "sysroot", { it.targetSysRoot } ), + LIBFFI( "libffi", { it.libffiDir } ), + TARGET_TOOLCHAIN("targetToolchain", { it.targetToolchain } ) - DependencyTaskKind(String name) { + + DependencyKind(String name, + @ClosureParams(KonanProperties.class) Closure dirGetter, + @ClosureParams(KonanTarget.class) Closure propertyNameGetter = + {target -> "${target.userName}${name.capitalize()}Dir"}) { this.name = name + this.dirGetter = dirGetter + this.propertyNameGetter = propertyNameGetter + } + + private String name + private Closure dirGetter // KonanProperties -> String + private Closure propertyNameGetter // KonanTarget -> String + + String getDirectory(KonanProperties properties) { + return dirGetter(properties) + } + + String getPropertyName(KonanTarget target) { + return propertyNameGetter(target) } - String name = "" String toString() { return name } } -void dependencyTask(KonanTarget target, DependencyTaskKind kind) { - String dependencyBaseName - def properties = rootProject.ext.konanProperties - def dirs = new KonanProperties(target, properties, null) - switch (kind) { - case LIBFFI: - dependencyBaseName = dirs.libffiDir - break - case SYSROOT: - dependencyBaseName = dirs.targetSysRoot - break - } - if (dependencyBaseName == null) { - throw project.unsupportedPlatformException() +TargetManager.enabled.each { target -> + def konanProperties = new KonanProperties(target, + rootProject.ext.konanProperties, + rootProject.ext.dependenciesDir.canonicalPath + ) + + konanProperties.dependencies.each { dependency -> + task "${target.userName}-${dependency}"(type: HelperNativeDep) { + baseName = dependency + } } - task "${target.userName}${kind}"(type: HelperNativeDep) { - baseName = dependencyBaseName + DependencyKind.values().each { kind -> + def dir = kind.getDirectory(konanProperties) + if (dir != null) { + def path = rootProject.ext.dependenciesDir.toPath() + .resolve(dir).toFile() + .canonicalPath + rootProject.ext.set(kind.getPropertyName(target), path) + } } } -if (isLinux()) { - // The gcc toolchain contains the sysroot for linux platform. - task gccToolchain(type: HelperNativeDep) { - baseName = "target-gcc-toolchain-3-$hostSystem" - } - - dependencyTask(LINUX, LIBFFI) - dependencyTask(RASPBERRYPI, SYSROOT) - dependencyTask(RASPBERRYPI, LIBFFI) -} else if (isWindows()) { - task mingwWithLlvm(type: HelperNativeDep) { - baseName = "msys2-mingw-w64-x86_64-gcc-6.3.0-clang-llvm-3.9.1-$hostSystem" - } - - dependencyTask(MINGW, LIBFFI) -} else if (isMac()) { - dependencyTask(MACBOOK, SYSROOT) - dependencyTask(MACBOOK, LIBFFI) - dependencyTask(IPHONE, SYSROOT) - dependencyTask(IPHONE, LIBFFI) - dependencyTask(WASM32, SYSROOT) - // No FFI for webassembly. - - // TODO: re-enable when we known how to bring the simulator sysroot to dependencies. - // dependencyTask("iphoneSim", SYSROOT) -} else { - throw new Error("Unsupported host") -} - -if (isLinux() || isMac()) { - task llvm(type: HelperNativeDep) { - baseName = "clang-llvm-$llvmVersion-$hostSystem" - } - - dependencyTask(ANDROID_ARM32, SYSROOT) - dependencyTask(ANDROID_ARM32, LIBFFI) - dependencyTask(ANDROID_ARM64, SYSROOT) - dependencyTask(ANDROID_ARM64, LIBFFI) -} - task update(type: Copy) { dependsOn tasks.withType(NativeDep) } - -tasks.withType(TgzNativeDep) { - rootProject.ext.set("${name}Dir", outputDir.path) -} - -if (isWindows()) { - rootProject.ext.set("llvmDir", mingwWithLlvmDir) -} diff --git a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanProperties.kt b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanProperties.kt index a7e9d21f9b4..804d15af927 100644 --- a/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanProperties.kt +++ b/shared/src/main/kotlin/org/jetbrains/kotlin/konan/target/KonanProperties.kt @@ -50,8 +50,9 @@ class KonanProperties(val target: KonanTarget, val properties: Properties, val b val gccToolchain get() = targetString("gccToolchain") val targetArg get() = targetString("quadruple") val llvmHome get() = targetString("llvmHome") - // Notice: this one is host-target. - val targetToolchain get() = hostTargetString("targetToolchain") + // Notice: these ones are host-target. + val targetToolchain get() = hostTargetString("targetToolchain") + val dependencies get() = hostTargetList("dependencies") fun absolute(value: String?) = "${baseDir!!}/${value!!}" diff --git a/tools/helpers/build.gradle b/tools/helpers/build.gradle index f0b4294b055..568ba178dec 100644 --- a/tools/helpers/build.gradle +++ b/tools/helpers/build.gradle @@ -164,4 +164,3 @@ task testHelpers { dependsOn testCompilerHelper dependsOn testParallel } -