# Copyright (C) 2004, 2005, 2007 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 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
load_lib target-libpath.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
    global shlib_ext

    set gccpath ${paths}
    set libio_dir ""
    set flags ""
    set ld_library_path "."
    set shlib_ext [get_shlib_extension]
    verbose "shared lib extension: $shlib_ext"

    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"
      }
      # Look for libstdc++.${shlib_ext}.
      if [file exists "${gccpath}/libstdc++-v3/src/.libs/libstdc++.${shlib_ext}"] {
	  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 "
      }

      set objcpath "[get_multilibs]"
      set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc.a]
      if { $libobjc_dir == ""} {
	  set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
      }
      # Now check if we have a shared only build.
      if { $libobjc_dir == ""} {
	  set libobjc_dir \
	      [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
      }
      if { $libobjc_dir == ""} {
	  set libobjc_dir \
	      [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.${shlib_ext}]
      }

      verbose "libobjc_dir: $libobjc_dir"

      if { $libobjc_dir != "" } {
	  set libobjc_dir [file dirname ${libobjc_dir}]
	  append flags "-L${libobjc_dir}"
	  append ld_library_path ":${libobjc_dir}"
      }
      append ld_library_path \
	  [gcc-set-multilib-library-path $OBJCXX_UNDER_TEST]

    } 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} ";
      }
    }

    set_ld_library_path_env_vars

    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" "-fexceptions"

    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 "*-*-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 srcdir
    global gpp_compile_options
    global gluefile wrap_flags
    global ALWAYS_OBJCXXFLAGS
    global OBJCXX_UNDER_TEST
    global shlib_ext

    lappend options "libs=-lobjc"
    set shlib_ext [get_shlib_extension]
    verbose "shared lib extension: $shlib_ext"

    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 options"
      if [regexp ".*-fgnu-runtime.*" "${options}" ] {
	  set libobjc_dir [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.a]
      }
    }
    if { $libobjc_dir == ""} {
	set libobjc_dir \
	    [lookfor_file ${objcpath} libobjc/.libs/libobjc.${shlib_ext}]
    }
    if { $libobjc_dir == ""} {
	verbose "see if we have -fgnu-runtime in options"
	if [regexp ".*-fgnu-runtime.*" "${options}"] {
	 set libobjc_dir \
	     [lookfor_file ${objcpath} libobjc/.libs/libobjc-gnu.${shlib_ext}]
	}
    }

    if { $libobjc_dir != "" } {
	set objc_include_dir "${srcdir}/../../libobjc"
	lappend options "additional_flags=-I${objc_include_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
    }
}
