2011年8月7日日曜日

AntでScalaをコンパイルする

最近ScalaファイルのコンパイルをAntを利用して行うようにしたので、その方法をメモしておきます。

  1. Scalaコンパイル用タスクの設定
  2. ターゲットの作成

  1. Scalaコンパイル用タスクの設定
    Scalaコンパイル用タスクは scala-compiler.jar の中の scala/tools/ant/antlib.xml で定義されています。
    <property name="scala.home" location="C:\scala-2.9.0.1" />
       <property name="scala-library.jar" value="${scala.home}/lib/scala-library.jar" />
       <property name="scala-dbc.jar" value="${scala.home}/lib/scala-dbc.jar" />
       <property name="scala-swing.jar" value="${scala.home}/lib/scala-swing.jar" />
       <taskdef resource="scala/tools/ant/antlib.xml">
          <classpath>
            <pathelement location="${scala.home}/lib/scala-compiler.jar" />
            <pathelement location="${scala-library.jar}" />
            <pathelement location="${scala-dbc.jar}" />
            <pathelement location="${scala-swing.jar}" />
          </classpath>
       </taskdef>
    
    とすれば設定できます。
    scala-dbc.jar と scala-swing.jar はそれぞれDBアクセス、Swingを利用しなければ不要です。
  2. ターゲットの作成
    上記によって、利用できるようになるコンパイル用のタスクは scalac と fsc の2種類になります。
    scalacはjavacと同じ感覚で利用することができます。
    <target name="build" depends="init">
        <mkdir dir="${build.dir}"   />
        <scalac srcdir="${sources.dir}" destdir="${build.dir}" classpathref="build.classpath" />
      </target>
    
    fscは少しコツのようなものがあって、普通に
    <target name="build" depends="init">
        <mkdir dir="${build.dir}"   />
        <fsc srcdir="${sources.dir}" destdir="${build.dir}" classpathref="build.classpath" />
      </target>
    
    とすると、コンパイルが成功しているにも関わらず
    「Compile failed because of an internal compiler error」
    が表示され、エラーとなってしまいます。
    ちょっと理由はわからないのですが、これは「failonerror」属性を「false」に変更することで防ぐことができます。
    <target name="build" depends="init">
        <mkdir dir="${build.dir}"   />
        <fsc srcdir="${sources.dir}" destdir="${build.dir}" faileonerror="false" classpathref="build.classpath" />
      </target>
    

全てまとめるとこんな感じになります。

<?xml version="1.0" encoding="UTF-8"?>
<project name="FirstScala" default="compile" basedir="." >
  <description>
    simple example build file
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src" />
  <property name="build" location="build" />
  <property name="dist" location="dist" />
  <property name="scala.home" location="C:\scala-2.9.0.1" />
  <target name="init">
    <property name="scala-library.jar" value="${scala.home}/lib/scala-library.jar" />
    <property name="scala-dbc.jar" value="${scala.home}/lib/scala-dbc.jar" />
    <property name="scala-swing.jar" value="${scala.home}/lib/scala-swing.jar" />
    <path id="build.classpath">
      <pathelement location="${scala-library.jar}" />
      <pathelement location="${scala-dbc.jar}" />
      <pathelement location="${scala-swing.jar}" />
      <pathelement location="${scala.home}/lib/scala-compiler.jar" />
      <pathelement location="${build}" />
    </path>
    <taskdef resource="scala/tools/ant/antlib.xml">
      <classpath>
        <pathelement location="${scala.home}/lib/scala-compiler.jar" />
        <pathelement location="${scala-library.jar}" />
        <pathelement location="${scala-dbc.jar}" />
        <pathelement location="${scala-swing.jar}" />
      </classpath>
    </taskdef>
  </target>
  
  <target name="compile" depends="init" description="compile the source">
    <!-- Compile the java code from ${src} into ${build} -->
    <fsc srcdir="${src}" encoding="UTF-8" destdir="${build}" deprecation="on" failonerror="false" classpathref="build.classpath"/>
  </target>
</project>

0 件のコメント:

コメントを投稿