# Copyright (C) 2017-2026 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 libphobos-dg.exp

# Immediately exit if target doesn't support shared.
if { ![is-effective-target shared] } {
    return
}

# If a testcase doesn't have special options, use these.
if ![info exists DEFAULT_CFLAGS] then {
    set DEFAULT_CFLAGS "-g"
}

#
# Build all shared libraries, used as dependencies for other tests.
#

proc shared_library { source destfile options } {
    global DEFAULT_DFLAGS
    global all_libraries

    # Compiling with -fno-gnu-unique as tests call dlopen/dlclose multiple times on the same library.
    lappend options "additional_flags=$DEFAULT_DFLAGS -fno-gnu-unique -fpic -shared -shared-libphobos"

    set comp_output [libphobos_target_compile "$source" "$destfile" "executable" $options]
    if ![ string match "" $comp_output ] {
	fail "libphobos.shared/[file tail $source]"
	verbose -log $comp_output
	return 1
    }

    lappend all_libraries $destfile
}

# lib.so
shared_library "$srcdir/$subdir/lib.d" "lib.so" ""

# liblinkdep.so
shared_library "$srcdir/$subdir/liblinkdep.d" "liblinkdep.so" \
	[list "additional_flags=-I$srcdir/$subdir lib.so"]

# libloaddep.so
shared_library "$srcdir/$subdir/libloaddep.d" "libloaddep.so" ""

# lib_13414.so
shared_library "$srcdir/$subdir/lib_13414.d" "lib_13414.so" ""

# plugin.so
shared_library "$srcdir/$subdir/plugin.d" "plugin1.so" ""
shared_library "$srcdir/$subdir/plugin.d" "plugin2.so" ""

set libphobos_skip_tests {
    # Skip some tests: dlopen handles are not unique on Solaris (PR d/88150).
    { libphobos.shared/finalize.d { *-*-solaris2* } }
    { libphobos.shared/load.d { *-*-solaris2* } }
    { libphobos.shared/load_13414.d { *-*-solaris2* } }
}

# Initialize dg.
dg-init

# Main loop.
dg-runtest "$srcdir/$subdir/link.d" "-I$srcdir/$subdir lib.so -shared-libphobos" \
	"$DEFAULT_DFLAGS"

dg-runtest "$srcdir/$subdir/link_linkdep.d" \
	"-I$srcdir/$subdir liblinkdep.so lib.so -shared-libphobos" \
	"$DEFAULT_DFLAGS"

dg-runtest "$srcdir/$subdir/link_loaddep.d" \
	"-I$srcdir/$subdir libloaddep.so -shared-libphobos" "$DEFAULT_DFLAGS"

# dlopen() tests.
if [is-effective-target dlopen] {
    dg-runtest "$srcdir/$subdir/load.d" "-shared-libphobos -ldl" "$DEFAULT_DFLAGS"
    dg-runtest "$srcdir/$subdir/load_linkdep.d" "-shared-libphobos -ldl" "$DEFAULT_DFLAGS"
    dg-runtest "$srcdir/$subdir/load_loaddep.d" "-shared-libphobos -ldl" "$DEFAULT_DFLAGS"
    dg-runtest "$srcdir/$subdir/load_13414.d" "-shared-libphobos -ldl" "$DEFAULT_DFLAGS"
    dg-runtest "$srcdir/$subdir/finalize.d" "-shared-libphobos -ldl" "$DEFAULT_DFLAGS"
}

# C program link tests.
if { [is-effective-target dlopen] && [is-effective-target pthread] } {
    dg-runtest "$srcdir/$subdir/linkD.c" "lib.so -ldl -pthread" "$DEFAULT_CFLAGS"
    dg-runtest "$srcdir/$subdir/linkDR.c" "-shared-libphobos -ldl -pthread" "$DEFAULT_CFLAGS"
    dg-runtest "$srcdir/$subdir/host.c" "-ldl -pthread" "$DEFAULT_CFLAGS"

    # Test requires a command line argument to be passed to the program.
    set libphobos_run_args "${blddir}/src/.libs/libgphobos.${shlib_ext}"
    dg-runtest "$srcdir/$subdir/loadDR.c" "-ldl -pthread -g" "$DEFAULT_CFLAGS"
    set libphobos_run_args ""
}

# All done.
dg-finish

# Remove all libraries built before running tests.
foreach lib $all_libraries {
    catch "file delete -force -- $lib"
}
