| # bug_71489.at test local version of installed program is used |
| |
| # Copyright (C) 2024-2025 Free Software Foundation, Inc. |
| # |
| # 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/>. |
| #### |
| ## --------------------- ## |
| ## Bug testing ## |
| ## --------------------- ## |
| |
| AT_BANNER([Testing bug 71489:]) |
| |
| AT_SETUP([Use local version]) |
| |
| AT_KEYWORDS([bug_71489]) |
| |
| # Create root test directory. |
| top_dir=test71489_1 |
| mkdir $top_dir |
| top_dir=$(cd $top_dir; pwd) |
| |
| # Create the libtool library that the program will depend on. |
| lib=$top_dir/lib |
| mkdir $lib |
| |
| # Create the external library. This is a very simple autotools program, which |
| # contains one function. |
| AT_DATA([[$lib/Makefile.am]], |
| [[ |
| lib_LTLIBRARIES = libltb1.la |
| libltb1_la_SOURCES = libltb1.c |
| libltb1_la_CPPFLAGS=-I$(top_srcdir) |
| ]]) |
| |
| AT_DATA([["$lib/libltb1.c"]], |
| [[ |
| #include <stdio.h> |
| |
| void |
| ltb_version (void) |
| { |
| printf ("ltbug: %s\n", LTBUG_ID); |
| } |
| ]]) |
| |
| # Create src directory, which is linked to the library created above. |
| src=$top_dir/src |
| mkdir $src |
| |
| AT_DATA([["$src/Makefile.am"]], |
| [[ |
| bin_PROGRAMS = ltb1 |
| ltb1_SOURCES = main.c |
| ltb1_LDFLAGS = $(CF_LIB_FLAGS) |
| ltb1_LDADD = ../lib/libltb1.la |
| AM_CPPFLAGS = -I$(top_srcdir) |
| ]]) |
| |
| AT_DATA([["$src/main.c"]], |
| [[ |
| #include <ltb1.h> |
| |
| int |
| main (int argc, char **argv) |
| { |
| ltb_version (); |
| return 0; |
| } |
| ]]) |
| |
| # Create root autotools files and code. |
| AT_DATA([["$top_dir/Makefile.am"]], |
| [[ |
| ACLOCAL_AMFLAGS = -I m4 |
| SUBDIRS = lib src |
| noinst_HEADERS = ltb1.h |
| EXTRA_DIST = test.sh |
| ]]) |
| |
| AT_DATA([["$top_dir/configure.ac"]], |
| [[ |
| AC_PREREQ([2.69]) |
| AC_INIT([ltbug], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[)AC_CONFIG_SRCDIR([src/main.c]) |
| AC_CONFIG_AUX_DIR([build-aux]) |
| AC_CONFIG_MACRO_DIR([m4]) |
| |
| AM_INIT_AUTOMAKE([foreign]) |
| |
| # Checks for programs. |
| AC_PROG_CC |
| LT_PREREQ([2.4.6]) |
| LT_INIT |
| |
| AC_ARG_VAR([LTBUG_ID],[Identifier of the bug case]) |
| if test -z "$LTBUG_ID"; then |
| LTBUG_ID=local |
| fi |
| AC_DEFINE_UNQUOTED([LTBUG_ID],["$LTBUG_ID"], |
| [Text string identifying the library]) |
| |
| AC_SUBST([CF_LIB_FLAGS],['-L$(libdir) -Wl,-rpath -Wl,$(libdir)']) |
| |
| AC_CONFIG_FILES([Makefile lib/Makefile src/Makefile]) |
| |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([["$top_dir/ltb1.h"]], |
| [[ |
| extern void ltb_version (void); |
| extern void ltb2_version (void); |
| ]]) |
| |
| echo "Running autoreconf on project directory" |
| ( |
| cd $top_dir |
| pwd |
| LT_AT_LIBTOOLIZE([--install]) |
| LT_AT_AUTORECONF([-i]) |
| ) |
| |
| # Create two directories, one which has the local copy and one which has |
| # the installed copy. |
| mkdir build_inst build_local prefix_dir |
| |
| prefix=$(cd prefix_dir; pwd) |
| |
| echo "Building and installing library" |
| ( |
| cd build_inst |
| LT_AT_CONFIGURE([--prefix=$prefix LTBUG_ID='installed'], [$top_dir/configure]) |
| LT_AT_MAKE([]) |
| LT_AT_MAKE([install]) |
| ) |
| |
| echo "Building local copy of the project" |
| ( |
| cd build_local |
| LT_AT_CONFIGURE([--prefix=$prefix], [$top_dir/configure]) |
| LT_AT_MAKE([]) |
| LT_AT_MAKE([install]) |
| ) |
| |
| # Although we have installed ltbug, we still expect that we are using the local version. |
| cat > expout <<EOF |
| ltbug: local |
| EOF |
| |
| case $host_os in |
| mingw* | windows*) |
| awk '{printf ("%s\r\n", [$]0);}' < expout > expout.t && mv -f expout.t expout |
| ;; |
| cygwin*) |
| awk '{printf ("%s\n", [$]0);}' < expout > expout.t && mv -f expout.t expout |
| ;; |
| esac |
| |
| build_local/src/ltb1 > stdout |
| |
| echo "Comparing expout to the build binary" |
| AT_CHECK([cmp -s stdout expout], [0]) |
| |
| rm -rf $top_dir $lib $src build_inst build_local prefix_dir |
| |
| # Test local version of installed program is used with external library. |
| |
| # Create root test directory. |
| top_dir=test71489_2 |
| mkdir $top_dir |
| top_dir=$(cd $top_dir; pwd) |
| |
| ext_lib_dir=$top_dir/ltb2dep |
| ltb2=$top_dir/ltb2 |
| |
| # Create ltb2 directory. This will contain two libraries, |
| # liba and libb. liba will depend on an external libtool library. |
| mkdir $ltb2 |
| |
| # Create the directory which will contain the external dependency liba relies on. |
| mkdir $ext_lib_dir |
| |
| # Create the external library. This is a very simple autotools program, which |
| # contains one function. |
| AT_DATA([[$ext_lib_dir/configure.ac]], |
| [[ |
| AC_PREREQ([2.69]) |
| AC_INIT([libltb2dep], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[) |
| AC_CONFIG_SRCDIR([main.c]) |
| AC_CONFIG_AUX_DIR([build-aux]) |
| AC_CONFIG_MACRO_DIR([m4]) |
| |
| AM_INIT_AUTOMAKE([foreign]) |
| |
| AC_PROG_CC |
| LT_PREREQ([2.4.6]) |
| LT_INIT |
| |
| AC_ARG_VAR([LTBUG_ID],[Identifier of the bug case]) |
| if test -z "$LTBUG_ID"; then |
| LTBUG_ID="local version" |
| fi |
| AC_DEFINE_UNQUOTED([LTBUG_ID],["$LTBUG_ID"], |
| [Text string identifying the library]) |
| |
| AC_CONFIG_FILES([Makefile]) |
| |
| AC_OUTPUT |
| ]]) |
| |
| |
| AT_DATA([["$ext_lib_dir/Makefile.am"]], |
| [[ |
| lib_LTLIBRARIES = libltb2dep.la |
| libltb2dep_la_SOURCES = main.c |
| ]]) |
| |
| AT_DATA([["$ext_lib_dir/main.c"]], |
| [[ |
| #include <stdio.h> |
| void |
| dummy (void) |
| { |
| } |
| ]]) |
| |
| # Create liba, which is linked to the external library created above. |
| mkdir "$ltb2/liba" |
| |
| AT_DATA([["$ltb2/liba/Makefile.am"]], |
| [[ |
| lib_LTLIBRARIES = libltb2a.la |
| libltb2a_la_SOURCES = libltb2a.c |
| libltb2a_la_LIBADD = -L$(libdir) -lltb2dep |
| ]]) |
| |
| # Print out the flag LTBUG_ID. This will show if we are using the installed version |
| # of this library or the local version. |
| AT_DATA([["$ltb2/liba/libltb2a.c"]], |
| [[ |
| #include <stdio.h> |
| void |
| ltb2a_version (void) |
| { |
| printf ("ltb2a: %s\n", LTBUG_ID); |
| } |
| ]]) |
| |
| # Create libb, which is NOT linked to the external library. |
| mkdir "$ltb2/libb" |
| |
| AT_DATA([["$ltb2/libb/Makefile.am"]], |
| [[ |
| lib_LTLIBRARIES = libltb2b.la |
| libltb2b_la_SOURCES = libltb2b.c |
| ]]) |
| |
| # The same as for libltb2a.c. Print out the LTBUG_ID flag and see if the local or |
| # installed version is used. |
| AT_DATA([["$ltb2/libb/libltb2b.c"]], |
| [[ |
| #include <stdio.h> |
| void |
| ltb2b_version (void) |
| { |
| printf ("ltb2b: %s\n", LTBUG_ID); |
| } |
| ]]) |
| |
| mkdir $ltb2/src |
| |
| AT_DATA([["$ltb2/src/Makefile.am"]], |
| [[ |
| bin_PROGRAMS = ltb2 |
| ltb2_SOURCES = main.c |
| ltb2_LDADD = ../liba/libltb2a.la ../libb/libltb2b.la |
| AM_CPPFLAGS = -I$(top_srcdir) |
| ]]) |
| |
| # Create a program which outputs the version, local or installed, for both |
| # liba and libb. |
| AT_DATA([["$ltb2/src/main.c"]], |
| [[ |
| #include <ltb2.h> |
| int |
| main (int argc, char **argv) |
| { |
| ltb2a_version (); |
| ltb2b_version (); |
| return 0; |
| } |
| ]]) |
| |
| AT_DATA([["$ltb2/Makefile.am"]], |
| [[ |
| ACLOCAL_AMFLAGS = -I m4 |
| SUBDIRS = liba libb src |
| noinst_HEADERS = ltb2.h |
| ]]) |
| |
| AT_DATA([["$ltb2/configure.ac"]], |
| [[ |
| # -*- Autoconf -*- |
| # Process this file with autoconf to produce a configure script. |
| |
| AC_PREREQ([2.69]) |
| AC_INIT([ltb2], ]AT_PACKAGE_VERSION[, ]AT_PACKAGE_BUGREPORT[) |
| |
| AC_CONFIG_SRCDIR([src/main.c]) |
| AC_CONFIG_AUX_DIR([build-aux]) |
| AC_CONFIG_MACRO_DIR([m4]) |
| |
| AM_INIT_AUTOMAKE([foreign]) |
| |
| AC_PROG_CC |
| LT_PREREQ([2.4.6]) |
| LT_INIT |
| |
| AC_ARG_VAR([LTBUG_ID],[Identifier of the bug case]) |
| if test -z "$LTBUG_ID"; then |
| LTBUG_ID=local |
| fi |
| AC_DEFINE_UNQUOTED([LTBUG_ID],["$LTBUG_ID"], |
| [Text string identifying the library]) |
| |
| AC_CONFIG_FILES([Makefile liba/Makefile libb/Makefile src/Makefile]) |
| |
| AC_OUTPUT |
| ]]) |
| |
| AT_DATA([["$ltb2/ltb2.h"]], |
| [[ |
| extern void ltb2a_version (void); |
| extern void ltb2b_version (void); |
| ]]) |
| |
| echo "Running autoreconf on dependency library and project directory" |
| ( |
| cd $ext_lib_dir |
| LT_AT_LIBTOOLIZE([--install]) |
| LT_AT_AUTORECONF([-i]) |
| cd - |
| cd $ltb2 |
| LT_AT_LIBTOOLIZE([--install]) |
| LT_AT_AUTORECONF([-i]) |
| ) |
| |
| mkdir build_dep build_inst build_local prefix_dir |
| |
| prefix=$(cd prefix_dir; pwd) |
| |
| echo "Building dependency library" |
| ( |
| cd build_dep |
| LT_AT_CONFIGURE([--prefix=$prefix], [$ext_lib_dir/configure]) |
| LT_AT_MAKE([]) |
| LT_AT_MAKE([install]) |
| ) |
| |
| echo "Building and installing project" |
| ( |
| cd build_inst |
| LT_AT_CONFIGURE([--prefix=$prefix LTBUG_ID='installed'], [$ltb2/configure]) |
| LT_AT_MAKE([]) |
| LT_AT_MAKE([install]) |
| ) |
| |
| echo "Building local copy of the project" |
| ( |
| cd build_local |
| LT_AT_CONFIGURE([--prefix=$prefix], [$ltb2/configure]) |
| LT_AT_MAKE([]) |
| |
| case $host_os in |
| openbsd*) |
| build_local_dir=$(pwd) |
| AT_CHECK( |
| [ |
| $LIBTOOL --reorder-cache="$build_local_dir/liba/.libs:$build_local_dir/libb/.libs" |
| ], 0, ignore, ignore);; |
| *) ;; |
| esac |
| ) |
| |
| # Although we have installed ltb2, we still expect that we are using the local |
| # version of ltb2a and ltb2b. |
| cat > expout <<EOF |
| ltb2a: local |
| ltb2b: local |
| EOF |
| |
| case $host_os in |
| mingw* | windows*) |
| awk '{printf ("%s\r\n", [$]0);}' < expout > expout.t && mv -f expout.t expout |
| ;; |
| cygwin*) |
| awk '{printf ("%s\n", [$]0);}' < expout > expout.t && mv -f expout.t expout |
| ;; |
| esac |
| |
| build_local/src/ltb2 > stdout |
| |
| echo "Comparing expout to the build binary" |
| AT_CHECK([cmp -s stdout expout], [0]) |
| |
| AT_CLEANUP |