# Copyright 2007, 2008, 2009 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 this program.  If not, see <http://www.gnu.org/licenses/>.

load_lib libgloss.exp

set pascal_init_done 0

# This procedure looks for a suitable pascal compiler
# For now only GNU pascal compiler and Free Pascal compiler
# are searched.
# First, environment variable GPC is checked
# if present, GPC compiler is assumed to be the value of
# that environment variable.
# Second, environment variable FPC is checked
# if present, Free Pascal compiler is assumed to be the value of
# that environment variable.
# Third, gpc executable is searched using `which gpc`  
# Lastly, fpc executable is searched using `which fpc` 
# Using environment variable allows to force
# which compiler is used in testsuite
 
proc pascal_init {} {
    global pascal_init_done
    global pascal_compiler_is_gpc
    global pascal_compiler_is_fpc
    global gpc_compiler
    global fpc_compiler
    global env
 
    if { $pascal_init_done == 1 } {
	return
    }

    set pascal_compiler_is_gpc 0
    set pascal_compiler_is_fpc 0
    set gpc_compiler [transform gpc]
    set fpc_compiler [transform fpc]

    if ![is_remote host] {
	if { [info exists env(GPC)] } {
	    set pascal_compiler_is_gpc 1
	    set gpc_compiler $env(GPC)
	    verbose -log "Assuming GNU Pascal ($gpc_compiler)"
	} elseif { [info exists env(FPC)] } {
	    set pascal_compiler_is_fpc 1
	    set fpc_compiler $env(FPC)
	    verbose -log "Assuming Free Pascal ($fpc_compiler)"
	} elseif { [which $gpc_compiler] != 0 } {
	    set pascal_compiler_is_gpc 1
	    verbose -log "GNU Pascal compiler found"
        } elseif { [which $fpc_compiler] != 0 } {
	    set pascal_compiler_is_fpc 1
	    verbose -log "Free Pascal compiler found"
	}
    }
    set pascal_init_done 1
}   

proc gpc_compile {source dest type options} {
    global gpc_compiler
    set add_flags ""
    if {$type == "object"} {
	append add_flags " -c"
    }

    if { $type == "preprocess" } {
	append add_flags " -E"
    }
    
    if { $type == "assembly" } {
	append add_flags " -S"
    }

    foreach i $options {
	if { $i == "debug" } {
	    if [board_info $dest exists debug_flags] {
		append add_flags " [board_info $dest debug_flags]";
	    } else {
		append add_flags " -g"
	    }
	}
    }

    set result [remote_exec host $gpc_compiler "-o $dest --automake $add_flags $source"]
    return $result
}

proc fpc_compile {source dest type options} {
    global fpc_compiler
    set add_flags ""
    if {$type == "object"} {
	append add_flags " -Cn"
    }

    if { $type == "preprocess" } {
	return "Free Pascal can not preprocess"
    }
    
    if { $type == "assembly" } {
	append add_flags " -al"
    }

    foreach i $options {
	if { $i == "debug" } {
	    if [board_info $dest exists debug_flags] {
		append add_flags " [board_info $dest debug_flags]";
	    } else {
		append add_flags " -g"
	    }
	}
    }

    set result [remote_exec host $fpc_compiler "-o$dest $add_flags $source"]
    return $result
}

proc gdb_compile_pascal {source dest type options} {
    global pascal_init_done
    global pascal_compiler_is_gpc
    global pascal_compiler_is_fpc

    if { $pascal_init_done == 0 } { 
	pascal_init
    }

    if { $pascal_compiler_is_fpc == 1 } {
        set result [fpc_compile $source $dest $type $options]
    } elseif { $pascal_compiler_is_gpc == 1 } {
        set result [gpc_compile $source $dest $type $options]
    } else {
	unsupported "No pascal compiler found"
	return "No pascal compiler. Compilation failed."
    }

    if ![file exists $dest] {
        unsupported "Pascal compilation failed: $result"
        return "Pascal compilation failed."
    }
}

