From cdd3185920362445e93fda5822ad30a2cecd2833 Mon Sep 17 00:00:00 2001 From: Alexander Gorshenev Date: Wed, 29 Nov 2017 19:37:08 +0300 Subject: [PATCH] Instead of execClang we now have execKonanClang which properly invokes the distribution clang able to utilize distributed sysroots etc. And execBareClang which just invokes the distribution clang with system sysroot. --- backend.native/tests/build.gradle | 2 +- .../jetbrains/kotlin/CompileToBitcode.groovy | 8 +-- .../org/jetbrains/kotlin/ExecClang.groovy | 49 +++++++++++++++++-- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/backend.native/tests/build.gradle b/backend.native/tests/build.gradle index 66898e1cf05..eaa86e9e5e5 100644 --- a/backend.native/tests/build.gradle +++ b/backend.native/tests/build.gradle @@ -2286,7 +2286,7 @@ if (isMac()) { interop = 'objcSmoke' doFirst { - execClang { + execKonanClang(project.testTarget) { args "$projectDir/interop/objc/smoke.m" args "-lobjc", '-fobjc-arc' args '-fPIC', '-shared', '-o', "$buildDir/libobjcsmoke.dylib" diff --git a/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/CompileToBitcode.groovy b/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/CompileToBitcode.groovy index 6eb7f60875b..6ba41edf1b5 100644 --- a/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/CompileToBitcode.groovy +++ b/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/CompileToBitcode.groovy @@ -98,11 +98,6 @@ class CompileCppToBitcode extends DefaultTask { linkerArgs.addAll(args) } - List targetArgs(String target) { - def result = project.rootProject.targetClangArgs(KonanTarget.valueOf(target.toUpperCase())) - return result - } - @TaskAction void compile() { // the strange code below seems to be required due to some Gradle (Groovy?) behaviour @@ -113,12 +108,11 @@ class CompileCppToBitcode extends DefaultTask { File objDir = this.getObjDir() objDir.mkdirs() - project.execClang { + project.execKonanClang(this.target) { workingDir objDir executable "clang++" args '-std=c++11' - args targetArgs(this.target) args compilerArgs args "-I$headersDir" diff --git a/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/ExecClang.groovy b/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/ExecClang.groovy index 784937706d0..bd4466a131f 100644 --- a/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/ExecClang.groovy +++ b/buildSrc/plugins/src/main/groovy/org/jetbrains/kotlin/ExecClang.groovy @@ -22,6 +22,7 @@ import org.gradle.api.Project import org.gradle.process.ExecResult import org.gradle.process.ExecSpec import org.gradle.util.ConfigureUtil +import org.jetbrains.kotlin.konan.target.* class ExecClang { @@ -31,11 +32,52 @@ class ExecClang { this.project = project } - public ExecResult execClang(Closure closure) { - return this.execClang(ConfigureUtil.configureUsing(closure)); + private List konanArgs(KonanTarget target) { + return project.rootProject.targetClangArgs(target) } - public ExecResult execClang(Action action) { + private List konanArgs(String target) { + return konanArgs(new TargetManager(target).target) + } + + // The bare ones invoke clang with system default sysroot. + + public ExecResult execBareClang(Action action) { + return this.execClang([], action) + } + + public ExecResult execBareClang(Closure closure) { + return this.execClang([], closure) + } + + // The konan ones invoke clang with konan provided sysroots. + // So they require a target or assume it to be the host. + // The target can be specified as KonanTarget or as a + // (nullable, which means host) target name. + + public ExecResult execKonanClang(String target, Action action) { + return this.execClang(konanArgs(target), action) + } + + public ExecResult execKonanClang(KonanTarget target, Action action) { + return this.execClang(konanArgs(target), action) + } + + public ExecResult execKonanClang(String target, Closure closure) { + return this.execClang(konanArgs(target), closure) + } + + public ExecResult execKonanClang(KonanTarget target, Closure closure) { + return this.execClang(konanArgs(target), closure) + } + + // These ones are private, so one has to choose either Bare or Konan. + + private ExecResult execClang(List defaultArgs, Closure closure) { + return this.execClang(defaultArgs, ConfigureUtil.configureUsing(closure)) + } + + private ExecResult execClang(List defaultArgs, Action action) { Action extendedAction = new Action() { @Override void execute(ExecSpec execSpec) { @@ -55,6 +97,7 @@ class ExecClang { environment["PATH"] = project.files(project.hostClang.hostClangPath).asPath + File.pathSeparator + environment["PATH"] + args defaultArgs } } }