# Expect script for wrap ELF tests.
#   Copyright (C) 2006-2017 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.
#

# Exclude non-ELF targets.

if ![is_elf_format] {
    return
}

# Skip targets where -shared is not supported

if ![check_shared_lib_support] {
    return
}

# Check if compiler works
if { [which $CC] == 0 } {
    return
}

set build_tests {
  {"Build libwrap1a.so"
   "-shared" "-fPIC"
   {wrap1a.c} {} "libwrap1a.so"}
  {"Build libwrap1b.so"
   "-shared tmpdir/libwrap1a.so" "-fPIC"
   {wrap1b.c} {} "libwrap1b.so"}
}

set run_tests {
    {"Run with libwrap1a.so and libwrap1b.so"
     "-Wl,--no-as-needed,--wrap,par tmpdir/libwrap1a.so tmpdir/libwrap1b.so" ""
     {wrap1.c} "wrap1" "wrap1.out"}
    {"Run with libwrap1b.so and libwrap1a.so"
     "-Wl,--no-as-needed,--wrap,par tmpdir/libwrap1b.so tmpdir/libwrap1a.so" ""
     {wrap1.c} "wrap1" "wrap1.out"}
}

run_cc_link_tests $build_tests
run_ld_link_exec_tests $run_tests
