# APPLE LOCAL file mainline
# Copyright (C) 2004 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 2 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 this program; if not, write to the Free Software
# Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

# This file was written by Rob Savoye (rob@cygnus.com)
# Many modifications by Jeffrey Wheat (cassidy@cygnus.com)
# With modifications by Mike Stump <mrs@cygnus.com>.

#
# obj-c++ support library routines
#
load_lib prune.exp
load_lib gcc-defs.exp

#
# OBJCXX_UNDER_TEST is the compiler under test.
#


set gpp_compile_options ""

#
# obj-c++_version -- extract and print the version number of the compiler
#

proc obj-c++_version { } {
    global OBJCXX_UNDER_TEST
    
    obj-c++_init

    # ignore any arguments after the command
    set compiler [lindex $OBJCXX_UNDER_TEST 0]
    
    # verify that the compiler exists
    if { [is_remote host] || [which $compiler] != 0 } then {
	set tmp [remote_exec host "$compiler -v"]
	set status [lindex $tmp 0];
	set output [lindex $tmp 1];
	regexp " version \[^\n\r\]*" $output version
	if { $status == 0 && [info exists version] } then {
	    if [is_remote host] {
		clone_output "$compiler $version\n"
	    } else {
		clone_output "[which $compiler] $version\n"
	    }
	} else {
	    clone_output "Couldn't determine version of [which $compiler]\n"
	}
    } else {
	# compiler does not exist (this should have already been detected)
	warning "$compiler does not exist"
    }
}

#
# obj-c++_include_flags -- provide new version of obj-c++_include_flags
# (originally from libgloss.exp) which knows about the gcc tree structure
#
proc obj-c++_include_flags { paths } {
    global srcdir
    global HAVE_LIBSTDCXX_V3
    global TESTING_IN_BUILD_TREE

    set flags ""

    if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
      return "${flags}"
    }

    set gccpath ${paths}

    set odir [lookfor_file ${gccpath} libstdc++-v3]
    if { ${odir} != "" } {
      append flags [exec sh ${odir}/scripts/testsuite_flags --build-includes]  
    }

    return "$flags"
}

#
# obj-c++_link_flags -- provide new version of obj-c++_link_flags
# (originally from libgloss.exp) which knows about the gcc tree structure
#

