# Copyright (C) 2004-2021 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

# This file was contributed by John David Anglin (dave.anglin@nrc-cnrc.gc.ca)

set orig_environment_saved 0
set orig_ld_library_path_saved 0
set orig_ld_run_path_saved 0
set orig_shlib_path_saved 0
set orig_ld_library_path_32_saved 0
set orig_ld_library_path_64_saved 0
set orig_dyld_library_path_saved 0
set orig_path_saved 0
set orig_gcc_exec_prefix_saved 0
set orig_gcc_exec_prefix_checked 0


#######################################
# proc set_gcc_exec_prefix_env_var { }
#######################################

proc set_gcc_exec_prefix_env_var { } {
  global TEST_GCC_EXEC_PREFIX
  global env

  # Set GCC_EXEC_PREFIX for the compiler under test to pick up files not in
  # the build tree from a specified location (normally the install tree).
  if [info exists TEST_GCC_EXEC_PREFIX] {
    setenv GCC_EXEC_PREFIX "$TEST_GCC_EXEC_PREFIX"
  }
}

#######################################
# proc set_ld_library_path_env_vars { }
#######################################

proc set_ld_library_path_env_vars { } {
  global ld_library_path
  global orig_environment_saved
  global orig_ld_library_path_saved
  global orig_ld_run_path_saved
  global orig_shlib_path_saved
  global orig_ld_library_path_32_saved
  global orig_ld_library_path_64_saved
  global orig_dyld_library_path_saved
  global orig_path_saved
  global orig_gcc_exec_prefix_saved
  global orig_gcc_exec_prefix_checked
  global orig_ld_library_path
  global orig_ld_run_path
  global orig_shlib_path
  global orig_ld_library_path_32
  global orig_ld_library_path_64
  global orig_dyld_library_path
  global orig_path
  global orig_gcc_exec_prefix
  global env

  # Save the original GCC_EXEC_PREFIX.
  if { $orig_gcc_exec_prefix_checked == 0 } {
    if [info exists env(GCC_EXEC_PREFIX)] {
      set orig_gcc_exec_prefix "$env(GCC_EXEC_PREFIX)"
      set orig_gcc_exec_prefix_saved 1
    }
    set orig_gcc_exec_prefix_checked 1
  }

  set_gcc_exec_prefix_env_var

  # Setting the ld library path causes trouble when testing cross-compilers.
  if { [is_remote target] } {
    return
  }

  if { $orig_environment_saved == 0 } {
    set orig_environment_saved 1

    # Save the original environment.
    if [info exists env(LD_LIBRARY_PATH)] {
      set orig_ld_library_path "$env(LD_LIBRARY_PATH)"
      set orig_ld_library_path_saved 1
    }
    if [info exists env(LD_RUN_PATH)] {
      set orig_ld_run_path "$env(LD_RUN_PATH)"
      set orig_ld_run_path_saved 1
    }
    if [info exists env(SHLIB_PATH)] {
      set orig_shlib_path "$env(SHLIB_PATH)"
      set orig_shlib_path_saved 1
    }
    if [info exists env(LD_LIBRARY_PATH_32)] {
      set orig_ld_library_path_32 "$env(LD_LIBRARY_PATH_32)"
      set orig_ld_library_path_32_saved 1
    }
    if [info exists env(LD_LIBRARY_PATH_64)] {
      set orig_ld_library_path_64 "$env(LD_LIBRARY_PATH_64)"
      set orig_ld_library_path_64_saved 1
    }
    if [info exists env(DYLD_LIBRARY_PATH)] {
      set orig_dyld_library_path "$env(DYLD_LIBRARY_PATH)"
      set orig_dyld_library_path_saved 1
    }
    if [info exists env(PATH)] {
      set orig_path "$env(PATH)"
      set orig_path_saved 1
    }
  }

  # We need to set ld library path in the environment.  Currently,
  # unix.exp doesn't set the environment correctly for all systems.
  # It only sets SHLIB_PATH and LD_LIBRARY_PATH when it executes a
  # program.  We also need the environment set for compilations, etc.
  #
  # On Darwin, we have to set variables akin to LD_LIBRARY_PATH, but called
  # DYLD_LIBRARY_PATH.  The same applies to Solaris 32 bit
  # (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), and HP-UX
  # (SHLIB_PATH).  In some cases, the variables are independent of
  # LD_LIBRARY_PATH, and in other cases LD_LIBRARY_PATH is used if the
  # variable is not defined.
  #
  # Doing this is somewhat of a hack as ld_library_path gets repeated in
  # SHLIB_PATH and LD_LIBRARY_PATH when unix_load sets these variables.
  if { $orig_ld_library_path_saved } {
    setenv LD_LIBRARY_PATH "$ld_library_path:$orig_ld_library_path"
  } else {
    setenv LD_LIBRARY_PATH "$ld_library_path"
  }
  if { $orig_ld_run_path_saved } {
    setenv LD_RUN_PATH "$ld_library_path:$orig_ld_run_path"
  } else {
    setenv LD_RUN_PATH "$ld_library_path"
  }
  # The default shared library dynamic path search for 64-bit
  # HP-UX executables searches LD_LIBRARY_PATH before SHLIB_PATH.
  # LD_LIBRARY_PATH isn't used for 32-bit executables.  Thus, we
  # set LD_LIBRARY_PATH and SHLIB_PATH as if they were independent.
  if { $orig_shlib_path_saved } {
    setenv SHLIB_PATH "$ld_library_path:$orig_shlib_path"
  } else {
    setenv SHLIB_PATH "$ld_library_path"
  }
  if { $orig_ld_library_path_32_saved } {
    setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path_32"
  } elseif { $orig_ld_library_path_saved } {
    setenv LD_LIBRARY_PATH_32 "$ld_library_path:$orig_ld_library_path"
  } else {
    setenv LD_LIBRARY_PATH_32 "$ld_library_path"
  }
  if { $orig_ld_library_path_64_saved } {
    setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path_64"
  } elseif { $orig_ld_library_path_saved } {
    setenv LD_LIBRARY_PATH_64 "$ld_library_path:$orig_ld_library_path"
  } else {
    setenv LD_LIBRARY_PATH_64 "$ld_library_path"
  }
  if { $orig_dyld_library_path_saved } {
    setenv DYLD_LIBRARY_PATH "$ld_library_path:$orig_dyld_library_path"
  } else {
    setenv DYLD_LIBRARY_PATH "$ld_library_path"
  }
  if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
    if { $orig_path_saved } {
      setenv PATH "$ld_library_path:$orig_path"
    } else {
      setenv PATH "$ld_library_path"
    }
  }

  verbose -log "LD_LIBRARY_PATH=[getenv LD_LIBRARY_PATH]"
  verbose -log "LD_RUN_PATH=[getenv LD_RUN_PATH]"
  verbose -log "SHLIB_PATH=[getenv SHLIB_PATH]"
  verbose -log "LD_LIBRARY_PATH_32=[getenv LD_LIBRARY_PATH_32]"
  verbose -log "LD_LIBRARY_PATH_64=[getenv LD_LIBRARY_PATH_64]"
  verbose -log "DYLD_LIBRARY_PATH=[getenv DYLD_LIBRARY_PATH]"
}

