# cwrapper.at -- test cwrapper compliance with standards -*- Autotest -*-

#   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
#   Written by Charles Wilson, 2009
#
#   This file is part of GNU Libtool.
#
# GNU Libtool 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 2 of
# the License, or (at your option) any later version.
#
# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from  http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
####

AT_SETUP([cwrapper for uninstalled executables])
AT_KEYWORDS([libtool])

# make sure existing libtool is configured for shared libraries
AT_CHECK([$LIBTOOL --features | grep 'disable shared libraries' && exit 77],
	 [1], [ignore])

AT_DATA([trivial.c],
[[
int main (void)
{
  return 0;
}
]])
AT_DATA([liba.c],
[[int liba_func1 (int arg)
{
  return arg + 1;
}
]])
AT_DATA([usea.c],
[[extern int liba_func1 (int arg);
int main (void)
{
  int a = 2;
  int b = liba_func1 (a);
  if (b == 3) return 0;
  return 1;
}
]])

orig_CFLAGS=$CFLAGS
orig_LIBTOOL=$LIBTOOL
for restrictive_flags in '-Wall -Werror' '-std=c89 -Wall -Werror' '-std=c99 -Wall -Werror'; do
  CFLAGS="$orig_CFLAGS $restrictive_flags"
  sed "s/LTCFLAGS=.*/&' $restrictive_flags'/" < "$orig_LIBTOOL" > ./libtool
  chmod +x libtool
  LIBTOOL=./libtool

  # Make sure $restrictive_flags do not cause a failure
  # themselves (e.g. because a non-gcc compiler doesn't
  # understand them).  Tru64 cc only fails when linking.
  $LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS trivial.c || continue

  AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c liba.c],
           [], [ignore], [ignore])
  AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -version-info=0.0.0 -no-undefined -o liba.la -rpath /foo liba.lo],
           [], [ignore], [ignore])
  AT_CHECK([test -f liba.la])

  AT_CHECK([$CC $CPPFLAGS $CFLAGS -c usea.c],
           [], [ignore], [ignore])
  AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o usea$EXEEXT usea.$OBJEXT liba.la],
           [], [ignore], [ignore])
  LT_AT_EXEC_CHECK([./usea], [0], [ignore], [ignore], [])
done


# Test run-time activation of wrapper debugging.
# This is not part of the loop above, because we
# need to check, not ignore, the output.
CFLAGS="$orig_CFLAGS"
LIBTOOL=$orig_LIBTOOL

AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c liba.c],
         [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -no-undefined -o liba.la -rpath /foo liba.lo],
         [], [ignore], [ignore])
AT_CHECK([test -f liba.la])

AT_CHECK([$CC $CPPFLAGS $CFLAGS -c usea.c],
         [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o usea$EXEEXT usea.$OBJEXT liba.la],
         [], [ignore], [ignore])
LT_AT_EXEC_CHECK([./usea], [0], [ignore], [stderr], [--lt-debug])
LT_AT_UNIFY_NL([stderr])
AT_CHECK([grep 'libtool wrapper' stderr], [0], [ignore], [ignore])


# Test compile-time activation of wrapper debugging.
# We structure this test as a loop, so that we can 'break' out of it
# if necessary -- even though the loop by design executes only once.
for debugwrapper_flags in '-DLT_DEBUGWRAPPER'; do
  CFLAGS="$orig_CFLAGS $debugwrapper_flags"
  sed -e "s/LTCFLAGS=.*/&' $debugwrapper_flags'/" \
      -e "s/^lt_option_debug=/lt_option_debug=1/" \
    < "$orig_LIBTOOL" > ./libtool
  LIBTOOL=./libtool

  # Make sure $debugwrapper_flags do not cause a failure
  # themselves (e.g. because a non-gcc compiler doesn't
  # understand them).  Tru64 cc only fails when linking.
  $LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS trivial.c || continue

  AT_CHECK([$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c liba.c],
           [], [ignore], [ignore])
  AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -no-undefined -o liba.la -rpath /foo liba.lo],
           [], [ignore], [ignore])
  AT_CHECK([test -f liba.la])

  AT_CHECK([$CC $CPPFLAGS $CFLAGS -c usea.c],
           [], [ignore], [ignore])
  AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o usea$EXEEXT usea.$OBJEXT liba.la],
           [], [ignore], [ignore])
  LT_AT_EXEC_CHECK([./usea], [0], [ignore], [stderr], [])
  LT_AT_UNIFY_NL([stderr])
  AT_CHECK([grep 'libtool wrapper' stderr], [0], [ignore], [ignore])
done


AT_CLEANUP

