<!--
Copyright (C) [2004, 2005, 2006], Hyperic, Inc.
This file is part of SIGAR.

SIGAR is free software; you can redistribute it and/or modify
it under the terms version 2 of the GNU General Public License as
published by the Free Software Foundation. This program 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 General Public License for more
details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA.
-->

  <property environment="env"/>

  <property name="build" location="build"/>
  <property name="jni.bin" location="${build}"/>
  <property name="jni.define.name" value="JNI"/>
  <property name="jni.source.dir" value="src"/>
  <property name="jni.src.java" value="src"/>
  <property name="jni.libprefix" value="java"/>
  <property name="jni.libversion" value=""/>
  <property name="osx.min" value="-mmacosx-version-min=10.3"/>

  <property name="cpptasks.jar" location="lib/cpptasks.jar"/>

  <taskdef name="cc" classname="net.sf.antcontrib.cpptasks.CCTask">
    <classpath location="${cpptasks.jar}"/>
  </taskdef>

  <target name="jni-init">
    <mkdir dir="${build}/classes"/>

    <available property="libproc.h" file="/usr/include/libproc.h"/>

    <condition property="jni.debug" value="true">
      <isset property="jni.dmalloc"/>
    </condition>

    <condition property="jni.optim" value="true">
      <not>
        <istrue value="${jni.debug}"/>
      </not>
    </condition>

    <condition property="static.gcc">
      <os arch="i386"/><!-- only for x86 solaris -->
    </condition>

    <condition property="jni.javahome" value="${env.JAVA_HOME}">
      <isset property="env.JAVA_HOME"/>
    </condition>
    <condition property="jni.javahome" value="${java.home}">
      <not>
        <isset property="jni.javahome"/>
      </not>
    </condition>

    <echo>java.home=${jni.javahome}</echo>

    <checksum file="${jni.javahome}/include/jni.h" property="jni.md5"/>

    <condition property="linux">
      <equals arg1="${os.name}" arg2="Linux"/>
    </condition>
    <condition property="solaris">
      <equals arg1="${os.name}" arg2="SunOS"/>
    </condition>
    <condition property="win32">
      <os family="windows"/>
    </condition>
    <condition property="hpux">
      <equals arg1="${os.name}" arg2="HP-UX"/>
    </condition>
    <condition property="aix">
      <equals arg1="${os.name}" arg2="AIX"/>
    </condition>
    <condition property="darwin">
      <equals arg1="${os.name}" arg2="Mac OS X"/>
    </condition>
    <condition property="freebsd">
      <equals arg1="${os.name}" arg2="FreeBSD"/>
    </condition>
    <condition property="openbsd">
      <equals arg1="${os.name}" arg2="OpenBSD"/>
    </condition>
    <condition property="netbsd">
      <equals arg1="${os.name}" arg2="NetBSD"/>
    </condition>
    <condition property="osf1">
      <equals arg1="${os.name}" arg2="OSF1"/>
    </condition>

    <condition property="jni.os" value="linux">
      <isset property="linux"/>
    </condition>

    <condition property="jni.os" value="win32">
      <isset property="win32"/>
    </condition>

    <condition property="jni.os" value="solaris">
      <isset property="solaris"/>
    </condition>

    <condition property="jni.os" value="aix">
      <isset property="aix"/>
    </condition>

    <condition property="jni.os" value="hpux">
      <isset property="hpux"/>
    </condition>

    <condition property="jni.os" value="darwin">
      <isset property="darwin"/>
    </condition>

    <condition property="jni.os" value="freebsd">
      <isset property="freebsd"/>
    </condition>

    <condition property="jni.os" value="openbsd">
      <isset property="openbsd"/>
    </condition>

    <condition property="jni.os" value="netbsd">
      <isset property="netbsd"/>
    </condition>

    <!-- darwin and freebsd use the same source files -->
    <condition property="jni.src" value="darwin">
      <isset property="freebsd"/>
    </condition>
    <condition property="jni.src" value="darwin">
      <isset property="openbsd"/>
    </condition>
    <condition property="jni.src" value="darwin">
      <isset property="netbsd"/>
    </condition>

    <condition property="jni.os" value="osf1">
      <isset property="osf1"/>
    </condition>

    <condition property="jni.jdk.os" value="${jni.os}">
      <and>
        <isfalse value="${hpux}"/>
        <isfalse value="${osf1}"/>
      </and>
    </condition>

    <condition property="jni.jdk.os" value="hp-ux">
      <istrue value="${hpux}"/>
    </condition>

    <condition property="jni.jdk.os" value="alpha">
      <istrue value="${osf1}"/>
    </condition>

    <condition property="jni.src" value="${jni.os}">
      <isfalse value="${jni.src}"/>
    </condition>

    <echo message="jni.src=${jni.src}, jni.jdk.os=${jni.jdk.os}, ${sun.arch.data.model}-bit"/>

    <javac srcdir="${jni.src.java}" destdir="${build}/classes" debug="true"
           source="1.4" target="1.4"
	   includes="org/hyperic/jni/*.java"/>

    <taskdef name="libarch" classname="org.hyperic.jni.ArchNameTask">
      <classpath location="${build}/classes"/>
    </taskdef>
    <taskdef name="copydep" classname="org.hyperic.jni.CopyDependsTask">
      <classpath location="${build}/classes"/>
    </taskdef>

    <libarch/>

    <property name="jni.project.archname"
              value="${project.name}-${jni.libarch}"/>

    <condition property="jni.libname"
               value="${jni.libprefix}${jni.project.archname}${jni.libversion}">
      <isfalse value="${jni.libname}"/>
    </condition>

    <property name="jni.libname.full"
              value="${jni.libpre}${jni.libname}${jni.libext}"/>

    <property name="jni.objdir" value="${build}/obj/${jni.libarch}"/>

    <condition property="jni.cc" value="uni-cc">
      <isset property="darwin"/>
    </condition>

    <property name="jni.cc" value="jni-cc"/>

    <condition property="cc.runtime" value="static">
      <isset property="win32"/>
    </condition>
    <condition property="cc.runtime" value="dynamic">
      <not>      
        <isset property="win32"/>
      </not>
    </condition>
  </target>

  <target name="jni-lib-copy" if="jni.libarch">
    <mkdir dir="${jni.bin}/lib"/>

    <copy toDir="${jni.bin}/lib" overwrite="true">
      <fileset dir="${jni.objdir}/lib"/>
    </copy>

    <chmod perm="a+x">
      <fileset dir="${jni.bin}/lib">
        <include name="*.sl"/>
      </fileset>
    </chmod>
  </target>

  <target name="jni-compile" if="jni.libarch">
    <antcall target="${jni.cc}" inheritRefs="true"/>
  </target>

  <!-- run jni-cc twice {ppc,i386}, then feed both to lipo to build a universal binary -->
  <target name="uni-cc" if="jni.libarch">
    <property name="shlib" value="${jni.objdir}/lib/lib${jni.libname}.dylib"/>

    <!-- ppc -->
    <echo message="build 'ppc' arch"/>
    <antcall target="jni-cc" inheritRefs="true">
      <param name="uni.arch" value="ppc"/>
    </antcall>

    <copy file="${shlib}" tofile="${shlib}.ppc"/>

    <!-- i386 -->
    <echo message="build 'i386' arch"/>
    <delete>
      <fileset dir="${jni.objdir}" includes="*.o"/>
    </delete>

    <antcall target="jni-cc" inheritRefs="true">
      <param name="uni.arch" value="i386"/>
    </antcall>

    <copy file="${shlib}" tofile="${shlib}.i386"/>

    <echo message="lipo 'ppc'+'i386'"/>
    <exec executable="lipo">
      <arg line="-create ${shlib}.ppc ${shlib}.i386 -output ${jni.objdir}/lib/lib${jni.libname}.dylib"/>
    </exec>

    <delete>
      <fileset dir="${jni.objdir}/lib" includes="*.ppc,*.i386"/>
    </delete>
  </target>

  <target name="jni-cc" if="jni.libarch">
    <mkdir dir="${jni.objdir}/lib"/>

    <echo message="jni libname=${jni.libname}"/>

    <cc outtype="shared"
	outfile="${jni.objdir}/lib/${jni.libname}"
	objdir="${jni.objdir}"
        runtime="${cc.runtime}"
	relentless="false">

      <!-- HPUX -->
      <compiler name="hp"  if="hpux">
        <compilerarg value="+Z"/>

        <defineset>
          <define name="${jni.define.name}_HPUX"/>
          <define name="_HPUX_SOURCE"/>
          <define name="_REENTRANT"/>
        </defineset>
      </compiler>

      <linker name="hp" if="hpux">
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>

        <syslibset libs="nsl"/>
        <syslibset libs="nm"/>
      </linker>

      <!-- Solaris -->
      <compiler name="gcc" if="solaris">
        <compilerarg value="-O2" if="jni.optim"/>
        <compilerarg value="-g" if="jni.debug"/>
        <compilerarg value="-Wall"/>
        <compilerarg value="-Werror" if="jni.werror"/>
        <compilerarg value="-m64" if="jni.arch64"/>
        <defineset>
          <define name="${jni.define.name}_SOLARIS"/>
          <define name="_REENTRANT"/>
          <define name="_POSIX_PTHREAD_SEMANTICS"/>
          <define name="DMALLOC" if="jni.dmalloc"/>
        </defineset>
      </compiler>

      <linker name="gcc" if="solaris">
        <!-- required for modern gcc to avoid libgcc_s.so dependency -->
        <!-- this arg is ignored by older gcc -->
        <linkerarg value="-static-libgcc"/>
        <linkerarg value="-m64" if="jni.arch64"/>

        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>
        <libset if="jni.dmalloc"
                dir="${jni.dmalloc}/lib"
                libs="dmallocth"/>
      </linker>

      <!-- Linux -->
      <compiler name="gcc" debug="${jni.debug}" if="linux">
        <compilerarg value="-O2" if="jni.optim"/>
        <compilerarg value="-g" if="jni.debug"/>
        <compilerarg value="-Wall"/>
        <compilerarg value="-Werror" if="jni.werror"/>
        <compilerarg value="-m64" if="jni.usem64"/>
        <defineset>
          <define name="${jni.define.name}_LINUX"/>
          <define name="_REENTRANT"/>
          <define name="DMALLOC" if="jni.dmalloc"/>
        </defineset>
      </compiler>

      <linker name="gcc" if="linux">
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>
        <libset if="jni.dmalloc"
                dir="${jni.dmalloc}/lib"
                libs="dmallocth"/>
        <linkerarg value="-m64" if="jni.usem64"/>
      </linker>

      <!-- Darwin -->
      <compiler name="gcc" if="darwin">
        <compilerarg value="-Wall"/>
        <compilerarg value="-Werror" if="jni.werror"/>
        <compilerarg value="-m64" if="jni.arch64"/>
        <compilerarg value="-O2" if="jni.optim"/>
        <compilerarg value="-g" if="jni.debug"/>
        <compilerarg value="-isysroot"/>
        <compilerarg value="${uni.sdk}"/>
        <compilerarg value="-arch"/>
        <compilerarg value="${uni.arch}"/>
        <compilerarg value="${osx.min}"/>

        <sysincludepath location="/Developer/Headers/FlatCarbon"/>

        <defineset>
          <define name="DARWIN"/>
          <define name="DARWIN_HAS_LIBPROC_H" if="libproc.h"/>
        </defineset>
      </compiler>

      <linker name="gcc" if="darwin">
        <linkerarg value="-m64" if="jni.arch64"/>
        <linkerarg value="-Wl,-syslibroot,${uni.sdk}"/>
        <linkerarg value="-arch"/>
        <linkerarg value="${uni.arch}"/>
        <linkerarg value="${osx.min}"/>

        <!-- for Gestalt() -->
        <linkerarg value="-framework"/>
        <linkerarg value="CoreServices"/>

        <linkerarg value="-sectcreate,__TEXT,__info_plist,${jni.info.plist}" if="jni.info.plist"/>

        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>

        <syslibset libs="IOKit"/>
      </linker>

      <!-- Freebsd -->
      <compiler name="gcc" if="freebsd">
        <compilerarg value="-O2" if="jni.optim"/>
        <compilerarg value="-g" if="jni.debug"/>
        <compilerarg value="-Wall"/>
        <compilerarg value="-Werror" if="jni.werror"/>
        <defineset>
          <define name="${jni.define.name}_FREEBSD"/>
        </defineset>
      </compiler>

      <linker name="gcc" if="freebsd">
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>
        <syslibset libs="kvm"/>
      </linker>

      <!-- OpenBSD -->
      <compiler name="gcc" if="openbsd">
        <compilerarg value="-O2" if="jni.optim"/>
        <compilerarg value="-g" if="jni.debug"/>
        <compilerarg value="-Wall"/>
        <!-- <compilerarg value="-Werror" if="jni.werror"/> -->
        <defineset>
          <define name="${jni.define.name}_OPENBSD"/>
        </defineset>
      </compiler>

      <linker name="gcc" if="openbsd">
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>
        <syslibset libs="kvm"/>
      </linker>

      <!-- NetBSD -->
      <compiler name="gcc" if="netbsd">
        <compilerarg value="-O2" if="jni.optim"/>
        <compilerarg value="-g" if="jni.debug"/>
        <compilerarg value="-Wall"/>
        <!-- <compilerarg value="-Werror" if="jni.werror"/> -->
        <defineset>
          <define name="${jni.define.name}_NETBSD"/>
        </defineset>
      </compiler>

      <linker name="gcc" if="netbsd">
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>
        <syslibset libs="kvm"/>
      </linker>

      <!-- AIX -->
      <compiler name="xlc_r" if="aix">
        <compilerarg value="-q64" if="jni.arch64"/>
        <defineset>
          <define name="${jni.define.name}_AIX"/>
          <define name="_ALL_SOURCE"/>
          <define name="_ANSI_C_SOURCE"/>
          <define name="_POSIX_SOURCE"/>
        </defineset>
      </compiler>

      <linker name="xlc_r" if="aix">
        <linkerarg value="-b64" if="jni.arch64"/>
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>
      </linker>

      <!-- WIN32 -->
      <linker name="msvc" debug="${jni.debug}" if="win32">
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>

        <linkerarg value="/MACHINE:X64" if="jni.arch64"/>
        <linkerarg value="${jni.info.res}" if="jni.info.res"/>
        <syslibset libs="kernel32,user32,advapi32,ws2_32,netapi32,shell32,pdh,version"/>
      </linker>

      <compiler name="msvc" debug="${jni.debug}" if="win32">
        <defineset>
          <define name="WIN32"/>
          <define name="_CRT_SECURE_NO_DEPRECATE"/>
          <!-- XXX 2008 MSC express/SDK does not include atl headers -->
          <define name="SIGAR_NO_ATL" if="jni.noatl"/>
        </defineset>
      </compiler>

      <!-- OSF1 -->
      <compiler name="gcc" if="osf1">
        <compilerarg value="-Wall"/>
        <compilerarg value="-pthread"/>
        <defineset>
          <define name="${jni.define.name}_OSF1"/>
        </defineset>
      </compiler>

      <linker name="gcc" if="osf1">
        <libset if="jni.libset.libs"
                dir="${jni.libset.dir}"
                libs="${jni.libset.libs}"/>

        <syslibset libs="mach"/>
      </linker>

      <!-- C sources -->
      <fileset dir="${jni.source.dir}">
         <patternset refid="jni.source.files"/>
      </fileset>

      <includepath>
        <path refid="jni.include.dirs"/>
      </includepath>

      <sysincludepath location="${jni.javahome}/include"/>
      <sysincludepath location="${jni.javahome}/include/${jni.jdk.os}"/>
      <sysincludepath location="${jni.dmalloc}/include"
                      if="jni.dmalloc"/>
    </cc>
  </target>

  <target name="jni-clean">
    <delete dir="${jni.objdir}"/>
  </target>

