# if CMAKE_LIBTOOL is not set, try and find it with xcrun or find_program
if(NOT CMAKE_LIBTOOL)
  if(NOT CMAKE_XCRUN)
    find_program(CMAKE_XCRUN NAMES xcrun)
  endif()
  if(CMAKE_XCRUN)
    execute_process(COMMAND ${CMAKE_XCRUN} -find libtool
      OUTPUT_VARIABLE CMAKE_LIBTOOL
      OUTPUT_STRIP_TRAILING_WHITESPACE)
  endif()

  if(NOT CMAKE_LIBTOOL OR NOT EXISTS CMAKE_LIBTOOL)
    find_program(CMAKE_LIBTOOL NAMES libtool)
  endif()
endif()

get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
if(CMAKE_LIBTOOL)
  set(CMAKE_LIBTOOL ${CMAKE_LIBTOOL} CACHE PATH "libtool executable")
  message(STATUS "Found libtool - ${CMAKE_LIBTOOL}")

  execute_process(COMMAND ${CMAKE_LIBTOOL} -V
    OUTPUT_VARIABLE LIBTOOL_V_OUTPUT
    OUTPUT_STRIP_TRAILING_WHITESPACE)
  if("${LIBTOOL_V_OUTPUT}" MATCHES ".*cctools-([0-9.]+).*")
    string(REGEX REPLACE ".*cctools-([0-9.]+).*" "\\1" LIBTOOL_VERSION
      ${LIBTOOL_V_OUTPUT})
    if(NOT LIBTOOL_VERSION VERSION_LESS "862")
      set(LIBTOOL_NO_WARNING_FLAG "-no_warning_for_no_symbols")
    endif()
  endif()

  foreach(lang ${languages})
    set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
      "\"${CMAKE_LIBTOOL}\" -static ${LIBTOOL_NO_WARNING_FLAG} -o <TARGET> <LINK_FLAGS> <OBJECTS>")
  endforeach()
endif()

# If DYLD_LIBRARY_PATH is set we need to set it on archiver commands
if(DYLD_LIBRARY_PATH)
  set(dyld_envar "DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}")
  foreach(lang ${languages})
    foreach(cmd ${CMAKE_${lang}_CREATE_STATIC_LIBRARY})
      list(APPEND CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW
           "${dyld_envar} ${cmd}")
    endforeach()
    set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
      ${CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW})
  endforeach()
endif()
