<?xml version="1.0"?>

<!--
/*
 * $RCSfile$
 *
 * Copyright (c) 2004 Sun Microsystems, Inc. All rights reserved.
 *
 * Use is subject to license terms.
 *
 * $Revision$
 * $Date$
 * $State$
 */
 -->

<project name="Java 3D" default="jar-opt" basedir=".">

  <!--
  *********************************************************************
  *
  * The following properties may be set on the command line to
  * specify the compiler used or the renderer to be built. They are
  * specified using "ant -Dprop.name=value", where the actual
  * property and and value are substituted for "prop.name" and
  * "value"
  *
  *   build.comp=gcc    Use GCC compilers (default, all platforms)
  *   build.comp=forte  Use Forte compilers (Solaris only)
  *   build.comp=vc     Use Visual C++ compilers (Windows only)
  *
  *   build.rend=ogl    build OpenGL native library (default)
  *   build.rend=d3d    build DirectX (D3D) native library
  *
  * For example:
  *
  *   ant -Dbuild.comp=vc -Dbuild.rend=d3d ...
  *
  *********************************************************************
  -->

  <!-- *************************************** -->
  <!-- *** Begin build-specific properties *** -->
  <!-- *************************************** -->

  <!--
  * The following property specifies the build number of the current
  * Java 3D version being built. This build number is a monotonically
  * increasing number that is incremented for each new stable, beta,
  * fcs, or patch build.  Each non-daily build will have a unique
  * build number that is greater than the previous build's build
  * number.
  -->
  <property name="version_buildnum"   value="10"/>

  <!--
  * The following property specifies the beta revision of the current
  * Java 3D version being built. It is ignored for non-beta builds.
  -->
  <property name="version_betastr"    value="beta1"/>

  <!--
  * The following property specifies the patch revision of the current
  * Java 3D version being built. It is ignored for non-beta builds.
  -->
  <property name="version_patchstr"   value="01"/>

  <!--
  * The following properties specify the current version of Java 3D.
  * The "version_base" property specifies the dot-dot base version
  * number of Java 3D; it must contain exactly three integer numbers
  * separated by "periods ("."). The version_base_file property must
  * be the same version number as version_base with "_" replacing ".".
  -->
  <property name="version_base"       value="1.3.2"/>
  <property name="version_base_file"  value="1_3_2"/>


  <!-- ************************************* -->
  <!-- *** End build-specific properties *** -->
  <!-- ************************************* -->

  <!--
  *********************************************************************
  *
  * A build of Java 3D is one of the following five types: daily
  * build, stable build, beta build (or release candidate), fcs build,
  * patch build. Daily builds are identified with a "-preN-YYMMDDHHMM"
  * suffix; stable builds are identified with a "-buildN" suffix; beta
  * builds are identified with a "-betaN" or "-rcN" suffix; fcs builds
  * have no suffix; and patch builds are identified with an "_N"
  * suffix.
  *
  * The default is to do a daily build. This may be overriden by setting
  * the build.type property on the command line to do a different kind
  * of build:
  *
  *   build.type=daily   Do a daily build (default)
  *   build.type=stable  Do a stable build : -buildN
  *   build.type=beta    Do a beta or RC production build : -betaN or -rcN
  *   build.type=fcs     Do an FCS production build : [no suffix]
  *   build.type=patch   Do an FCS+patch production build : _PP
  *
  * For example:
  *
  *   ant -Dbuild.type=stable ...
  *
  *********************************************************************
  -->

  <!-- Set global properties for this build -->
  <property name="vecmath_home" location="../vecmath"/>
  <property name="core_utils_home" location="../j3d-core-utils"/>

  <property name="src"     location="src"/>
  <property name="vecmath_src" location="${vecmath_home}/src"/>
  <property name="core_utils_src" location="${core_utils_home}/src"/>
  <property name="build-tools" location="build-tools"/>
  <property name="build"   location="build"/>
  <property name="dist"    location="dist"/>
  <property name="build.comp" value="gcc"/>
  <property name="build.rend" value="ogl"/>

  <target name="echo" depends="setupPlatform">	
    <echo message="platform        = ${platform}"/>
    <echo message="ostype          = ${ostype}"/>
    <echo message="os.arch         = ${os.arch}"/>
    <echo message="os.name         = ${os.name}"/>	
    <echo message="ant.home        = ${ant.home}"/>
    <echo message="java.home       = ${java.home}"/>
    <echo message="core_utils_home = ${core_utils_home}"/>
    <echo message="vecmath_home    = ${vecmath_home}"/>
    <echo message="user.name       = ${user.name}"/>
    <echo message="user.home       = ${user.home}"/>

    <echo message=""/>
    <echo message="build.type      = ${build.type}"/>
    <echo message="build.rend      = ${build.rend}"/>
    <echo message="build.comp      = ${build.comp}"/>
    <echo message="is_dev_phase    = ${is_dev_phase}"/>
    <echo message="is_production   = ${is_production}"/>
    <echo message="use_verbose_buildtime = ${use_verbose_buildtime}"/>

    <echo message="version_build   = ${version_build}"/>
    <echo message="version_suffix  = ${version_suffix}"/>

    <echo message="version         = ${version}"/>
    <echo message="version_file    = ${version_file}"/>
    <echo message="version_rpm     = ${version_rpm}"/>
  </target>

  <target name="setupSolaris" if="isSolarisOnSparc">	
    <property name="ostype" value="solaris"/>
    <property name="platform" value="solaris-sparc-${build.comp}"/>
  </target>

  <target name="setupLinux" if="isLinuxOnX86">	
    <property name="ostype" value="linux"/>
    <property name="platform" value="linux-i586"/>
  </target>

  <target name="setupLinuxAmd64" if="isLinuxOnAmd64">	
    <property name="ostype" value="linux"/>
    <property name="platform" value="linux-amd64"/>
  </target>

  <!-- win32 should be rename as windows -->
  <target name="setupWindows" if="isWindowsOnX86">	
    <property name="ostype" value="win32"/>
    <property name="platform" value="windows-i586-${build.comp}"/>
  </target>

  <target name="setupPlatform"
       depends="init, setupBuildType, setupSolaris, setupLinux, setupLinuxAmd64, setupWindows">
    <property name="build-debug-gen" location="${build}/${platform}/debug/gen"/>
    <property name="build-opt-gen" location="${build}/${platform}/opt/gen"/>
    <property name="docname" value="java3d-${version_file}-doc"/>
  </target>


  <target name="setupBuildType" depends="initBuildType, setupBuildPatch, setupBuildFcs, setupBuildBeta, setupBuildStable, setupBuildDaily, checkBuildType">
    <echo message="build.type = ${build.type}"/>
  </target>

  <target name="initBuildType">
    <!-- Default value is "daily", overridden on command line -->
    <property name="build.type" value="daily"/>
    <property name="buildType_${build.type}" value="true"/>
  </target>


  <!-- Set properties for PATCH build -->
  <target name="setupBuildPatch" if="buildType_patch">
    <property name="buildTypeSet" value="true"/>

    <property name="is_dev_phase" value="false"/>
    <property name="is_production" value="true"/>
    <property name="use_verbose_buildtime" value="false"/>

    <property name="version_build" value="build${version_buildnum}"/>
    <property name="version_suffix" value="${version_patchstr}"/>

    <property name="version" value="${version_base}_${version_suffix}"/>
    <property name="version_file" value="${version_base_file}_${version_suffix}"/>
    <property name="version_rpm" value="${version_base}_${version_suffix}"/>
  </target>


  <!-- Set properties for FCS build -->
  <target name="setupBuildFcs" if="buildType_fcs">
    <property name="buildTypeSet" value="true"/>

    <property name="is_dev_phase" value="false"/>
    <property name="is_production" value="true"/>
    <property name="use_verbose_buildtime" value="false"/>

    <property name="version_build" value="build${version_buildnum}"/>
    <property name="version_suffix" value=""/>

    <property name="version" value="${version_base}"/>
    <property name="version_file" value="${version_base_file}"/>
    <property name="version_rpm" value="${version_base}"/>
  </target>


  <!-- Set properties for BETA build -->
  <target name="setupBuildBeta" if="buildType_beta">
    <property name="buildTypeSet" value="true"/>

    <property name="is_dev_phase" value="false"/>
    <property name="is_production" value="true"/>
    <property name="use_verbose_buildtime" value="true"/>

    <property name="version_build" value="build${version_buildnum}"/>
    <property name="version_suffix" value="${version_betastr}"/>

    <property name="version" value="${version_base}-${version_suffix}"/>
    <property name="version_file" value="${version_base_file}-${version_suffix}"/>
    <property name="version_rpm" value="${version_base}_${version_suffix}"/>
  </target>


  <!-- Set properties for STABLE build -->
  <target name="setupBuildStable" if="buildType_stable">
    <property name="buildTypeSet" value="true"/>

    <property name="is_dev_phase" value="true"/>
    <property name="is_production" value="false"/>
    <property name="use_verbose_buildtime" value="true"/>

    <property name="version_build" value="build${version_buildnum}"/>
    <property name="version_suffix" value="${version_build}"/>

    <property name="version" value="${version_base}-${version_suffix}"/>
    <property name="version_file" value="${version_base_file}-${version_suffix}"/>
    <property name="version_rpm" value="${version_base}_${version_suffix}"/>
  </target>


  <!-- Set properties for DAILY build -->
  <target name="setupBuildDaily" if="buildType_daily">
    <property name="buildTypeSet" value="true"/>

    <property name="is_dev_phase" value="true"/>
    <property name="is_production" value="false"/>
    <property name="use_verbose_buildtime" value="true"/>

    <property name="version_build" value="pre${version_buildnum}"/>
    <property name="version_suffix" value="${version_build}"/>

    <property name="version" value="${version_base}-${version_suffix}-${buildtime}"/>
    <property name="version_file" value="${version_base_file}-${version_suffix}-${buildtime}"/>
    <property name="version_rpm" value="${version_base}_${version_suffix}_${buildtime}"/>
  </target>


  <!-- Check buildType -->
  <target name="checkBuildType" unless="buildTypeSet">
    <fail message="Unknown build.type = ${build.type}"/>
  </target>


  <target name="init">
    <!-- Create the time stamp -->
    <tstamp>
        <format property="buildtime_verbose" pattern="dd MMM yyyy HH:mm:ss z"/>
        <format property="buildtime" pattern="yyMMddHHmm"/>
    </tstamp>
  
    <echo message="buildtime = ${buildtime_verbose}"/>

    <!-- Create the base build directory -->
    <mkdir dir="${build}"/>

    <!-- ========== determine platform ========== -->
    <condition property="isWindowsOnX86">
	<os family="windows" arch="x86"/>
    </condition> 

    <condition property="isLinuxOnX86">
        <os name="linux" arch="i386"/>
    </condition>

    <condition property="isLinuxOnAmd64">
        <os name="linux" arch="amd64"/>
    </condition>

    <condition property="isSolarisOnSparc">
        <os name="SunOS" arch="sparc"/>
    </condition>   
  </target>

  <target name="compile-debug" depends="setupPlatform">
	<ant dir="src/classes" target="compile-debug"/>
	<ant dir="src/native" target="compile-debug"/>
  </target>

  <target name="compile-opt" depends="setupPlatform">
	<ant dir="src/classes" target="compile-opt"/>
	<ant dir="src/native" target="compile-opt"/>
  </target>

  <target name="compile" depends="compile-debug,compile-opt" />

  <target name="jar-debug" depends="compile-debug">
	<ant dir="src/classes" target="jar-debug"/>
  </target>

  <target name="jar-opt" depends="compile-opt">
	<ant dir="src/classes" target="jar-opt"/>
  </target>

  <target name="jar" depends="jar-debug,jar-opt" />

  <target name="docs-jcp" depends="setupPlatform">
	<ant dir="src/classes" target="docs-jcp"/>
  </target>

  <target name="docs-public" depends="setupPlatform" unless="nojavadoc">
	<ant dir="src/classes" target="docs-public"/>
  </target>

  <target name="docs-private" depends="setupPlatform">
	<ant dir="src/classes" target="docs-private"/>
  </target>

  <target name="docs" depends="setupPlatform">
	<ant dir="src/classes" target="docs"/>
  </target>

  <target name="dist" depends="jar-opt,docs-public">
	<ant dir="src/classes" target="dist"/>
	<ant dir="src/native" target="dist"/>
  </target>

  <target name="all" depends="jar-debug,dist,docs-jcp,docs-private"/>

  <target name="rpm" description="Build rpm package" depends="dist">
      <mkdir dir="${build}/${platform}/rpm"/>
      <mkdir dir="${build}/${platform}/rpm/SPECS"/>
      <mkdir dir="${build}/${platform}/rpm/SOURCES"/>
      <mkdir dir="${build}/${platform}/rpm/BUILD"/>
      <mkdir dir="${build}/${platform}/rpm/RPMS"/>

      <copy file="build-tools/java3d-rpm.spec" 
            todir="${build}/${platform}/rpm/SPECS"
            overwrite="true">
          <filterset>
              <filter token="VERSION" value="${version}"/>
              <filter token="VERSION_FILE" value="${version_file}"/>
              <filter token="VERSION_RPM" value="${version_rpm}"/>
          </filterset>
      </copy>

      <tar destfile="${build}/${platform}/rpm/SOURCES/java3d-${version_file}.tar.gz"
           compression="gzip">
          <tarfileset dir="${dist}/${platform}"
                      includes="lib/**"
          />
          <tarfileset dir="release-info"
                      includes="BINARY-CODE-LICENSE.txt"
          />
          <tarfileset dir="."
                      includes="COPYRIGHT.txt README-FIRST.txt"
          />
      </tar>

      <rpm specFile="java3d-rpm.spec"
           topDir="${build}/${platform}/rpm"/>

      <copy
        file="${build}/${platform}/rpm/RPMS/i586/java3d-${version_rpm}-1.i586.rpm"
        tofile="dist/${platform}/java3d-${version_file}-1-i586.rpm"/>
  </target>

  <target name="clean-dist">
    <!-- Delete the ${dist} directory tree  -->
    <delete dir="${dist}"/>
  </target>

  <target name="clean">
    <!-- Delete the ${build}, and ${dist} directory trees  -->
    <delete dir="${build}"/>	
    <delete dir="${dist}"/>
  </target>

  <description>
