# -*- mode: cmake; conding: utf-8; cmake-tab-width: 4; indent-tabs-mode: nil; -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
cmake_minimum_required(VERSION 2.8.6)

if ( ENABLE_SWIG_JAVA )
    file( GLOB CONLIBNDSCXX_OBJECTS ${CONLIBNDSCXX_LIBRARY_DIRS}/* )

    function(SET_NDS_JAVA_LIBRARY_DIR BUILD_TYPE)
        if (WIN32)
            string(TOUPPER ${BUILD_TYPE} BUILD_TYPE_UPPER)
            set( NDS_LIBRARY_DIR $ENV{PATH} )
            list( INSERT NDS_LIBRARY_DIR 0 "${CMAKE_BINARY_DIR}/bin/${BUILD_TYPE}" )
            set( TMP_NDS_LIBRARY_DIR "" )
            foreach( TMP ${NDS_LIBRARY_DIR} )
                file( TO_NATIVE_PATH ${TMP} TMP )
                string( REPLACE "\\" "\\\\" TMP ${TMP} )
                string( LENGTH "${TMP_NDS_LIBRARY_DIR}" L )
                if( $L LESS 1 )
                    set( TMP_NDS_LIBRARY_DIR ${TMP} )
                else( $L LESS 1 )
                    set( TMP_NDS_LIBRARY_DIR "${TMP_NDS_LIBRARY_DIR}\\\\;${TMP}" )
                endif( $L LESS 1 )
            endforeach( TMP )
            #join( ${TMP_NDS_LIBRARY_DIR} ";" NDS_LIBRARY_DIR )
            set( NDS_LIBRARY_DIR ${TMP_NDS_LIBRARY_DIR} )
            #get_target_property( NDS_LIBRARY_DIR nds2JNI LIBRARY_OUTPUT_DIRECTORY )
            set(BUILD_TYPE_UPPER "_${BUILD_TYPE_UPPER}")
        else (WIN32)
            set(BUILD_TYPE_UPPER "")
            get_target_property( NDS_LIBRARY_DIR nds2 LIBRARY_OUTPUT_DIRECTORY )
        endif(WIN32)
        set( NDS_LIBRARY${BUILD_TYPE_UPPER}_DIR "${NDS_LIBRARY_DIR}"
            CACHE INTERNAL "Internal" )
        set( NDS_LIBRARY_DIR "${NDS_LIBRARY_DIR}"
            CACHE INTERNAL "Internal" )
    endfunction(SET_NDS_JAVA_LIBRARY_DIR )

    set(NDS2_JAR_PACKAGING FALSE
        CACHE PATH "True if the Java bindings should be distributed as a jar file." )


    include_directories( BEFORE
        ${CMAKE_CURRENT_BINARY_DIR}
        ${CMAKE_CURRENT_SOURCE_DIR}
        ${PROJECT_BINARY_DIR}/common/module
        ${PROJECT_SOURCE_DIR}/common/module
        ${nds2-client_INCLUDE_DIRS}
        ${JNI_INCLUDE_PATH}
        ${JAVA_INCLUDE_PATH}
        ${JAVA_INCLUDE_PATH2}
        )
    include_directories(AFTER "/usr/include")


    set(INTERFACE_FILE "nds_java.i")
    set(WRAPPER_FILE "nds2_wrap.cc")
    set(CMAKE_JNI_TARGET true)
    set(built_java_sources
        nds2/availability.java
        nds2/availability_list_type.java
        nds2/availabilityListType.java
        nds2/buffer.java
	      nds2/channel.java
        nds2/channel_names_type.java
	      nds2/connection.java
	      nds2/connection_iterator.java
        nds2/epoch.java
        nds2/epochs_type.java
        nds2/nds2.java
        nds2/segment.java
        nds2/segment_list_type.java
        nds2/simple_availability_list_type.java
        nds2/simple_segment.java
        nds2/simple_segment_list_type.java
        nds2/SWIGTYPE_p_channel__hash_type.java
        nds2/vectorEpochs.java
        nds2/vectorSegment.java
        nds2/vectorSimpleSegment.java
        nds2/vectorSimpleSegmentListType.java
        nds2/channel_predicate.java
        nds2/request_period.java
        nds2/parameters.java
	      nds2/nds2JNI.java)
    set(built_java_classes "")
    set(pathed_built_java_sources "")
    foreach(_NDS_FILE ${built_java_sources})
        string(REGEX REPLACE "^nds2/" ""
            _built_java_class ${_NDS_FILE})
        string(REGEX REPLACE ".java$" ".class"
            _built_java_class ${_built_java_class})
        set(built_java_classes ${built_java_classes} ${_built_java_class})
        set( pathed_built_java_sources
            ${pathed_built_java_sources}
            "${CMAKE_CURRENT_BINARY_DIR}/${_NDS_FILE}" )
    endforeach(_NDS_FILE ${built_java_sources})

    add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/nds2/connection_iterator.java
                COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/connection_iterator.java ${CMAKE_CURRENT_BINARY_DIR}/nds2/connection_iterator.java
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
            )

    set(CMAKE_SWIG_FLAGS -O -package nds2)
    set(CMAKE_SWIG_OUTDIR nds2)
    set_property(SOURCE ${INTERFACE_FILE} PROPERTY CPLUSPLUS ON)
    message( STATUS "Java_VERSION_MAJOR: ${Java_VERSION_MAJOR}")
    set(CMAKE_JAVA_COMPILE_FLAGS -source 1.6 -target 1.6 )
    set(_build_java_sources_cmd "")

    set_source_files_properties(${WRAPPER_FILE} PROPERTIES GENERATED true)
    set(CMAKE_JAVAC_WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
    set(CMAKE_JAVA_CLASS_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/nds2)
    set_source_files_properties(${built_java_sources} PROPERTIES GENERATED true)

    # -------------------------------------------------------------------
    # swig_add_module(nds2JNI java ${INTERFACE_FILE})
    # -------------------------------------------------------------------
    add_custom_command(
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${WRAPPER_FILE}"
        DEPENDS
        COMMAND ${CMAKE_COMMAND}
        ARGS    -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_SWIG_OUTDIR}
        COMMAND ${SWIG_EXECUTABLE}
        ARGS    -java -c++ ${CMAKE_SWIG_FLAGS}
                -I${CMAKE_CURRENT_BINARY_DIR}
                -I${CMAKE_CURRENT_SOURCE_DIR}
                -I${PROJECT_BINARY_DIR}/common/module
                -I${PROJECT_SOURCE_DIR}/common/module
                -o ${WRAPPER_FILE}
                -outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_SWIG_OUTDIR}
                ${INTERFACE_FILE}
    )
    # -------------------------------------------------------------------
    # swig_link_libraries(nds2JNI -static-libstdc++ ${JNI_LIBRARIES} $<TARGET_OBJECTS:ndswrapcxx_obj> ndsclient)
    # -------------------------------------------------------------------
    add_library( nds2JNI SHARED
        "${CMAKE_CURRENT_BINARY_DIR}/${WRAPPER_FILE}"
    )
    target_link_libraries( nds2JNI
        -static-libstdc++
        ${CONLIBNDSCXX_OBJECTS}
        ${JNI_LIBRARIES}
        nds::daqc
    )
    if( WIN32 )
        target_link_libraries( nds2JNI nds::cxx Ws2_32 )
    endif( WIN32 )

    target_requires_cpp11(nds2JNI PUBLIC)
    if ( APPLE )
        swig_add_library(nds2JNI_rpath LANGUAGE java SOURCES ${INTERFACE_FILE})
        swig_link_libraries(nds2JNI_rpath ${JNI_LIBRARIES} nds::cxx)
    endif ( APPLE )
    if (WIN32)
        #................................................................
        # Windows
        #................................................................
        add_custom_command(TARGET nds2JNI POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
            $<TARGET_FILE_DIR:nds2JNI>/$<TARGET_FILE_NAME:nds2JNI> ${CMAKE_CURRENT_BINARY_DIR}/libnds2JNI.jnilib)
    else (WIN32)
        #................................................................
        # Un*x / OSX
        #................................................................
        set_target_properties(nds2JNI
    	    PROPERTIES
            LIBRARY_OUTPUT_DIRECTORY nds2
    	    PREFIX lib
    	    SUFFIX .jnilib)
        if ( APPLE )
            set_target_properties(nds2JNI_rpath
    	        PROPERTIES
                    BUILD_WITH_INSTALL_RPATH TRUE
                    LIBRARY_OUTPUT_DIRECTORY rpath/nds2
                    OUTPUT_NAME nds2JNI
    	            PREFIX lib
    	            SUFFIX .jnilib)
        endif ( APPLE )
    endif(WIN32)

    #--------------------------------------------------------------------
    # Build the JAR library
    #--------------------------------------------------------------------
    message("################################ built_java_sources = ${built_java_sources}")
    add_jar(nds2 ${built_java_sources})
    add_dependencies(nds2 nds2JNI)
    if ( APPLE )
        add_jar(nds2_rpath ${built_java_sources})
        add_dependencies(nds2_rpath nds2JNI_rpath)
    endif ( APPLE )
    #--------------------------------------------------------------------
    # Build java documentation
    #--------------------------------------------------------------------
    if( NOT WIN32 )
    create_javadoc(
        nds2
        FILES ${pathed_built_java_sources}
        CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH}
        INSTALLPATH ${CMAKE_INSTALL_DATADIR}/nds2-client/java
        WINDOWTITLE "NDS2 Client Interface"
        DOCTITLE "<h1>NDS2 Client Interface</h1>"
        AUTHOR TRUE
        USE TRUE
        VERSION TRUE
    )
    add_dependencies( nds2_javadoc nds2 )
    endif( NOT WIN32 )

    #--------------------------------------------------------------------
    # Create JAR of documentation
    #--------------------------------------------------------------------
    if( NOT WIN32 )
    add_custom_target(nds2_javadoc_jar
        ALL
        COMMAND ${CMAKE_COMMAND} -E echo ${JAVA_ARCHIVE} -cvf ${CMAKE_CURRENT_BINARY_DIR}/nds2_javadoc.jar "."
    	COMMAND ${JAVA_ARCHIVE} -cvf ${CMAKE_CURRENT_BINARY_DIR}/nds2_javadoc.jar "."
    	WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/javadoc/nds2"
    	DEPENDS nds2_javadoc)
    endif( NOT WIN32 )
    #--------------------------------------------------------------------
    # Add the JNI library to the jar archive
    #--------------------------------------------------------------------
    add_custom_target(nds2JNIinclusion
        ALL
        COMMAND ${CMAKE_COMMAND} -E copy
            $<TARGET_FILE_DIR:nds2JNI>/$<TARGET_FILE_NAME:nds2JNI> "${CMAKE_CURRENT_BINARY_DIR}/nds2"
    	COMMAND ${JAVA_ARCHIVE} uvf ${CMAKE_CURRENT_BINARY_DIR}/nds2.jar "nds2/$<TARGET_FILE_NAME:nds2JNI>"
    	DEPENDS nds2)
    if ( APPLE )
        add_custom_target(nds2JNIinclusion_rpath
            ALL
            COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/rpath/nds2/"
            COMMAND ${CMAKE_COMMAND} -E copy
                $<TARGET_FILE_DIR:nds2JNI_rpath>/$<TARGET_FILE_NAME:nds2JNI_rpath> "${CMAKE_CURRENT_BINARY_DIR}/rpath/nds2"
    	    COMMAND ${JAVA_ARCHIVE} uvf ${CMAKE_CURRENT_BINARY_DIR}/nds2_rpath.jar -C "${CMAKE_CURRENT_BINARY_DIR}/rpath" "nds2/$<TARGET_FILE_NAME:nds2JNI_rpath>"
    	        DEPENDS nds2_rpath)
        set( FILENAME_NDS2_JAR "${CMAKE_CURRENT_BINARY_DIR}/nds2_rpath.jar" )
    else ( APPLE )
        set( FILENAME_NDS2_JAR "${CMAKE_CURRENT_BINARY_DIR}/nds2.jar" )
    endif ( APPLE )
    #====================================================================
    # Report the configuration
    #====================================================================
    configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/nds2-client-java.cfg.in
        ${CMAKE_CURRENT_BINARY_DIR}/nds2-client-java.cfg
	@ONLY )
    #====================================================================
    # Distribution rules
    #====================================================================
    if( NOT WIN32)
        install(
            FILES ${CMAKE_CURRENT_BINARY_DIR}/nds2-client-java.cfg
            DESTINATION ${CMAKE_INSTALL_FULL_SYSCONFDIR}/${PROJECT_BASENAME}
            COMPONENT JAVA
            )
    endif( NOT WIN32)

    install(
        FILES "${FILENAME_NDS2_JAR}"
        RENAME "nds2.jar"
	DESTINATION ${CMAKE_INSTALL_LIBDIR}/nds2-client/java
	COMPONENT JAVA
    )
    if ( NOT WIN32 )
        install(
            FILES ${CMAKE_CURRENT_BINARY_DIR}/nds2_javadoc.jar
            DESTINATION ${CMAKE_INSTALL_LIBDIR}/nds2-client/java
            COMPONENT JAVA
        )
    endif ( NOT WIN32 )
    foreach(_NDS_FILE ${built_java_classes})
	install(
            FILES ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/nds2.dir/nds2/${_NDS_FILE}
	    DESTINATION ${CMAKE_INSTALL_LIBDIR}/nds2-client/java/nds2
	    COMPONENT JAVA)
    endforeach(_NDS_FILE)

    install(TARGETS nds2JNI
	    DESTINATION ${CMAKE_INSTALL_LIBDIR}/java/nds2
	    COMPONENT JAVA)
    if (WIN32)
      install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/libnds2JNI.jnilib
	  DESTINATION ${CMAKE_INSTALL_LIBDIR}/java/nds2
          COMPONENT JAVA)
    endif(WIN32)
    
    set_nds_java_library_dir( "Release" )
    set_nds_java_library_dir( "Debug" )

ENDIF ( ENABLE_SWIG_JAVA )
