bit

Apache antのjavaタスクのarg要素に空白を含むパスを複数指定するには

antもANTLRも今更感はあるけど、久しぶりにいじると楽しい。

でも、結構はまる。文法ファイル(*.g4) が複数あって、かつパスに空白が含まれる場合(Google Driveとか)に、java タスクの arg 要素で pathref 属性を使おうとすると、ant が空白でパスを切ってしまって java タスクに思い通りに渡らない。そこで、 pathconvert を以下のように使って、文字列化してしまうとうまくいく。

  <path id="src.antlr">
    <fileset dir="${basedir}/src/antlr">
      <include name="**/*.g4" />
    </fileset>
  </path>

  <target name="antlr_compile">
    <echo message="[DEBUG] ${toString:src.antlr}" />

    <pathconvert property="antlr.args" refid="src.antlr" pathsep=" ">
      <regexpmapper from="^(.*)$" to='"\1"' />
    </pathconvert>

    <echo message="[DEBUG] ${antlr.args}" />

    <java classname="org.antlr.v4.Tool">
      <classpath>
        <pathelement path="${basedir}/lib/antlr-4.1-complete.jar" />
      </classpath>
      <arg line='-o "${basedir}/src/java/iwsttty/example_antlr"' />
      <arg line="-package iwsttty.example_antlr" />
      <arg line="${antlr.args}" />
    </java>
  </target>

antlr タスクでは複数の文法ファイル指定はうまくいかなかったです。