# Expect script for direct linking from dll tests
#   Copyright 2006, 2007
#   Free Software Foundation, Inc.
#
# This file is part of the GNU Binutils.
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# Written by Pedro Alves <pedro_alves@portugalmail.pt>
#
 
# Note:
# 
# This test checks the "direct linking to a dll" functionality.
# 
# The test has 7 stages:
# 
# 1. compile and link a test dll with ".dll" extension.
#
# 2. compile and link a test dll with ".sl" (i.e. != ".dll") extension.
#
# 3. compile and link a client application linking directly to the ".dll" dll built in 1.
#    This should produce no errors.
#
# 4. compile and link a client application linking directly to the ".sl" dll built in 2.
#    This should produce no errors.
#
# 5. compile and link a client application linking directly to a symlink into 
#    the ".dll" dll built in 1.
#    This should produce no errors.
#
# 6. compile and link a client application linking directly to a symlink into 
#    the ".sl" dll built in 1.
#    This should produce no errors.
#
# 7. run the produced executables

# This test can only be run on PE/COFF platforms.
if {    ![istarget *-*-cygwin*]
     && ![istarget *-*-mingw*]
     && ![istarget *-*-pe] } {
    return
}

# No compiler, no test.
if { [which $CC] == 0 } {
    untested "Direct linking to dll test"
    return
}

set tmpdir tmpdir

proc test_direct_link_dll {} {
    global CC
    global CFLAGS
    global srcdir
    global subdir
    global tmpdir
    
    # Compile the dll.
    if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_dll.c $tmpdir/direct_dll.o ] {
	fail "compiling shared lib"
    } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.dll "$tmpdir/direct_dll.o" ] {
	fail "linking shared lib (.dll)"
    } elseif ![ld_simple_link "$CC -shared" $tmpdir/direct_dll.sl "$tmpdir/direct_dll.o" ] {
	fail "linking shared lib (.sl)"
    } else {
	# Compile and link the client program.
	if ![ld_compile "$CC $CFLAGS" $srcdir/$subdir/direct_client.c $tmpdir/direct_client.o ] {
	    fail "compiling client"
	} else {
	    # Check linking directly to direct_dll.dll.
	    set msg "linking client (.dll)"
	    if [ld_simple_link $CC $tmpdir/direct_client_dll.exe "$tmpdir/direct_client.o $tmpdir/direct_dll.dll" ] {
		pass $msg
	    } else {
		fail $msg 
	    }

	    # Check linking directly to direct_dll.sl.
	    set msg "linking client (.sl)"
	    if [ld_simple_link $CC $tmpdir/direct_client_sl.exe "$tmpdir/direct_client.o $tmpdir/direct_dll.sl" ] {
		pass $msg
	    } else {
		fail $msg 
	    }

	    # Check dll direct linking through symlink to .dll.
	    # Create symbolic link.
	    catch "exec ln -fs direct_dll.dll $tmpdir/libdirect_dll.dll.a" ln_catch
	    set msg "linking client (symlink -> .dll)"
	    if [ld_simple_link $CC $tmpdir/direct_client_symlink_dll.exe "$tmpdir/direct_client.o $tmpdir/libdirect_dll.dll.a" ] {
	        pass $msg
	    } else {
		fail $msg
	    }
		
	    # Check dll direct linking through symlink to .sl.
	    # Create symbolic link.
	    catch "exec ln -fs direct_dll.sl $tmpdir/libdirect_sl.dll.a" ln_catch
	    set msg "linking client (symlink -> .sl)"
	    if [ld_simple_link $CC $tmpdir/direct_client_symlink_sl.exe "$tmpdir/direct_client.o $tmpdir/libdirect_sl.dll.a" ] {
		pass $msg
	    } else {
		fail $msg 
	    }
	}
    }
}

proc directdll_execute {exe msg} {
    set expected ""
    catch "exec $exe" prog_output
    if [string match $expected $prog_output] then {
        pass $msg
    } else {
        verbose $prog_output
        fail $msg
    }
}

test_direct_link_dll

# This is as far as we can go with a cross-compiler
if ![isnative] then {
    verbose "Not running natively, so cannot execute binaries"
    return
}

directdll_execute "$tmpdir/direct_client_dll.exe" "running direct linked dll (.dll)"
directdll_execute "$tmpdir/direct_client_sl.exe" "running direct linked dll (.sl)"
directdll_execute "$tmpdir/direct_client_symlink_sl.exe" "running direct linked dll (symlink -> .sl)"
directdll_execute "$tmpdir/direct_client_symlink_dll.exe" "running direct linked dll (symlink -> .dll)"
