# - Find JNI java libraries.
# This module finds if Java is installed and determines where the
# include files and libraries are. It also determines what the name of
# the library is. This code sets the following variables:
#
#  JNI_INCLUDE_DIRS      = the include dirs to use
#  JNI_LIBRARIES         = the libraries to use
#  JAVA_AWT_LIBRARY      = the path to the jawt library
#  JAVA_JVM_LIBRARY      = the path to the jvm library
#  JAVA_INCLUDE_PATH     = the include path to jni.h
#  JAVA_INCLUDE_PATH2    = the include path to jni_md.h
#  JAVA_AWT_INCLUDE_PATH = the include path to jawt.h
#

#=============================================================================
# Copyright 2001-2009 Kitware, Inc.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# * Redistributions of source code must retain the above copyright
#   notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
#   notice, this list of conditions and the following disclaimer in the
#   documentation and/or other materials provided with the distribution.
#
# * Neither the names of Kitware, Inc., the Insight Software Consortium,
#   nor the names of their contributors may be used to endorse or promote
#   products derived from this software without specific prior written
#   permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#=============================================================================

# Expand {libarch} occurences to java_libarch subdirectory(-ies) and set ${_var}
macro(JAVA_APPEND_LIBRARY_DIRECTORIES _var)
    # Determine java arch-specific library subdir
    if (CMAKE_SYSTEM_NAME MATCHES "Linux")
        # Based on openjdk/jdk/make/common/shared/Platform.gmk as of 6b16
        # and kaffe as of 1.1.8 which uses the first part of the
        # GNU config.guess platform triplet.
        if (CMAKE_SYSTEM_PROCESSOR MATCHES "^i[3-9]86$")
            set(_java_libarch "i386")
        elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
            set(_java_libarch "amd64" "x86_64")
        elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^ppc")
            set(_java_libarch "ppc" "powerpc" "ppc64")
        elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "^sparc")
            set(_java_libarch "sparc" "sparcv9")
        else (CMAKE_SYSTEM_PROCESSOR MATCHES "^i[3-9]86$")
            set(_java_libarch "${CMAKE_SYSTEM_PROCESSOR}")
        endif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i[3-9]86$")
    else (CMAKE_SYSTEM_NAME MATCHES "Linux")
        set(_java_libarch "i386" "amd64" "ppc") # previous default
    endif (CMAKE_SYSTEM_NAME MATCHES "Linux")

    foreach(_path ${ARGN})
        if (_path MATCHES "{libarch}")
            foreach(_libarch ${_java_libarch})
                string(REPLACE "{libarch}" "${_libarch}" _newpath "${_path}")
                list(APPEND ${_var} "${_newpath}")
            endforeach(_libarch)
        else (_path MATCHES "{libarch}")
            list(APPEND ${_var} "${_path}")
        endif (_path MATCHES "{libarch}")
    endforeach(_path)
endmacro(JAVA_APPEND_LIBRARY_DIRECTORIES)

file(TO_CMAKE_PATH "$ENV{JAVA_HOME}" _JAVA_HOME)

get_filename_component(java_install_version
  "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit;CurrentVersion]" NAME
)

set(JAVA_AWT_LIBRARY_DIRECTORIES
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/lib"
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/lib"
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/lib"
)


java_append_library_directories(JAVA_AWT_LIBRARY_DIRECTORIES
    ${_JAVA_HOME}/jre/lib/{libarch}
    ${_JAVA_HOME}/jre/lib
    ${_JAVA_HOME}/lib
    ${_JAVA_HOME}
    /usr/lib
    /usr/local/lib
    /usr/lib/jvm/java/lib
    /usr/lib/java/jre/lib/{libarch}
    /usr/local/lib/java/jre/lib/{libarch}
    /usr/local/share/java/jre/lib/{libarch}
    /usr/lib/j2sdk1.4-sun/jre/lib/{libarch}
    /usr/lib/j2sdk1.5-sun/jre/lib/{libarch}
    /opt/sun-jdk-1.5.0.04/jre/lib/{libarch}
    /usr/lib/jvm/java-6-sun/jre/lib/{libarch}
    /usr/lib/jvm/java-1.5.0-sun/jre/lib/{libarch}
    /usr/lib/jvm/java-6-sun-1.6.0.00/jre/lib/{libarch}       # can this one be removed according to #8821 ? Alex
    /usr/lib/jvm/java-openjdk/jre/lib/{libarch}
    /usr/lib/jvm/java-6-openjdk/jre/lib/{libarch}
    /usr/lib/jvm/java-openjdk/jre/lib/{libarch}
    # Debian specific paths for default JVM
    /usr/lib/jvm/default-java/jre/lib/{libarch}
    /usr/lib/jvm/default-java/jre/lib
    /usr/lib/jvm/default-java/lib
)