#######################################
# proc restore_gcc_exec_prefix_env_var { }
#######################################

proc restore_gcc_exec_prefix_env_var { } {
  global orig_gcc_exec_prefix_saved
  global orig_gcc_exec_prefix
  global env

  if { $orig_gcc_exec_prefix_saved } {
    setenv GCC_EXEC_PREFIX "$orig_gcc_exec_prefix"
  } elseif [info exists env(GCC_EXEC_PREFIX)] {
    unsetenv GCC_EXEC_PREFIX
  }
}

#######################################
# proc restore_ld_library_path_env_vars { }
#######################################

proc restore_ld_library_path_env_vars { } {
  global orig_environment_saved
  global orig_ld_library_path_saved
  global orig_ld_run_path_saved
  global orig_shlib_path_saved
  global orig_ld_library_path_32_saved
  global orig_ld_library_path_64_saved
  global orig_dyld_library_path_saved
  global orig_path_saved
  global orig_ld_library_path
  global orig_ld_run_path
  global orig_shlib_path
  global orig_ld_library_path_32
  global orig_ld_library_path_64
  global orig_dyld_library_path
  global orig_path
  global env

  restore_gcc_exec_prefix_env_var

  if { $orig_environment_saved == 0 } {
    return
  }

  if { $orig_ld_library_path_saved } {
    setenv LD_LIBRARY_PATH "$orig_ld_library_path"
  } elseif [info exists env(LD_LIBRARY_PATH)] {
    unsetenv LD_LIBRARY_PATH
  }
  if { $orig_ld_run_path_saved } {
    setenv LD_RUN_PATH "$orig_ld_run_path"
  } elseif [info exists env(LD_RUN_PATH)] {
    unsetenv LD_RUN_PATH
  }
  if { $orig_shlib_path_saved } {
    setenv SHLIB_PATH "$orig_shlib_path"
  } elseif [info exists env(SHLIB_PATH)] {
    unsetenv SHLIB_PATH
  }
  if { $orig_ld_library_path_32_saved } {
    setenv LD_LIBRARY_PATH_32 "$orig_ld_library_path_32"
  } elseif [info exists env(LD_LIBRARY_PATH_32)] {
    unsetenv LD_LIBRARY_PATH_32
  }
  if { $orig_ld_library_path_64_saved } {
    setenv LD_LIBRARY_PATH_64 "$orig_ld_library_path_64"
  } elseif [info exists env(LD_LIBRARY_PATH_64)] {
    unsetenv LD_LIBRARY_PATH_64
  }
  if { $orig_dyld_library_path_saved } {
    setenv DYLD_LIBRARY_PATH "$orig_dyld_library_path"
  } elseif [info exists env(DYLD_LIBRARY_PATH)] {
    unsetenv DYLD_LIBRARY_PATH
  }
  if { $orig_path_saved } {
    setenv PATH "$orig_path"
  } elseif [info exists env(PATH)] {
    unsetenv PATH
  }
}

#######################################
# proc get_shlib_extension { }
#######################################

proc get_shlib_extension { } {
    global shlib_ext

    if { [istarget *-*-darwin*] } {
	set shlib_ext "dylib"
    } elseif { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } {
	set shlib_ext "dll"
    } elseif { [istarget hppa*-*-hpux*] } {
	set shlib_ext "sl"
    } else {
	set shlib_ext "so"
    }
    return $shlib_ext
}

