1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238
|
# versioning.at -- test libtool versioning -*- Autotest -*-
#
# Copyright (C) 2009, 2010 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; 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([versioning])
AT_KEYWORDS([libtool])
eval "`$LIBTOOL --config | $EGREP '^(objdir|host_os)='`"
# Setup some library and program sources:
# a library (a1), a new revision (a2), a compatible update (a3),
# an incompatible update (a4).
# Another library (libb) using liba, and a couple of programs,
# using liba directly and indirectly through libb.
AT_DATA([liba1.c], [[
int a (void)
{
return 0;
}
]])
AT_DATA([liba2.c], [[
/* The internal detail should be static. It isn't static in this test,
so we can later find out that it's this revision of the library. */
int internal_detail = 42;
int a (void)
{
return internal_detail - 42;
}
]])
AT_DATA([liba3.c], [[
int a (void)
{
return 0;
}
int aa (void)
{
return 0;
}
]])
AT_DATA([liba4.c], [[
int aa (void)
{
return 0;
}
]])
AT_DATA([libb.c], [[
extern int a (void);
int b (void)
{
return a ();
}
]])
AT_DATA([prog1.c], [[
extern int a (void);
int main (void)
{
return a ();
}
]])
AT_DATA([prog2.c], [[
extern int b (void);
int main (void)
{
return b ();
}
]])
inst=`pwd`/inst
libdir=$inst/lib
bindir=$inst/bin
LDFLAGS="$LDFLAGS -no-undefined"
mkdir $inst $libdir $bindir
for file in liba1.c liba2.c liba3.c liba4.c libb.c; do
$LIBTOOL --mode=compile $CC $CPPFLAGS $CFLAGS -c $file
done
for file in prog1.c prog2.c; do
$CC $CPPFLAGS $CFLAGS -c $file
done
# Setup is finished here.
# Hypothesis: -version-info is ignored for convenience archives.
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba1.lo ]dnl
[-version-info 0:0:0], [], [ignore], [stderr])
AT_CHECK([grep 'version-info.*ignored for convenience' stderr], [], [ignore])
# Hypothesis: the deprecated -version-number works.
# Be sure not to use zero here, it's not portable.
for version_number in 1 1:1 2:1 1:1:1 3:2:1; do
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba1.lo ]dnl
[-version-number $version_number -rpath $libdir], [], [ignore], [ignore])
done
# Hypothesis: -version-info can be passed kinds of values, esp. zero ones
# and large ones.
# TODO: check something like 1001:2419:189 after fixing issues
# for `version_type's of `irix', `nonstopux', or `osf'.
for version_info in 1 1:2 0:0:0 1:1:1 13:241:7; do
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba1.lo ]dnl
[-version-info $version_info -rpath $libdir], [], [ignore], [ignore])
done
# Hypothesis: we diagnose when AGE is higher than CURRENT.
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba1.lo ]dnl
[-version-info 1:3:2 -rpath $libdir], [1], [ignore], [stderr])
AT_CHECK([grep 'AGE.*is greater than' stderr], [], [ignore])
# Hypothesis: we diagnose invalid values.
for version_info in 1:2:3:4 -1 0:-1 0:0:-1; do
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba1.lo ]dnl
[-version-info $version_info -rpath $libdir], [1], [ignore], [ignore])
done
# Now, create an original version of the library and associated users.
# This setup will be reused for further hypotheses below, and these
# functions will be used to test working programs.
test_uninstalled ()
{
# temporarily move installed libraries out of the way in order to avoid
# skewing test results:
mv $libdir temp-lib
mv $bindir temp-bin
LT_AT_EXEC_CHECK([./prog1])
LT_AT_EXEC_CHECK([./prog2])
mv temp-lib $libdir
mv temp-bin $bindir
}
test_installed ()
{
# temporarily move uninstalled libraries out of the way in order to avoid
# skewing test results:
mv $objdir temp
LT_AT_EXEC_CHECK([$bindir/prog1])
LT_AT_EXEC_CHECK([$bindir/prog2])
mv temp $objdir
}
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba1.lo ]dnl
[-version-info 0:0:0 -rpath $libdir], [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o libb.la libb.lo liba.la ]dnl
[-version-info 0:0:0 -rpath $libdir], [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o prog1$EXEEXT prog1.$OBJEXT ]dnl
[liba.la], [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o prog2$EXEEXT prog2.$OBJEXT ]dnl
[libb.la], [], [ignore], [ignore])
test_uninstalled
AT_CHECK([$LIBTOOL --mode=install cp liba.la libb.la $libdir],
[], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=install cp prog1$EXEEXT prog2$EXEEXT $bindir],
[], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=clean rm -f liba.la], [], [ignore], [ignore])
test_installed
AT_CHECK([$LIBTOOL --mode=uninstall rm -f $libdir/liba.la], [], [ignore], [ignore])
# Hypothesis: library revision updates do not require (uninstalled
# nor installed) programs or libraries to be relinked.
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba2.lo ]dnl
[-version-info 0:1:0 -rpath $libdir], [], [ignore], [ignore])
test_uninstalled
AT_CHECK([$LIBTOOL --mode=install cp liba.la $libdir], [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=clean rm -f liba.la], [], [ignore], [ignore])
test_installed
# do not uninstall here: the library may be reused in the next test.
# Hypothesis: backward compatible library updates do not require
# (uninstalled nor installed) programs or libraries to be relinked.
# This can have one of several reasons:
# - the soname is the difference between $current and $age, thus
# unchanged; in this case, the newly installed library will be used,
# - the soname is only $current, or we are linking statically, in which case
# the old installed library code will be used,
# - the numbers are not encoded at all, in which case the newly installed
# library will be used.
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba3.lo ]dnl
[-version-info 1:0:1 -rpath $libdir], [], [ignore], [ignore])
# Do not test the uninstalled program, it may be broken (in the second case).
AT_CHECK([$LIBTOOL --mode=install cp liba.la $libdir], [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=clean rm -f liba.la], [], [ignore], [ignore])
test_installed
# do not uninstall here: the library may be reused in the next test.
# Hypothesis: with shared libraries, incompatible library updates
# will not cause old installed programs or libraries (linked against the old
# library version) to break.
# This can have one of several reasons:
# - the soname has changed, so the old installed library will still be
# available,
# - we are linking statically, so the old library code will still be used.
# In order to be sure we are still linking against the old library version,
# we must ensure that libb is not relinked, so we must not reinstall libb here.
AT_CHECK([$LIBTOOL --mode=link $CC $CFLAGS $LDFLAGS -o liba.la liba4.lo ]dnl
[-version-info 2:0:0 -rpath $libdir], [], [ignore], [ignore])
# We do not guarantee that old versions of an uninstalled library are still
# available, so test_uninstalled will not necessarily work here any more.
AT_CHECK([$LIBTOOL --mode=install cp liba.la $libdir], [], [ignore], [ignore])
AT_CHECK([$LIBTOOL --mode=clean rm -f liba.la], [], [ignore], [ignore])
# This test does not work on AIX, not even with runtimelinking, because
# the linker always records the unversioned name as dependency.
AT_CHECK([:; case $host_os in aix*) exit 77;; esac])
test_installed
AT_CLEANUP
|