The following ant targets are available ("jar-opt" is the default):

      all           - execute targets jar-debug and dist.

      clean         - removes WS/build/ and WS/dist/

      clean-dist    - removes WS/dist.

      compile       - execute targets compile-debug and compile-opt.
 
      compile-debug - builds all classes and native layer in WS/src into 
                      class files under WS/build/${platform}/debug/classes/ and
                      native files under WS/build/${platform}/debug/native/

      compile-opt   - builds all classes and native layer in WS/src into 
                      class files under WS/build/${platform}/opt/classes/ and
                      native files under WS/build/${platform}/opt/native/

      dist          - creates the distribution jar, native library and javadoc
                      under WS/dist/${platform}.

      docs          - builds all classes in WS/src into javadoc under 
                      WS/build/javadocs.

      docs-jcp      - builds JCP docs of all classes in WS/src into javadoc under 
                      WS/build/javadocs/docs-jcp.

      docs-private  - builds private docs of all classes in WS/src into javadoc under 
                      WS/build/javadocs/docs-private.

      docs-public   - builds public docs of all classes in WS/src into javadoc under 
                      WS/build/javadocs/docs-public.

      echo          - echo some useful information, such as user.home,
                      ant.home, java.home and platform.

      jar           - execute targets jar-debug and jar-opt.

      jar-debug     - creates WS/build/${platform}/debug/lib for all jar
                      files and libraries from class and native code files under 
                      WS/build/${platform}/debug/classes and 
                      WS/build/${platform}/debug/native.

      jar-opt       - creates WS/build/${platform}/opt/lib for all jar
                      files and libraries from class and native code files under 
                      WS/build/${platform}/opt/classes and 
                      WS/build/${platform}/opt/native.

      rpm           - creates a i586 rpm for installation in /usr/java/jdk1.5.0
                      the rpm is placed in dist/rpm
  </description>
</project>