proc obj-c++_link_flags { paths } {
    global rootme
    global srcdir
    global ld_library_path
    global OBJCXX_UNDER_TEST

    set gccpath ${paths}
    set libio_dir ""
    set flags ""
    set ld_library_path "."

    if { $gccpath != "" } {
      if [file exists "${gccpath}/lib/libstdc++.a"] {
          append ld_library_path ":${gccpath}/lib"
      }
      if [file exists "${gccpath}/libg++/libg++.a"] {
          append flags "-L${gccpath}/libg++ "
          append ld_library_path ":${gccpath}/libg++"
      }
      if [file exists "${gccpath}/libstdc++/libstdc++.a"] {
          append flags "-L${gccpath}/libstdc++ "
          append ld_library_path ":${gccpath}/libstdc++"
      }
      if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.a"] {
          append flags " -L${gccpath}/libstdc++-v3/src/.libs "
          append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
      }
      if [file exists "${gccpath}/libiberty/libiberty.a"] {
          append flags "-L${gccpath}/libiberty "
      }
      if [file exists "${gccpath}/librx/librx.a"] {
          append flags "-L${gccpath}/librx "
      }
      append ld_library_path ":${rootme}"
      set compiler [lindex $OBJCXX_UNDER_TEST 0]
      if { [is_remote host] == 0 && [which $compiler] != 0 } {
	foreach i "[exec $compiler --print-multi-lib]" {
	  set mldir ""
	  regexp -- "\[a-z0-9=/\.-\]*;" $i mldir
	  set mldir [string trimright $mldir "\;@"]
	  if { "$mldir" == "." } {
	    continue
	  }
	  if { [llength [glob -nocomplain ${rootme}/${mldir}/libgcc_s*.so.*]] == 1 } {
	    append ld_library_path ":${rootme}/${mldir}"
	  }
	}
      }
    } else {
      global tool_root_dir;

      set libgpp [lookfor_file ${tool_root_dir} libg++];
      if { $libgpp != "" } {
          append flags "-L${libgpp} ";
          append ld_library_path ":${libgpp}"
      }
      set libstdcpp [lookfor_file ${tool_root_dir} libstdc++];
      if { $libstdcpp != "" } {
          append flags "-L${libstdcpp} ";
          append ld_library_path ":${libstdcpp}"
      }
      set libiberty [lookfor_file ${tool_root_dir} libiberty];
      if { $libiberty != "" } {
          append flags "-L${libiberty} ";
      }
      set librx [lookfor_file ${tool_root_dir} librx];
      if { $librx != "" } {
          append flags "-L${librx} ";
      }
    }

    # On IRIX 6, we have to set variables akin to LD_LIBRARY_PATH, but
    # called LD_LIBRARYN32_PATH (for the N32 ABI) and LD_LIBRARY64_PATH
    # (for the 64-bit ABI).  The right way to do this would be to modify
    # unix.exp -- but that's not an option since it's part of DejaGNU
    # proper, so we do it here.
    # The same applies to Darwin (DYLD_LIBRARY_PATH), Solaris 32 bit
    # (LD_LIBRARY_PATH_32), Solaris 64 bit (LD_LIBRARY_PATH_64), and HP-UX
    # (SHLIB_PATH).
    # Doing this does cause trouble when testing cross-compilers.
    if {![is_remote target]} {
	global env;
	if [info exists env(LD_LIBRARY_PATH)] {
	    # If we've already added these directories once, keep the
	    # existing path.
	    if {$ld_library_path == $env(LD_LIBRARY_PATH)
		|| [string first $ld_library_path: \
				 $env(LD_LIBRARY_PATH)] == 0} {
		set ld_library_path $env(LD_LIBRARY_PATH)
	    } elseif { $env(LD_LIBRARY_PATH) != "" } {
		append ld_library_path ":$env(LD_LIBRARY_PATH)"
	    }
	}
	setenv  LD_LIBRARY_PATH     $ld_library_path
	setenv  SHLIB_PATH          $ld_library_path
	setenv  LD_LIBRARYN32_PATH  $ld_library_path
	setenv  LD_LIBRARY64_PATH   $ld_library_path
	setenv  LD_LIBRARY_PATH_32  $ld_library_path
	setenv  LD_LIBRARY_PATH_64  $ld_library_path
	setenv  DYLD_LIBRARY_PATH   $ld_library_path
    }

    return "$flags"
}

#
# obj-c++_init -- called at the start of each subdir of tests
#

