<?xml version="1.0" encoding="iso-8859-1"?>

<!--

This file is part of Cadmium.
Copyright (C) 2007-2010 Xavier Clerc.

Cadmium is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.

Cadmium is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see http://www.gnu.org/licenses/.

-->

<project name="cadmium" default="deploy" basedir=".">

  <description>
    Cadmium: Java interpreter and runtime support for Objective Caml
    Author: Xavier Clerc
  </description>

  <!-- Project properties -->
  <property file="build.properties"/>

  <!-- Classpath for builds -->
  <path id="classpath.build">
    <path location="lib"/>
    <fileset dir="lib">
      <include name="**/*.jar"/>
    </fileset>
    <path location="${path.w3c-jdbm}"/>
  </path>

  <!-- Classpath for style -->
  <path id="classpath.style">
    <pathelement path="${project.jarfile}"/>
    <pathelement path="${project.jarfile-labltk}"/>
    <pathelement path="${project.jarfile-servlet}"/>
    <pathelement path="${project.jarfile-swixml}"/>
    <pathelement path="${project.jarfile-scripting}"/>
    <fileset dir="${path.lib}">
      <include name="**/*.jar"/>
    </fileset>
  </path>

  <!-- CheckStyle task -->
  <taskdef resource="checkstyletask.properties" classpathref="classpath.style"/>

  <target name="init" description="initializes properties for conditional compilation">
    <available property="condition.jdbm" file="${path.w3c-jdbm}"/>
    <available property="condition.servlet" file="${path.lib}/servlet-api.jar"/>
    <available property="condition.swixml" file="${path.lib}/swixml.jar"/>
    <available property="condition.scripting" file="${path.lib}/ocamljava.jar"/>
    <available property="condition.labltk" file="${path.lib}/swank.jar"/>
  </target>

  <target name="clean"
          description="cleans 'classes' and 'javadoc' directories"
          depends="clean-classes,clean-javadoc"/>

  <target name="clean-classes" description="cleans 'classes' directory">
    <delete dir="${path.classes}/fr"/>
  </target>

  <target name="clean-javadoc" description="cleans 'javadoc' directory">
    <delete dir="${path.javadoc-dev}" failonerror="false"/>
    <mkdir dir="${path.javadoc-dev}"/>
    <delete dir="${path.javadoc-public}" failonerror="false"/>
    <mkdir dir="${path.javadoc-public}"/>
  </target>

  <target name="compile" description="compiles all files" depends="init">
    <replaceregexp file="${path.src}/fr/x9c/cadmium/Infos.java"
                   match=" VERSION = .*;"
                   replace=" VERSION = &quot;${project.version}&quot;;"
                   byline="true"/>
    <exec executable="ocamlc" outputproperty="project.ocaml-version" failonerror="true">
      <arg line="-version"/>
    </exec>
    <replaceregexp file="${path.src}/fr/x9c/cadmium/Infos.java"
                   match=" OCAML_VERSION = .*;"
                   replace=" OCAML_VERSION = &quot;${project.ocaml-version}&quot;;"
                   byline="true"/>
    <delete dir="${path.classes}/fr"/>
    <javac srcdir="${path.src}"
           destdir="${path.classes}"
           classpathref="classpath.build"
           debug="on"
           optimize="on"
           deprecation="on"
           target="${project.java-version}"
           source="${project.java-version}">
      <compilerarg line="-Xlint:all"/>
      <exclude name="fr/x9c/cadmium/primitives/dbm/Jdbm*.java" unless="condition.jdbm"/>
      <exclude name="fr/x9c/cadmium/primitives/cadmiumservlet/*.java" unless="condition.servlet"/>
      <exclude name="fr/x9c/cadmium/support/servlet/*.java" unless="condition.servlet"/>
      <exclude name="fr/x9c/cadmium/support/scripting/*.java" unless="condition.scripting"/>
      <exclude name="fr/x9c/cadmium/primitives/cadmiumswixml/*.java" unless="condition.swixml"/>
      <exclude name="fr/x9c/cadmium/primitives/labltk/*.java" unless="condition.labltk"/>
    </javac>
    <move file="${path.classes}/fr/x9c/cadmium/primitives/dbm/JdbmImplementation.class"
          tofile="${path.classes}/fr/x9c/cadmium/primitives/dbm/JdbmImplementation.clazz"
          failonerror="false"/>
  </target>

  <macrodef name="macro.javadoc">
    <attribute name="destdir" description="destination directory"/>
    <attribute name="access" description="value of access attribute"/>
    <sequential>
      <javadoc sourcepath="${path.src}"
               classpathref="classpath.build"
               destdir="@{destdir}"
               packagenames="${packages}"
               overview="${project.overview}"
               access="@{access}"
               version="true"
               use="true"
               author="true"
               windowtitle="${project.name}"
               doctitle="${project.name}"
               source="${project.java-version}"
               linksource="yes">
        <link href="${path.jdkdoc}"/>
      </javadoc>
    </sequential>
  </macrodef>

  <target name="javadoc" description="generates javadoc" depends="clean-javadoc">
    <macro.javadoc destdir="${path.javadoc-dev}" access="private"/>
    <macro.javadoc destdir="${path.javadoc-public}" access="public"/>
  </target>

  <target name="deploy"
          description="compiles files then creates jar files"
          depends="clean-classes,compile,deploy-base,deploy-labltk,deploy-servlet,deploy-swixml,deploy-scripting"/>

  <target name="deploy-base" description="creates the main jar file" depends="clean-classes,compile">
    <delete file="${project.jarfile}"/>
    <delete file="${project.jarfile-labltk}"/>
    <delete file="${project.jarfile-servlet}"/>
    <delete file="${project.jarfile-swixml}"/>
    <delete file="${project.jarfile-scripting}"/>
    <delete file="${project.jarfile-scripting-standalone}"/>
    <jar destfile="${project.jarfile}">
      <fileset dir="${path.classes}"
               includes="**/*.class,**/*.clazz"
               excludes="fr/x9c/cadmium/primitives/labltk/*.class,fr/x9c/cadmium/primitives/cadmiumservlet/*.class,fr/x9c/cadmium/support/servlet/*.class,fr/x9c/cadmium/primitives/cadmiumswixml/*.class,fr/x9c/cadmium/support/scripting/*.class"/>
      <manifest>
        <attribute name="Main-Class" value="fr.x9c.cadmium.Main"/>
      </manifest>
    </jar>
  </target>

  <target name="deploy-labltk" description="creates the labltk jar file" if="condition.labltk" depends="clean-classes,compile">
    <jar destfile="${project.jarfile-labltk}">
      <fileset dir="${path.classes}"
               includes="fr/x9c/cadmium/primitives/labltk/*.class"/>
      <service type="fr.x9c.cadmium.PrimitiveProvider">
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkCaml"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkEval"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkEvent"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkFile"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkImg"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkMain"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkMisc"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkTimer"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkVar"/>
        <provider classname="fr.x9c.cadmium.primitives.labltk.CltkWait"/>
      </service>
    </jar>
  </target>

  <target name="deploy-servlet" description="creates the servlet jar file" if="condition.servlet" depends="clean-classes,compile">
    <jar destfile="${project.jarfile-servlet}">
      <fileset dir="${path.classes}"
               includes="fr/x9c/cadmium/primitives/cadmiumservlet/*.class,fr/x9c/cadmium/support/servlet/*.class"/>
      <service type="fr.x9c.cadmium.PrimitiveProvider"
               provider="fr.x9c.cadmium.primitives.cadmiumservlet.Servlets"/>
    </jar>
  </target>

  <target name="deploy-swixml" description="creates the swixml jar file" if="condition.swixml" depends="clean-classes,compile">
    <jar destfile="${project.jarfile-swixml}">
      <fileset dir="${path.classes}"
               includes="fr/x9c/cadmium/primitives/cadmiumswixml/*.class"/>
      <service type="fr.x9c.cadmium.PrimitiveProvider"
               provider="fr.x9c.cadmium.primitives.cadmiumswixml.SwiXml"/>
    </jar>
  </target>

  <target name="deploy-scripting" description="creates the scripting jar file" if="condition.scripting" depends="clean-classes,compile">
    <jar destfile="${project.jarfile-scripting}">
      <fileset dir="${path.classes}"
               includes="fr/x9c/cadmium/support/scripting/*.class"/>
      <fileset dir="${path.resources}"
               includes="fr/x9c/cadmium/support/scripting/script"/>
      <service type="javax.script.ScriptEngineFactory"
               provider="fr.x9c.cadmium.support.scripting.OCamlScriptEngineFactory"/>
    </jar>
    <jar destfile="${project.jarfile-scripting-standalone}">
      <zipfileset src="${project.jarfile}" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${project.jarfile-scripting}" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/baristaLibrary.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/bigarray.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/cadmiumLibrary.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/camomile.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/ocamljava.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/stdlib.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/str.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/unix.jar" excludes="META-INF/MANIFEST"/>
      <zipfileset src="${path.lib}/zip.jar" excludes="META-INF/MANIFEST"/>
      <fileset dir="/">
        <include name="usr/local/lib/ocaml/ld.conf"/>
        <include name="usr/local/lib/ocaml/*.cmi"/>
        <include name="usr/local/lib/ocaml/*.cma"/>
        <include name="usr/local/lib/ocaml/*.cmja"/>
        <include name="usr/local/lib/ocaml/cadmium/*.cmi"/>
        <include name="usr/local/lib/ocaml/cadmium/*.cma"/>
        <include name="usr/local/lib/ocaml/cadmium/*.cmja"/>
      </fileset>
    </jar>
  </target>

  <target name="install-base" description="copies the jar file into the OCaml directory">
    <copy file="${project.jarfile}" todir="${path.ocaml}"/>
  </target>

  <target name="install" description="copies the jar file into the OCaml directory">
    <copy file="${project.jarfile}" todir="${path.ocaml}"/>
    <copy file="${project.jarfile-labltk}" todir="${path.ocaml}"/>
    <copy file="${project.jarfile-servlet}" todir="${path.ocaml}"/>
    <copy file="${project.jarfile-swixml}" todir="${path.ocaml}"/>
    <copy file="${project.jarfile-scripting}" todir="${path.ocaml}"/>
  </target>

  <target name="style" description="generates style report">
    <delete dir="${path.reports}/style" failonerror="false"/>
    <mkdir dir="${path.reports}/style"/>
    <checkstyle config="${basedir}/checkstyle.xml"
                failOnViolation="false"
                classpathref="classpath.style">
      <formatter type="xml" tofile="${path.reports}/style/report.xml"/>
      <fileset dir="${path.src}" includes="**/*.java"/>
    </checkstyle>
    <xslt in="${path.reports}/style/report.xml"
          out="${path.reports}/style/report.html"
          style="${path.lib}/checkstyle-noframes.xsl"/>
  </target>

</project>
