# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 2000, 2001, 2002, 2003, 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>.

#
# g++ support library routines
#
load_lib prune.exp
load_lib gcc-defs.exp
load_lib target-libpath.exp

#
# GXX_UNDER_TEST is the compiler under test.
#


set gpp_compile_options ""

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

proc g++_version { } {
    global GXX_UNDER_TEST
    
    g++_init

    # ignore any arguments after the command
    set compiler [lindex $GXX_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"
    }
}

#
# g++_include_flags -- provide new version of g++_include_flags
# (originally from libgloss.exp) which knows about the gcc tree structure
#
proc g++_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"
}

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

proc g++_link_flags { paths } {
    global srcdir
    global ld_library_path
    global GXX_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 [gcc-set-multilib-library-path $GXX_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"
}

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

proc g++_init { args } {
    global subdir
    global gpp_initialized
    global base_dir
    global tmpdir
    global libdir
    global gluefile wrap_flags;
    global objdir srcdir
    global ALWAYS_CXXFLAGS
    global CXXFLAGS
    global TOOL_EXECUTABLE TOOL_OPTIONS
    global GXX_UNDER_TEST
    global TESTING_IN_BUILD_TREE
    global target_triplet

    # We set LC_ALL and LANG to C so that we get the same error messages as expected.
    setenv LC_ALL C
    setenv LANG C

    if ![info exists GXX_UNDER_TEST] then {
	if [info exists TOOL_EXECUTABLE] {
	    set GXX_UNDER_TEST $TOOL_EXECUTABLE;
	} else {
	    if { [is_remote host] || ! [info exists TESTING_IN_BUILD_TREE] } {
		set GXX_UNDER_TEST [transform c++]
	    } else {
		set GXX_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\\+\\+" "$GXX_UNDER_TEST" "gcc" GXX_UNDER_TEST
    }

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

    if [info exists gluefile] {
	unset gluefile
    }

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

    if {![info exists CXXFLAGS]} {
	set CXXFLAGS ""
    }

    set ALWAYS_CXXFLAGS ""

    if ![is_remote host] {
	if [info exists TOOL_OPTIONS] {
	    lappend ALWAYS_CXXFLAGS "additional_flags=[g++_include_flags [get_multilibs ${TOOL_OPTIONS}] ]";
	    lappend ALWAYS_CXXFLAGS "ldflags=[g++_link_flags [get_multilibs ${TOOL_OPTIONS}] ]";
	} else {
	    lappend ALWAYS_CXXFLAGS "additional_flags=[g++_include_flags [get_multilibs] ]";
	    lappend ALWAYS_CXXFLAGS "ldflags=[g++_link_flags [get_multilibs] ]";
	}
    }

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

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

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

    verbose -log "ALWAYS_CXXFLAGS set to $ALWAYS_CXXFLAGS"

    verbose "g++ is initialized" 3
}

#
# g++_target_compile -- compile a source file
#

proc g++_target_compile { source dest type options } {
    global tmpdir;
    global gpp_compile_options
    global gluefile wrap_flags
    global ALWAYS_CXXFLAGS;
    global GXX_UNDER_TEST;

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

    lappend options "additional_flags=[libio_include_flags]"
    # APPLE LOCAL begin testsuite multiply defined
    if [ istarget *-*-darwin* ] {
	lappend options "ldflags=-Wl,-multiply_defined,suppress"
    }
    # APPLE LOCAL end testsuite multiply defined
    lappend options "compiler=$GXX_UNDER_TEST";

    set options [concat $gpp_compile_options $options]

    set options [concat "$ALWAYS_CXXFLAGS" $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
    }
}
