# cache result to avoid re-running
#
if(NOT HAVE_FORTRAN_LIBRARIES)

# search for libraries required to link with fortran
# placed in the variable
#  FORTRAN_LIBRARIES
# the location is in
#  FORTRAN_COMPILER_LIB_DIRECTORY

# Need Fortran support for this
ENABLE_LANGUAGE(Fortran)

# these two can be used by the user to guide the process
GET_FILENAME_COMPONENT(fortran_comp_dir ${fortran_bin_dir}       PATH)
SET(FORTRAN_COMPILER_DIRECTORY ${fortran_comp_dir} CACHE PATH "location of fortran compiler top directory")
SET(FORTRAN_COMPILER_LIB_DIRECTORY ${fortran_comp_dir}/lib CACHE PATH "location of fortran compiler lib directory")

SET(KNOWN_FORTRAN_LIBRARIES
   ""
   "gfortran"
   "fio\;f90math\;f77math"
   "afio\;af90math\;af77math\;amisc"
   "g2c"
)

# Define the list "options" of all possible schemes that we want to consider
# Get its length and initialize the counter "iopt" to zero
LIST(LENGTH KNOWN_FORTRAN_LIBRARIES imax)
SET(iopt 0)

# Try to link against fortran libraries
WHILE(${iopt} LESS ${imax})
    # Get the current list entry (current scheme)
    LIST(GET KNOWN_FORTRAN_LIBRARIES ${iopt} fc_libraries_t)

    STRING(REGEX REPLACE ";" "\\\;" fc_libraries "${fc_libraries_t}")

    FILE(WRITE ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testF77libs.c
        "        void main(int argc, char ** argv) {}\n"
    )
    # Create a CMakeLists.txt file which will generate the "flib" library
    FILE(WRITE ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CMakeLists.txt
        "PROJECT(FortranTest Fortran)\n"
        "SET(CMAKE_Fortran_FLAGS \"${TMP_Fortran_FLAGS}\")\n"
        "ADD_LIBRARY(flib ftest.f)\n"
        )
    # Create a simple Fortran source
    FILE(WRITE ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/ftest.f
        "        PROGRAM fortransub\n"
        "        print *, 'hello world'\n"
        "        print *, ' value = ', atan(-1.0)\n"
        "        STOP\n"
        "        END\n"
    )

    # Use TRY_COMPILE to make the target "flib"
    TRY_COMPILE(
        FTEST_OK
        ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp
        ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp
        flib
        OUTPUT_VARIABLE MY_OUTPUT)
    #message("${MY_OUTPUT}")
    if(NOT FTEST_OK)
        MESSAGE(FATAL_ERROR "Failed to compile simple fortran library")
    endif(NOT FTEST_OK)

    SET(trial_libraries "${fc_libraries}\;flib")
    SET(trial_lib_paths "${FORTRAN_COMPILER_LIB_DIRECTORY}\;${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp")

    #MESSAGE(STATUS "    trying libraries ${fc_libraries_t}")

    TRY_COMPILE(FORT_LIBS_WORK ${CMAKE_BINARY_DIR}
         ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testF77libs.c
         CMAKE_FLAGS
         -DLINK_LIBRARIES:STRING=${trial_libraries}
         -DLINK_DIRECTORIES:STRING=${trial_lib_paths}
         OUTPUT_VARIABLE FORT_LIBS_BUILD_OUT
         )
    #MESSAGE(STATUS ${FORT_LIBS_BUILD_OUT})

    IF(FORT_LIBS_WORK)
        # the goal is to set this to something useful
        SET(FORTRAN_LIBRARIES ${fc_libraries} CACHE STRING "fortran libraries required to link with f90 generated code" FORCE)

        MESSAGE(STATUS "Using FORTRAN_LIBRARIES ${FORTRAN_LIBRARIES}")
        MESSAGE(STATUS "Using FORTRAN_COMPILER_LIB_DIRECTORY ${FORTRAN_COMPILER_LIB_DIRECTORY}")

        SET(HAVE_FORTRAN_LIBRARIES TRUE CACHE INTERNAL "successfully found fortran libraries")
        SET(iopt ${imax})
        LINK_DIRECTORIES(${FORTRAN_COMPILER_LIB_DIRECTORY})
    ELSE(FORT_LIBS_WORK)
        MATH(EXPR iopt ${iopt}+1)
    ENDIF(FORT_LIBS_WORK)
ENDWHILE(${iopt} LESS ${imax})

  IF(NOT HAVE_FORTRAN_LIBRARIES)
    MESSAGE(FATAL_ERROR "Could not find valid fortran link libraries. Try setting FORTRAN_COMPILER_DIRECTORY or FORTRAN_LIBRARIES")
  ENDIF(NOT HAVE_FORTRAN_LIBRARIES)

endif(NOT HAVE_FORTRAN_LIBRARIES)
