cmake_minimum_required(VERSION 3.7)

project(geofis-prerequisites)

get_filename_component(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" ABSOLUTE)
get_filename_component(CMAKE_EXTERNALS "${CMAKE_EXTERNALS}" ABSOLUTE)
get_filename_component(UTIL_JNI_ROOT "${UTIL_JNI_ROOT}" ABSOLUTE)
get_filename_component(FISPRO_JNI_ROOT "${FISPRO_JNI_ROOT}" ABSOLUTE)
get_filename_component(GEOFIS_JNI_ROOT "${GEOFIS_JNI_ROOT}" ABSOLUTE)
if(BUILD_ZONING)
    get_filename_component(GEOFIS_ZONING_ROOT "${GEOFIS_ZONING_ROOT}" ABSOLUTE)
    get_filename_component(CMAKE_GDAL_SHARE_INSTALL_PREFIX "${CMAKE_GDAL_SHARE_INSTALL_PREFIX}" ABSOLUTE)
else() # ignoring cmake warning "Manually-specified variables were not used by the project"
    set(IGNORE_ME ${GEOFIS_ZONING_ROOT})
    set(IGNORE_ME ${CMAKE_GDAL_SHARE_INSTALL_PREFIX})
endif()    
get_filename_component(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" ABSOLUTE)

include(FISPro)
include(GeoFIS)
include(GetPrerequisites)

require_util()
find_package(UtilJNI REQUIRED)
require_fispro()
find_package(FISProJNI REQUIRED)
require_geofis()
find_package(GeoFISJNI REQUIRED)
if(BUILD_ZONING)
    find_package(GeoFISZoning REQUIRED)
endif()

message(STATUS "CMAKE_STRIP : ${CMAKE_STRIP}")
set(CMAKE_INSTALL_DO_STRIP TRUE)

if(${CMAKE_GENERATOR} MATCHES "MSYS Makefiles")
    set(gp_tool "objdump")
endif()
    
set(PREREQUISITE_PATHS "${Util_RUNTIME_DIR}" "${Boost_LIBRARY_DIRS}" "${Libiconv_RUNTIME_DIR}" "${FISPro_RUNTIME_DIR}" "${GeoFIS_RUNTIME_DIR}" "${CGAL_RUNTIME_DIR}" "${GDAL_RUNTIME_DIR}" "${GEOS_RUNTIME_DIR}")
concat_path(PREREQUISITE_PATH ${PREREQUISITE_PATHS})

message(STATUS "get ${Util_JNI_RUNTIME} prerequisites")
get_prerequisites(${Util_JNI_RUNTIME} Util_JNI_PREREQUISITES TRUE TRUE "${Util_JNI_RUNTIME_DIR}" ${PREREQUISITE_PATH})
foreach(Util_JNI_PREREQUISITE ${Util_JNI_PREREQUISITES})
    if(MSYS)
        find_library(Util_JNI_PREREQUISITE_LIBRARY ${Util_JNI_PREREQUISITE} HINTS ${PREREQUISITE_PATHS})
        set(Util_JNI_PREREQUISITE_LIBRARIES "${Util_JNI_PREREQUISITE_LIBRARIES}" "${Util_JNI_PREREQUISITE_LIBRARY}")
        unset(Util_JNI_PREREQUISITE_LIBRARY CACHE)
    else()
        while(IS_SYMLINK "${Util_JNI_PREREQUISITE}")
        	set(Util_JNI_PREREQUISITE_LIBRARIES "${Util_JNI_PREREQUISITE_LIBRARIES}" "${Util_JNI_PREREQUISITE}")
            execute_process(COMMAND readlink -f "${Util_JNI_PREREQUISITE}" RESULT_VARIABLE errMsg OUTPUT_VARIABLE Util_JNI_PREREQUISITE OUTPUT_STRIP_TRAILING_WHITESPACE)
        endwhile()
        set(Util_JNI_PREREQUISITE_LIBRARIES "${Util_JNI_PREREQUISITE_LIBRARIES}" "${Util_JNI_PREREQUISITE}")
    endif()        
endforeach()

foreach(Util_JNI_PREREQUISITE_LIBRARY ${Util_JNI_PREREQUISITE_LIBRARIES})
    message(STATUS "${Util_JNI_PREREQUISITE_LIBRARY}")
endforeach()
  
message(STATUS "get ${FISPro_JNI_RUNTIME} prerequisites")
get_prerequisites(${FISPro_JNI_RUNTIME} FISPro_JNI_PREREQUISITES TRUE TRUE "${FISPro_JNI_RUNTIME_DIR}" ${PREREQUISITE_PATH})
foreach(FISPro_JNI_PREREQUISITE ${FISPro_JNI_PREREQUISITES})
    if(MSYS)
        find_library(FISPro_JNI_PREREQUISITE_LIBRARY ${FISPro_JNI_PREREQUISITE} HINTS ${PREREQUISITE_PATHS})
        set(FISPro_JNI_PREREQUISITE_LIBRARIES "${FISPro_JNI_PREREQUISITE_LIBRARIES}" "${FISPro_JNI_PREREQUISITE_LIBRARY}")
        unset(FISPro_JNI_PREREQUISITE_LIBRARY CACHE)
    else()
        while(IS_SYMLINK "${FISPro_JNI_PREREQUISITE}")
        	set(FISPro_JNI_PREREQUISITE_LIBRARIES "${FISPro_JNI_PREREQUISITE_LIBRARIES}" "${FISPro_JNI_PREREQUISITE}")
            execute_process(COMMAND readlink -f "${FISPro_JNI_PREREQUISITE}" RESULT_VARIABLE errMsg OUTPUT_VARIABLE FISPro_JNI_PREREQUISITE OUTPUT_STRIP_TRAILING_WHITESPACE)
        endwhile()
        set(FISPro_JNI_PREREQUISITE_LIBRARIES "${FISPro_JNI_PREREQUISITE_LIBRARIES}" "${FISPro_JNI_PREREQUISITE}")
    endif()        
endforeach()

foreach(FISPro_JNI_PREREQUISITE_LIBRARY ${FISPro_JNI_PREREQUISITE_LIBRARIES})
    message(STATUS "${FISPro_JNI_PREREQUISITE_LIBRARY}")
endforeach()
  
message(STATUS "get ${GeoFIS_JNI_RUNTIME} prerequisites")
get_prerequisites(${GeoFIS_JNI_RUNTIME} GeoFIS_JNI_PREREQUISITES TRUE TRUE "${GeoFIS_JNI_RUNTIME_DIR}" ${PREREQUISITE_PATH})
message(STATUS "------GeoFIS_JNI_PREREQUISITE-------")
foreach(GeoFIS_JNI_PREREQUISITE ${GeoFIS_JNI_PREREQUISITES})
    message(STATUS "${GeoFIS_JNI_PREREQUISITE}")
    if(MSYS)
        find_library(GeoFIS_JNI_PREREQUISITE_LIBRARY ${GeoFIS_JNI_PREREQUISITE} HINTS ${PREREQUISITE_PATHS})
        set(GeoFIS_JNI_PREREQUISITE_LIBRARIES "${GeoFIS_JNI_PREREQUISITE_LIBRARIES}" "${GeoFIS_JNI_PREREQUISITE_LIBRARY}")
        unset(GeoFIS_JNI_PREREQUISITE_LIBRARY CACHE)
    else()
        while(IS_SYMLINK "${GeoFIS_JNI_PREREQUISITE}")
        	set(GeoFIS_JNI_PREREQUISITE_LIBRARIES "${GeoFIS_JNI_PREREQUISITE_LIBRARIES}" "${GeoFIS_JNI_PREREQUISITE}")
            execute_process(COMMAND readlink -f "${GeoFIS_JNI_PREREQUISITE}" RESULT_VARIABLE errMsg OUTPUT_VARIABLE GeoFIS_JNI_PREREQUISITE OUTPUT_STRIP_TRAILING_WHITESPACE)
        endwhile()
        set(GeoFIS_JNI_PREREQUISITE_LIBRARIES "${GeoFIS_JNI_PREREQUISITE_LIBRARIES}" "${GeoFIS_JNI_PREREQUISITE}")
    endif()        
endforeach()

message(STATUS "------GeoFIS_JNI_PREREQUISITE_LIBRARY-------")
foreach(GeoFIS_JNI_PREREQUISITE_LIBRARY ${GeoFIS_JNI_PREREQUISITE_LIBRARIES})
    message(STATUS "${GeoFIS_JNI_PREREQUISITE_LIBRARY}")
endforeach()

if(BUILD_ZONING)
    message(STATUS "get ${GeoFIS_ZONING_RUNTIME} prerequisites")
    get_prerequisites(${GeoFIS_ZONING_RUNTIME} GeoFIS_ZONING_PREREQUISITES TRUE TRUE "${GeoFIS_ZONING_RUNTIME_DIR}" ${PREREQUISITE_PATH})
    foreach(GeoFIS_ZONING_PREREQUISITE ${GeoFIS_ZONING_PREREQUISITES})
        if(MSYS)
            find_library(GeoFIS_ZONING_PREREQUISITE_LIBRARY ${GeoFIS_ZONING_PREREQUISITE} HINTS ${PREREQUISITE_PATHS})
            set(GeoFIS_ZONING_PREREQUISITE_LIBRARIES "${GeoFIS_ZONING_PREREQUISITE_LIBRARIES}" "${GeoFIS_ZONING_PREREQUISITE_LIBRARY}")
            unset(GeoFIS_ZONING_PREREQUISITE_LIBRARY CACHE)
        else()
            get_filename_component(GeoFIS_ZONING_PREREQUISITE ${GeoFIS_ZONING_PREREQUISITE} REALPATH)
            set(GeoFIS_ZONING_PREREQUISITE_LIBRARIES "${GeoFIS_ZONING_PREREQUISITE_LIBRARIES}" "${GeoFIS_ZONING_PREREQUISITE}")
        endif()        
    endforeach()
    
    foreach(GeoFIS_ZONING_PREREQUISITE_LIBRARY ${GeoFIS_ZONING_PREREQUISITE_LIBRARIES})
        message(STATUS "${GeoFIS_ZONING_PREREQUISITE_LIBRARY}")
    endforeach()
endif()

install(FILES ${Util_JNI_RUNTIME} DESTINATION .)
install(FILES ${Util_JNI_PREREQUISITE_LIBRARIES} DESTINATION .)
install(FILES ${FISPro_JNI_RUNTIME} DESTINATION .)
install(FILES ${FISPro_JNI_PREREQUISITE_LIBRARIES} DESTINATION .)
install(FILES ${GeoFIS_JNI_RUNTIME} DESTINATION .)
install(FILES ${GeoFIS_JNI_PREREQUISITE_LIBRARIES} DESTINATION .)
if(BUILD_ZONING)
    install(FILES ${GeoFIS_ZONING_RUNTIME} PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION .)
    install(FILES ${GeoFIS_ZONING_PREREQUISITE_LIBRARIES} DESTINATION .)

    if(GDAL_SHARE_DIR)
        install(DIRECTORY ${GDAL_SHARE_DIR}/ DESTINATION ${CMAKE_GDAL_SHARE_INSTALL_PREFIX})
    endif()
endif()

add_custom_target(post_install COMMAND ${CMAKE_STRIP} --strip-all ${CMAKE_INSTALL_PREFIX}/*)
  