Raspberrypi2中的Kotlin编译器构建失败

时间:2016-01-08 09:42:20

标签: raspberry-pi2 kotlin jansi

我试图在Ubuntu Mate 15.10上的Raspberrypi2中构建kotlin编译器

执行ant -f update_dependencies.xml时,在构建过程中,错误发生在下方。

override-version:
 [echo] Requested URL https://teamcity.jetbrains.com/guestAuth/app/rest/builds/?locator=buildType:IntelliJMarkdownParser_Build,status:SUCCESS,tag:forKotlin,count:1
 [echo] Build Number: 3174 - Kotlin 1.0.0-beta-5160 Build Id: 662124
  [get] Getting: https://teamcity.jetbrains.com/guestAuth/app/rest/builds/id:662124/artifacts/content/markdown_jar/markdown.jar
  [get] To: /home/kyungkoo/Downloads/kotlin-build-1.0.0-beta-4584/dependencies/markdown.jar
  [get] Not modified - so not downloaded
 [exec] Exception in thread "main" java.lang.reflect.InvocationTargetException
 [exec]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 [exec]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 [exec]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 [exec]     at java.lang.reflect.Method.invoke(Method.java:497)
 [exec]     at org.jetbrains.kotlin.preloading.Preloader.run(Preloader.java:73)
 [exec]     at org.jetbrains.kotlin.preloading.Preloader.main(Preloader.java:35)
 [exec] Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path, /tmp/libjansi-32-2155791272664213050.so: /tmp/libjansi-32-2155791272664213050.so: cannot open shared object file: No such file or directory (Possible cause: can't load IA 32-bit .so on a ARM-bit platform)]
 [exec]     at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
 [exec]     at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
 [exec]     at org.fusesource.jansi.internal.CLibrary.<clinit>(CLibrary.java:37)
 [exec]     at org.jetbrains.kotlin.cli.common.messages.PlainTextMessageRenderer.<clinit>(PlainTextMessageRenderer.java:35)
 [exec]     at org.jetbrains.kotlin.cli.common.messages.MessageRenderer.<clinit>(MessageRenderer.java:29)
 [exec]     at org.jetbrains.kotlin.cli.common.CLICompiler.exec(CLICompiler.java:57)
 [exec]     at org.jetbrains.kotlin.cli.common.CLICompiler.doMainNoExit(CLICompiler.java:240)
 [exec]     at org.jetbrains.kotlin.cli.common.CLICompiler.doMain(CLICompiler.java:231)
 [exec]     at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler$Companion.main(K2JVMCompiler.kt:246)
 [exec]     at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.main(K2JVMCompiler.kt)
 [exec]     ... 6 more

我安装了libjansi-javalibjansi-native-java,但它不起作用。 有什么想法可以解决这个问题?

我将soruce代码更新为build-1.0.0-beta-5569并添加了<arg value="-Dkotlin.colors.enabled=false"/>,如下所示:

--- a/update_dependencies.xml
+++ b/update_dependencies.xml
@@ -368,6 +368,7 @@
     <macrodef name="build-protobuf-java-lite">
         <sequential>
             <exec executable="dependencies/bootstrap-compiler/Kotlin/kotlinc/bin/${kotlinc.executable.path}" failonerror="true">
+                <arg value="-Dkotlin.colors.enabled=false"/>
                 <arg value="-script"/>
                 <arg value="generators/infrastructure/build-protobuf-lite.kts"/>
                 <arg value="${basedir}/ideaSDK/lib/protobuf-2.5.0.jar"/>
@@ -419,6 +420,7 @@
                 <delete dir="${markdown.dir}" failonerror="false"/>
                 <unzip src="dependencies/download/markdown-sources.zip" dest="dependencies"/>
                 <exec executable="dependencies/bootstrap-compiler/Kotlin/kotlinc/bin/${kotlinc.executable.path}" failonerror="true">
+                    <arg value="-Dkotlin.colors.enabled=false"/>
                     <arg value="${markdown.dir}/src"/>
                     <arg value="-d"/>
                     <arg value="${markdown.dir}/out"/>
@@ -874,6 +876,7 @@
             <echo message="URL: ${override.version.url} Version: ${override.version.build.number}"/>

             <exec executable="dependencies/bootstrap-compiler/Kotlin/kotlinc/bin/${kotlinc.executable.path}" failonerror="false">
+                <arg value="-Dkotlin.colors.enbled=false"/>
                 <arg value="-cp"/>
                 <arg value="dependencies/bootstrap-compiler/Kotlin/kotlinc/lib/kotlin-compiler.jar"/>
                 <arg value="-script"/>

在finsiehd update_dependencies.xml之后,我执行了ant -f build.xml并遇到了以下错误:

runner:
     [echo] Cleaning /home/kyungkoo/Downloads/kotlin-build-1.0.0-beta-5569/dist/classes/runner
    [mkdir] Created dir: /home/kyungkoo/Downloads/kotlin-build-1.0.0-beta-5569/dist/classes/runner
  [kotlinc] Compiling [/home/kyungkoo/Downloads/kotlin-build-1.0.0-beta-5569/compiler/cli/cli-runner/src] => [/home/kyungkoo/Downloads/kotlin-build-1.0.0-beta-5569/dist/classes/runner]

BUILD FAILED
/home/kyungkoo/Downloads/kotlin-build-1.0.0-beta-5569/build.xml:441: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.jetbrains.kotlin.ant.KotlinCompilerBaseTask.execute(KotlinCompilerBaseTask.kt:92)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:293)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:435)
    at org.apache.tools.ant.Target.performTasks(Target.java:456)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1405)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1376)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1260)
    at org.apache.tools.ant.Main.runBuild(Main.java:853)
    at org.apache.tools.ant.Main.startAnt(Main.java:235)
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:285)
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:112)
Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path, /tmp/libjansi-32-7100610475620258495.so: /tmp/libjansi-32-7100610475620258495.so: cannot open shared object file: No such file or directory (Possible cause: can't load IA 32-bit .so on a ARM-bit platform)]
    at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
    at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
    at org.fusesource.jansi.internal.CLibrary.<clinit>(CLibrary.java:37)
    at org.jetbrains.kotlin.cli.common.messages.PlainTextMessageRenderer.<clinit>(PlainTextMessageRenderer.java:35)
    at org.jetbrains.kotlin.cli.common.messages.MessageRenderer.<clinit>(MessageRenderer.java:29)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execFullPathsInMessages(CLICompiler.java:69)
    ... 22 more

Total time: 1 minute 3 seconds

我这样修好了build.xml

diff --git a/build.xml b/build.xml
index 38f751c..7bcfeb1 100644
--- a/build.xml
+++ b/build.xml
@@ -299,6 +299,7 @@

             <java classname="org.jetbrains.kotlin.preloading.Preloader" failonerror="true" fork="true"
                   maxmemory="${max.heap.size.for.forked.jvm}">
+                <sysproperty key="kotlin.colors.enabled" value="true"/>
                 <classpath>
                     <pathelement location="${kotlin-home}/lib/kotlin-preloader.jar"/>
                 </classpath>
@@ -468,6 +469,7 @@
               failonerror="true"
               fork="true"
               maxmemory="${max.heap.size.for.forked.jvm}">
+            <sysproperty key="kotlin.colors.enabled" value="true"/>
             <assertions>
                 <enable/>
             </assertions>
@@ -732,6 +734,7 @@
             <pathconvert property="src.line" refid="src.dirset" pathsep=" "/>

             <java classname="org.jetbrains.kotlin.preloading.Preloader" failonerror="true" fork="true" maxmemory="${max.heap.size.for.forked.jvm}">
+                <sysproperty key="kotlin.colors.enabled" value="true"/>
                 <classpath>
                     <pathelement location="${kotlin-home}/lib/kotlin-preloader.jar"/>
                 </classpath>
@@ -771,6 +774,7 @@

         <sequential>
             <java classname="org.jetbrains.kotlin.preloading.Preloader" failonerror="true" fork="true" maxmemory="${max.heap.size.for.forked.jvm}">
+                <sysproperty key="kotlin.colors.enabled" value="true"/>
                 <classpath>
                     <pathelement location="${kotlin-home}/lib/kotlin-preloader.jar"/>
                 </classpath>

然后,我执行ant build。 ant -f build.xml -Dkotlin.colors.enabled=false。 我不擅长ant。所以,我不能确定这是正确的语法。但是构建已经开始,我也遇到了同样的错误。

BUILD FAILED
/home/kyungkoo/Downloads/kotlin-build-1.0.0-beta-5569/build.xml:442: java.lang.reflect.InvocationTargetException

...

Caused by: java.lang.UnsatisfiedLinkError: Could not load library. Reasons: [no jansi in java.library.path, /tmp/libjansi-32-7323034426853998701.so: /tmp/libjansi-32-7323034426853998701.so: cannot open shared object file: No such file or directory (Possible cause: can't load IA 32-bit .so on a ARM-bit platform)]
    at org.fusesource.hawtjni.runtime.Library.doLoad(Library.java:182)
    at org.fusesource.hawtjni.runtime.Library.load(Library.java:140)
    at org.fusesource.jansi.internal.CLibrary.<clinit>(CLibrary.java:37)
    at org.jetbrains.kotlin.cli.common.messages.PlainTextMessageRenderer.<clinit>(PlainTextMessageRenderer.java:35)

3 个答案:

答案 0 :(得分:2)

看起来Raspberry Pi缺少jansi本地库。我不确定它们是否可用,但你可以在构建Kotlin时安全地禁用它们,因为Kotlin编译器只使用jansi向终端输出彩色诊断消息。要禁用颜色(以及jansi)的使用,请尝试在Kotlin项目的根目录中应用此修补程序:

diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/PlainTextMessageRenderer.java b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/PlainTextMessageRenderer.java
index e83309d..d4755e6 100644
--- a/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/PlainTextMessageRenderer.java
+++ b/compiler/cli/src/org/jetbrains/kotlin/cli/common/messages/PlainTextMessageRenderer.java
@@ -32,9 +32,7 @@ import static org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
 public abstract class PlainTextMessageRenderer implements MessageRenderer {
     // AnsiConsole doesn't check isatty() for stderr (see https://github.com/fusesource/jansi/pull/35).
     // TODO: investigate why ANSI escape codes on Windows only work in REPL for some reason
-    private static final boolean COLOR_ENABLED =
-            !SystemInfo.isWindows &&
-            CLibrary.isatty(CLibrary.STDERR_FILENO) != 0;
+    private static final boolean COLOR_ENABLED = false;

     private static final String LINE_SEPARATOR = LineSeparator.getSystemLineSeparator().getSeparatorString();

答案 1 :(得分:1)

我只是想让Kotlin在我的Raspberry Pi上工作。我按照上面的链接 - https://youtrack.jetbrains.com/issue/KT-10605 - 来自IRus。从那以后,我看到它确实检查了一个属性以禁用颜色,幸运的是。

因此,至少在传播更改之前,您可以执行以下操作:

kotlinc -Dkotlin.colors.enabled=false

然后将跳过尝试加载非ARM共享库的部分。至少它可以让我运行REPL。

我找到的另一种方法是设置env变量JAVA_TOOL_OPTIONS,如下所示:

export JAVA_TOOL_OPTIONS="-Dkotlin.colors.enabled=false"

这将由java vm接收,然后你不需要在每个命令行上(尽管每次都会发出恼人的'Picked up message'。

答案 2 :(得分:0)

由jetbrains开发的命令行Kotlin编译器可以在所有当前支持的Ubuntu版本中作为快照包安装。要安装它,请打开终端并键入:

sudo snap install kotlin --classic  

可用工具:

  • kotlinc
  • kotlinc-JVM
  • kotlinc-JS
  • 科特林-DCE-JS