#
# Modified/Copied from example in Geant4 version 9.6.2:
#
# http://geant4.web.cern.ch/geant4/
#
# ResolveCompilerPaths - this module defines two macros
#
# RESOLVE_LIBRARIES (XXX_LIBRARIES LINK_LINE)
#  This macro is intended to be used by FindXXX.cmake modules.
#  It parses a compiler link line and resolves all libraries
#  (-lfoo) using the library path contexts (-L/path) in scope.
#  The result in XXX_LIBRARIES is the list of fully resolved libs.
#  Example:
#
#    RESOLVE_LIBRARIES (FOO_LIBRARIES "-L/A -la -L/B -lb -lc -ld")
#
#  will be resolved to
#
#    FOO_LIBRARIES:STRING="/A/liba.so;/B/libb.so;/A/libc.so;/usr/lib/libd.so"
#
#  if the filesystem looks like
#
#    /A:       liba.so         libc.so
#    /B:       liba.so libb.so
#    /usr/lib: liba.so libb.so libc.so libd.so
#
#  and /usr/lib is a system directory.
#
#  Note: If RESOLVE_LIBRARIES() resolves a link line differently from
#  the native linker, there is a bug in this macro (please report it).
#
# RESOLVE_INCLUDES (XXX_INCLUDES INCLUDE_LINE)
#  This macro is intended to be used by FindXXX.cmake modules.
#  It parses a compile line and resolves all includes
#  (-I/path/to/include) to a list of directories.  Other flags are ignored.
#  Example:
#
#    RESOLVE_INCLUDES (FOO_INCLUDES "-I/A -DBAR='\"irrelevant -I/string here\"' -I/B")
#
#  will be resolved to
#
#    FOO_INCLUDES:STRING="/A;/B"
#
#  assuming both directories exist.
#  Note: as currently implemented, the -I/string will be picked up mistakenly (cry, cry)

# Code from Jed Brown:
#  https://github.com/jedbrown/cmake-modules/blob/master/ResolveCompilerPaths.cmake
# See COPYING-CMAKE-SCRIPTS for licensing information (BSD)

#-----------------------------------------------------------------------
# macro resolve_libraries()
#
macro(resolve_libraries LIBS LINK_LINE)
  string(REGEX MATCHALL "((-L|-l|-Wl)([^\" ]+|\"[^\"]+\")|/[^\" ]+(a|so|dll))" _all_tokens "${LINK_LINE}")
  set(_libs_found)
  set(_directory_list)
  foreach(token ${_all_tokens})
    if(token MATCHES "-L([^\" ]+|\"[^\"]+\")")
      # If it's a library path, add it to the list
      string (REGEX REPLACE "^-L" "" token ${token})
      string (REGEX REPLACE "//" "/" token ${token})
      list (APPEND _directory_list ${token})
    elseif(token MATCHES "^(-l([^\" ]+|\"[^\"]+\")|/[^\" ]+(a|so|dll))")
      # It's a library, resolve the path by looking in the list and then (by default) in system directories
      string(REGEX REPLACE "^-l" "" token ${token})
      set(_root)
      if(token MATCHES "^/")
        # We have an absolute path, add root to the search path
          set(_root "/")
      endif()
      set(_lib "NOTFOUND" CACHE FILEPATH "Cleared" FORCE)
      find_library(_lib ${token} HINTS ${_directory_list} ${_root})
      if(_lib)
          string(REPLACE "//" "/" _lib ${_lib})
        list(APPEND _libs_found ${_lib})
      else()
        message(STATUS "Unable to find library ${token}")
      endif()
    endif()
  endforeach()
  set(_lib "NOTFOUND" CACHE INTERNAL "Scratch variable" FORCE)
  # only the LAST occurence of each library is required since there should be no circular dependencies
  if(_libs_found)
    list(REVERSE _libs_found)
    list(REMOVE_DUPLICATES _libs_found)
    list(REVERSE _libs_found)
  endif()
  set(${LIBS} "${_libs_found}")
endmacro()

#-----------------------------------------------------------------------
# macro resolve_includes()
#
macro(resolve_includes INCS COMPILE_LINE)
  string(REGEX MATCHALL "-I([^\" ]+|\"[^\"]+\")" _all_tokens "${COMPILE_LINE}")
  set(_incs_found)
  foreach(token ${_all_tokens})
    string(REGEX REPLACE "^-I" "" token ${token})
    string(REGEX REPLACE "//" "/" token ${token})
    # - Remove any residual quotes (from Fabian Kislat: Bug #1357)
    string(REGEX REPLACE "(^\"|\"$)" "" token ${token})
    if(EXISTS ${token})
      list(APPEND _incs_found ${token})
    else()
      message(STATUS "Include directory ${token} does not exist")
    endif()
  endforeach()
  list(REMOVE_DUPLICATES _incs_found)
  set(${INCS} "${_incs_found}")
endmacro()

