# Copyright (C) 2010 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/>.

load_lib libgo.exp

lappend options "additional_flags=-I. -w -g"

if [istarget "*-*-rtems*"] {
    global options

    verbose -log "Executing on host: tar cf FilesystemImage -h -C \
                         $tool_root_dir/$tool/${GOTEST_TMPDIR} ." 
    if [catch "exec tar cf FilesystemImage -h -C \
			 $tool_root_dir/$tool/${GOTEST_TMPDIR} ." error] {
	perror "Error during tar of local filesystem: $error"
	exit 1
    }

    verbose -log "Executing on host: ${RTEMS_BIN2C} FilesystemImage FilesystemImage"
    if [catch "exec ${RTEMS_BIN2C} FilesystemImage FilesystemImage" error] {
	perror "Error when creating FilesystemImage source file: $error"
	exit 1
    }
    set comp_output [target_compile "${RTEMS_LIBGO_INIT}" \
			 "./rtems_libgo_init.o" "object" $options]
    if ![ string match "" $comp_output ] {
	verbose -log $comp_output
	exit 1
    }
}

set object_files [glob -nocomplain "*.o"]
if [info exists gluefile] {
    regsub $gluefile $object_files "" object_files
}

set golibs ""
if [info exists env(GOLIBS)] {
    set golibs "$env(GOLIBS)"
}
set comp_output [go_target_compile "$object_files _testmain.go $golibs" \
			 "./a.exe" "executable" $options]
if ![ string match "" $comp_output ] {
    verbose -log $comp_output
    exit 1
}

set result [libgo_load "./a.exe" "-test.short" ""]

set status [lindex $result 0]

set name "go"
if [info exists env(GOTESTNAME)] {
    set name "$env(GOTESTNAME)"
}

$status $name