proc obj-c++_init { args } {
    global subdir
    global gpp_initialized
    global base_dir
    global tmpdir
    global libdir
    global gluefile wrap_flags;
    global objdir srcdir
    global ALWAYS_OBJCXXFLAGS
    global TOOL_EXECUTABLE TOOL_OPTIONS
    global OBJCXX_UNDER_TEST
    global TESTING_IN_BUILD_TREE
    global target_triplet

    if ![info exists OBJCXX_UNDER_TEST] then {
	if [info exists TOOL_EXECUTABLE] {
	    set OBJCXX_UNDER_TEST $TOOL_EXECUTABLE;
	} else {
	    if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
		set OBJCXX_UNDER_TEST [transform c++]
	    } else {
		set OBJCXX_UNDER_TEST [findfile $base_dir/../g++ "$base_dir/../g++ -B$base_dir/../" [findfile $base_dir/g++ "$base_dir/g++ -B$base_dir/" [transform c++]]]
	    }
	}
    }

    # Bleah, nasty. Bad taste.
    if [ishost "*-dos-*" ] {
	regsub "c\\+\\+" "$OBJCXX_UNDER_TEST" "gcc" OBJCXX_UNDER_TEST
    }

    if ![is_remote host] {
	if { [which $OBJCXX_UNDER_TEST] == 0 } then {
	    perror "OBJCXX_UNDER_TEST ($OBJCXX_UNDER_TEST) does not exist"
	    exit 1
	}
    }
    if ![info exists tmpdir] {
	set tmpdir "/tmp"
    }

    if [info exists gluefile] {
	unset gluefile
    }

    obj-c++_maybe_build_wrapper "${tmpdir}/obj-c++-testglue.o"

    set ALWAYS_OBJCXXFLAGS ""

    if ![is_remote host] {
	if [info exists TOOL_OPTIONS] {
	    lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs ${TOOL_OPTIONS}] ]";
	    lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs ${TOOL_OPTIONS}] ]";
	} else {
	    lappend ALWAYS_OBJCXXFLAGS "additional_flags=[obj-c++_include_flags [get_multilibs] ]";
	    lappend ALWAYS_OBJCXXFLAGS "ldflags=[obj-c++_link_flags [get_multilibs] ]";
	}
    }

    if [info exists TOOL_OPTIONS] {
	lappend ALWAYS_OBJCXXFLAGS "additional_flags=$TOOL_OPTIONS";
    }

    # Make sure that lines are not wrapped.  That can confuse the
    # error-message parsing machinery.
    lappend ALWAYS_OBJCXXFLAGS "additional_flags=-fmessage-length=0"

    if { [string match "powerpc-*-darwin*" $target_triplet] } {
	lappend ALWAYS_OBJCXXFLAGS "ldflags=-multiply_defined suppress"
       }

    verbose -log "ALWAYS_OBJCXXFLAGS set to $ALWAYS_OBJCXXFLAGS"

    verbose "obj-c++ is initialized" 3
}

#
# obj-c++_target_compile -- compile a source file
#

proc obj-c++_target_compile { source dest type options } {
    global tmpdir;
    global gpp_compile_options
    global gluefile wrap_flags
    global ALWAYS_OBJCXXFLAGS;
    global OBJCXX_UNDER_TEST;

    lappend options "libs=-lobjc"

    if { [target_info needs_status_wrapper] != "" && [info exists gluefile] } {
	lappend options "libs=${gluefile}"
	lappend options "ldflags=${wrap_flags}"
    }

    # If we have built libobjc along with the compiler (which usually
    # _is not_ the case on Mac OS X systems), point the test harness
    # at it (and associated headers).

    set objcpath "[get_multilibs]"

    set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a]
    if { $libobjc_dir == ""} {
      verbose "see if we have -fgnu-runtime in [target_info name]"
      if [regexp ".*-fgnu-runtime.*" [target_info name]] {
        set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
      }
    }
    if { $libobjc_dir != "" } {
	set objc_include_dir "${srcdir}/../../libobjc"
	lappend options "additional_flags=-I${objc_include_dir}"
	set libobjc_dir [file dirname ${libobjc_dir}]
	set objc_link_flags "-L${libobjc_dir}"
	lappend options "additional_flags=${objc_link_flags}"
	append ld_library_path ":${libobjc_dir}"
    }

    lappend options "additional_flags=[libio_include_flags]"
    lappend options "compiler=$OBJCXX_UNDER_TEST";

    set options [concat $gpp_compile_options $options]

    set options [concat "$ALWAYS_OBJCXXFLAGS" $options];

    if { [regexp "(^| )-frepo( |$)" $options] && \
	 [regexp "\.o(|bj)$" $dest] } then {
	regsub "\.o(|bj)$" $dest ".rpo" rponame
	exec rm -f $rponame
    }

    set options [dg-additional-files-options $options $source]

    set result [target_compile $source $dest $type $options]

    return $result
}

#
# ${tool}_option_help
#

proc ${tool}_option_help { } {
    send_user " --additional_options,OPTIONS\t\tUse OPTIONS to compile the testcase files. OPTIONS should be comma-separated.\n"
}

#
# ${tool}_option_proc
#

proc ${tool}_option_proc { option } {
    if [regexp "^--additional_options," $option] {
	global gpp_compile_options
	regsub "--additional_options," $option "" option
	foreach x [split $option ","] {
	    lappend gpp_compile_options "additional_flags=$x"
	}
	return 1;
    } else {
	return 0
    }
}