set(JAVA_JVM_LIBRARY_DIRECTORIES)
foreach (dir ${JAVA_AWT_LIBRARY_DIRECTORIES})
    set(JAVA_JVM_LIBRARY_DIRECTORIES
        ${JAVA_JVM_LIBRARY_DIRECTORIES}
        "${dir}"
        "${dir}/client"
        "${dir}/server"
    )
endforeach (dir)


set(JAVA_AWT_INCLUDE_DIRECTORIES
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.4;JavaHome]/include"
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\1.3;JavaHome]/include"
    "[HKEY_LOCAL_MACHINE\\SOFTWARE\\JavaSoft\\Java Development Kit\\${java_install_version};JavaHome]/include"
    ${_JAVA_HOME}/include
    /usr/include
    /usr/local/include
    /usr/lib/java/include
    /usr/local/lib/java/include
    /usr/lib/jvm/java/include
    /usr/lib/jvm/java-6-sun/include
    /usr/lib/jvm/java-1.5.0-sun/include
    /usr/lib/jvm/java-6-sun-1.6.0.00/include       # can this one be removed according to #8821 ? Alex
    /usr/lib/jvm/java-6-openjdk/include
    /usr/local/share/java/include
    /usr/lib/j2sdk1.4-sun/include
    /usr/lib/j2sdk1.5-sun/include
    /opt/sun-jdk-1.5.0.04/include
    # Debian specific path for default JVM
    /usr/lib/jvm/default-java/include
)

foreach(JAVA_PROG "${JAVA_RUNTIME}" "${JAVA_COMPILE}" "${JAVA_ARCHIVE}" "${JAVA_HEADER}")
    get_filename_component(jpath "${JAVA_PROG}" PATH)
    foreach (JAVA_INC_PATH ../include ../java/include ../share/java/include)
        if (EXISTS ${jpath}/${JAVA_INC_PATH})
            set(JAVA_AWT_INCLUDE_DIRECTORIES
                ${JAVA_AWT_INCLUDE_DIRECTORIES}
                "${jpath}/${JAVA_INC_PATH}"
            )
        endif (EXISTS ${jpath}/${JAVA_INC_PATH})
    endforeach (JAVA_INC_PATH)

    foreach (JAVA_LIB_PATH
            ../lib ../jre/lib ../jre/lib/i386
            ../java/lib ../java/jre/lib ../java/jre/lib/i386
            ../share/java/lib ../share/java/jre/lib ../share/java/jre/lib/i386)
        if (EXISTS ${jpath}/${JAVA_LIB_PATH})
            set(JAVA_AWT_LIBRARY_DIRECTORIES
                ${JAVA_AWT_LIBRARY_DIRECTORIES}
                "${jpath}/${JAVA_LIB_PATH}"
            )
        endif (EXISTS ${jpath}/${JAVA_LIB_PATH})
    endforeach (JAVA_LIB_PATH)
endforeach (JAVA_PROG)

