# am-subdir.at -- libtool subdir-objects support              -*- Autotest -*-

#   Copyright (C) 2004, 2008, 2011-2019, 2021-2026 Free Software
#   Foundation, Inc.
#   Written by Gary V. Vaughan, 2004
#
#   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.  If not, see <https://www.gnu.org/licenses/>.
####


AT_BANNER([Libtool subdir-objects support.])


## ----------- ##
## C Language. ##
## ----------- ##

AT_SETUP([C subdir-objects])

AT_DATA([[configure.ac]],
[[AC_INIT([subdir-demo], ]]AT_PACKAGE_VERSION[[, ]]AT_PACKAGE_BUGREPORT[[)
AM_INIT_AUTOMAKE
LT_INIT([win32-dll])
AC_PROG_CC
AM_PROG_CC_C_O
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
]])

AT_DATA([[Makefile.am]],
[[ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS = subdir-objects foreign 1.6
AM_CPPFLAGS	= -I$(top_srcdir)/../..

lib_LTLIBRARIES		= subdir/libsub.la
subdir_libsub_la_SOURCES= subdir/sub.c

bin_PROGRAMS		= subdir/subdemo
subdir_subdemo_SOURCES	= subdir/main.c
subdir_subdemo_LDADD	= subdir/libsub.la
]])

test -d subdir || { rm -f subdir && mkdir subdir; }

AT_DATA([[subdir/main.c]],
[[#include <stdio.h>

extern void sub (void);

int main (void)
{
  printf ("Welcome to GNU Libtool subdir-objects test!\n");
  sub();
  return 0;
}
]])

AT_DATA([[subdir/sub.c]],
[[#include <stdio.h>
void sub (void) { printf ("** This is libsub **\n"); }
]])

LT_AT_BOOTSTRAP([--copy], [-I m4], [ignore], [--add-missing])

LT_AT_EXEC_CHECK([subdir/subdemo], 0, stdout)
AT_CHECK([$GREP 'Welcome to GNU Libtool subdir-objects test' stdout],
	 [], [ignore])
AT_CHECK([$GREP 'This is libsub' stdout],
	 [], [ignore])

AT_CLEANUP


## ------------- ##
## C++ Language. ##
## ------------- ##

AT_SETUP([C++ subdir-objects])
LT_AT_TAG([CXX])

AT_DATA([[configure.ac]],
[[AC_INIT([subdir-demo], ]]AT_PACKAGE_VERSION[[, ]]AT_PACKAGE_BUGREPORT[[)
AM_INIT_AUTOMAKE
AC_PROG_CC
AM_PROG_CC_C_O
AC_PROG_CXX
AC_PROG_CXXCPP

AC_LANG([C++])
LT_INIT([win32-dll])

AC_CONFIG_FILES([Makefile])
AC_OUTPUT
]])

AT_DATA([[Makefile.am]],
[[ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS = subdir-objects foreign 1.6
AM_CPPFLAGS	= -I$(top_srcdir)/../..

lib_LTLIBRARIES		= subdir/libsub.la
subdir_libsub_la_SOURCES= subdir/sub.cxx subdir/sub.hxx

bin_PROGRAMS		= subdir/subdemo
subdir_subdemo_SOURCES	= subdir/main.cxx
subdir_subdemo_LDADD	= subdir/libsub.la
]])

test -d subdir || { rm -f subdir && mkdir subdir; }

AT_DATA([[subdir/sub.hxx]],
[[class libsub { public: int sub (void); };
]])

AT_DATA([[subdir/main.cxx]],
[[#include "sub.hxx"

int main (void)
{
  libsub SUB;
  return SUB.sub() != 27;
}
]])

AT_DATA([[subdir/sub.cxx]],
[[#include "sub.hxx"

int libsub::sub (void) { return 27; }
]])

LT_AT_BOOTSTRAP([--copy], [-I m4], [ignore], [--add-missing])

LT_AT_EXEC_CHECK([subdir/subdemo], 0)

AT_CLEANUP