if (APPLE)
    if (EXISTS ~/Library/Frameworks/JavaVM.framework)
        set(JAVA_HAVE_FRAMEWORK 1)
    endif (EXISTS ~/Library/Frameworks/JavaVM.framework)

    if (EXISTS /Library/Frameworks/JavaVM.framework)
        SET(JAVA_HAVE_FRAMEWORK 1)
    endif (EXISTS /Library/Frameworks/JavaVM.framework)

    if (EXISTS /System/Library/Frameworks/JavaVM.framework)
        set(JAVA_HAVE_FRAMEWORK 1)
    endif(EXISTS /System/Library/Frameworks/JavaVM.framework)

    if (JAVA_HAVE_FRAMEWORK)
        if(NOT JAVA_AWT_LIBRARY)
            set(JAVA_AWT_LIBRARY "-framework JavaVM" CACHE FILEPATH "Java Frameworks" FORCE)
        endif(NOT JAVA_AWT_LIBRARY)

        if (NOT JAVA_JVM_LIBRARY)
            set (JAVA_JVM_LIBRARY "-framework JavaVM" CACHE FILEPATH "Java Frameworks" FORCE)
        endif (NOT JAVA_JVM_LIBRARY)

        if (NOT JAVA_AWT_INCLUDE_PATH)
            if (EXISTS /System/Library/Frameworks/JavaVM.framework/Headers/jawt.h)
                set(JAVA_AWT_INCLUDE_PATH "/System/Library/Frameworks/JavaVM.framework/Headers" CACHE FILEPATH "jawt.h location" FORCE)
            endif(EXISTS /System/Library/Frameworks/JavaVM.framework/Headers/jawt.h)
        endif (NOT JAVA_AWT_INCLUDE_PATH)

        #
        # If using "-framework JavaVM", prefer its headers *before* the others in
        # JAVA_AWT_INCLUDE_DIRECTORIES... (*prepend* to the list here)
        #
        set(JAVA_AWT_INCLUDE_DIRECTORIES
            ~/Library/Frameworks/JavaVM.framework/Headers
            /Library/Frameworks/JavaVM.framework/Headers
            /System/Library/Frameworks/JavaVM.framework/Headers
            ${JAVA_AWT_INCLUDE_DIRECTORIES}
        )
    endif(JAVA_HAVE_FRAMEWORK)
else (APPLE)
    find_library(JAVA_AWT_LIBRARY
        NAMES
            jawt
        PATHS
            ${JAVA_AWT_LIBRARY_DIRECTORIES}
    )

    find_library(JAVA_JSIG_LIBRARY
        NAMES
            jsig
        PATHS
            ${JAVA_JVM_LIBRARY_DIRECTORIES}
    )
    find_library(JAVA_JVM_LIBRARY
        NAMES
            jvm
            JavaVM
        PATHS
            ${JAVA_JVM_LIBRARY_DIRECTORIES}
    )
endif (APPLE)

# add in the include path
find_path(JAVA_INCLUDE_PATH
    NAMES
        jni.h
    PATHS
        ${JAVA_AWT_INCLUDE_DIRECTORIES}
)

find_path(JAVA_INCLUDE_PATH2
    NAMES
        jni_md.h
    PATHS
        ${JAVA_INCLUDE_PATH}
        ${JAVA_INCLUDE_PATH}/win32
        ${JAVA_INCLUDE_PATH}/linux
        ${JAVA_INCLUDE_PATH}/freebsd
        ${JAVA_INCLUDE_PATH}/solaris
)

find_path(JAVA_AWT_INCLUDE_PATH
    NAMES
        jawt.h
    PATHS
        ${JAVA_INCLUDE_PATH}
)

set(JNI_LIBRARIES
    ${JAVA_AWT_LIBRARY}
    ${JAVA_JSIG_LIBRARY}
    ${JAVA_JVM_LIBRARY}
)

set(JNI_INCLUDE_DIRS
    ${JAVA_INCLUDE_PATH}
    ${JAVA_INCLUDE_PATH2}
    ${JAVA_AWT_INCLUDE_PATH}
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(JNI DEFAULT_MSG JNI_LIBRARIES JNI_INCLUDE_DIRS JAVA_AWT_LIBRARY JAVA_JSIG_LIBRARY JAVA_JVM_LIBRARY)

mark_as_advanced(JNI_LIBRARIES JNI_INCLUDE_DIRS JAVA_AWT_LIBRARY JAVA_JSIG_LIBRARY JAVA_JVM_LIBRARY)
