(Old-style number conversion): Correct some typos.
[kopensolaris-gnu/glibc.git] / test-installation.pl
1 #! /usr/bin/perl -w
2
3 # Copyright (C) 1997 Free Software Foundation, Inc.
4 # This file is part of the GNU C Library.
5 # Contributed by Andreas Jaeger <aj@arthur.rhein-neckar.de>, 1997.
6
7 # The GNU C Library is free software; you can redistribute it and/or
8 # modify it under the terms of the GNU Library General Public License as
9 # published by the Free Software Foundation; either version 2 of the
10 # License, or (at your option) any later version.
11
12 # The GNU C Library is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 # Library General Public License for more details.
16
17 # You should have received a copy of the GNU Library General Public
18 # License along with the GNU C Library; see the file COPYING.LIB.  If not,
19 # write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20 # Boston, MA 02111-1307, USA.
21
22
23 $PACKAGE = "libc";
24 $progname = $0;
25 if ($ENV{CC}) {
26   $CC = $ENV{CC};
27 } else {
28   $CC= "gcc";
29 }
30
31 sub usage {
32   print "Usage: test-installation [soversions.mk]\n";
33   print "  --help       print this help, then exit\n";
34   print "  --version    print version number, then exit\n";
35   exit 0;
36 }
37
38 sub installation_problem {
39   print "The script has found some problems with your installation!\n";
40   print "Please read the FAQ and the README file and check the following:\n";
41   print "- Did you change the gcc specs file (neccessary after upgrading from\n";
42   print "  Linux libc5)?\n";
43   print "- Are there any symbolic links of the form libXXX.so to old libraries?\n";
44   print "  Links like libm.so -> libm.so.5 (where libm.so.5 is an old library) are wrong,\n";
45   print "  libm.so should point to the newly installed glibc file - and there should be\n";
46   print "  only one such link (check e.g. /lib and /usr/lib)\n";
47   print "You should restart this script from your build directory after you've\n";
48   print "fixed all problems!\n";
49   print "Btw. the script doesn't work if you're installing GNU libc not as your\n";
50   print "primary library!\n";
51   exit 1;
52 }
53
54 arglist: while (@ARGV) {
55   if ($ARGV[0] eq "--v" || $ARGV[0] eq "--ve" || $ARGV[0] eq "--ver" ||
56       $ARGV[0] eq "--vers" || $ARGV[0] eq "--versi" ||
57       $ARGV[0] eq "--versio" || $ARGV[0] eq "--version") {
58     print "test-installation (GNU $PACKAGE)\n";
59     print "Copyright (C) 1997 Free Software Foundation, Inc.\n";
60     print "This is free software; see the source for copying conditions.  There is NO\n";
61     print "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n";
62     print "Written by Andreas Jaeger <aj\@arthur.rhein-neckar.de>\n";
63
64     exit 0;
65   } elsif ($ARGV[0] eq "--h" || $ARGV[0] eq "--he" || $ARGV[0] eq "--hel" ||
66            $ARGV[0] eq "--help") {
67     &usage;
68   } elsif ($ARGV[0] =~ /^-/) {
69     print "$progname: unrecognized option `$ARGV[0]'\n";
70     print "Try `$progname --help' for more information.\n";
71     exit 1;
72   } else {
73     last arglist;
74   }
75 }
76
77 # We expect none or one argument.
78 if ($#ARGV == -1) {
79     $soversions="soversions.mk";
80 } elsif ($#ARGV == 0) {
81     if (-d $ARGV[0]) {
82       $soversions = "$ARGV[0]/soversions.mk";
83     } else {
84       $soversions = $ARGV[0];
85     }
86 } else {
87     die "Wrong number of arguments.";
88 }
89
90
91 # Read names and versions of all shared libraries that are part of
92 # glibc
93 open SOVERSIONS, $soversions
94   or die ("Couldn't open $soversions in build directory!");
95
96 $link_libs = "";
97 %versions = ();
98
99 while (<SOVERSIONS>) {
100   next if (/^all-sonames/);
101   chop;
102   if (/^lib/) {
103     ($name, $version)= /^lib(.*)\.so-version=\.(.*)$/;
104     if ($name ne "nss_ldap") {
105       $link_libs .= " -l$name";
106       $versions{$name} = $version;
107     }
108   } else {
109     if (/^ld\.so/) {
110       ($ld_so_name, $ld_so_version)= /=(.*)\.so\.(.*)$/;
111     }
112   }
113 }
114
115 close SOVERSIONS;
116
117 # Create test program and link it against all
118 # shared libraries
119
120 open PRG, ">/tmp/test-prg$$.c"
121   or die ("Couldn't write test file /tmp/test-prg$$.c");
122
123 print PRG '
124 #include <stdlib.h>
125 int main(void) {
126   printf ("Your new glibc installation seems to be ok.\n");
127   exit (0);
128 }
129 ';
130 close PRG;
131
132 open GCC, "$CC /tmp/test-prg$$.c $link_libs -o /tmp/test-prg$$ 2>&1 |"
133   or die ("Couldn't execute $CC!");
134
135 while (<GCC>) {
136   print $_ if (! /warning/);
137 }
138 close GCC;
139 if ($?) {
140   print "Execution of $CC failed!\n";
141   &installation_problem;
142 }
143
144 # Test if test program is linked against the right versions of
145 # shared libraries
146
147 $ok = 1;
148 %found = ();
149
150 open LDD, "ldd /tmp/test-prg$$ |"
151   or die ("Couldn't execute ldd");
152 while (<LDD>) {
153   if (/^\s*lib/) {
154     ($name, $version1, $version2) =
155       /^\s*lib(\w*)\.so\.([0-9\.]*)\s*=>.*\.so\.([0-9\.]*)/;
156     $found{$name} = 1;
157     if ($versions{$name} ne $version1 || $version1 ne $version2) {
158       print "Library lib$name is not correctly installed.\n";
159       print "Please check your installation!\n";
160       print "Offending line of ldd output: $_\n";
161       $ok = 0;
162     }
163   }
164   if (/$ld_so_name/) {
165     ($version1, $version2) =
166       /$ld_so_name\.so\.([0-9\.]*)\s*=>.*\.so\.([0-9\.]*)/;
167     if ($version1 ne $version2 || $version1 ne $ld_so_version) {
168       print "The dynamic linker $ld_so_name.so is not correctly installed.\n";
169       print "Please check your installation!\n";
170       print "Offending line of ldd output: $_\n";
171       $ok = 0;
172     }
173   }
174 }
175
176 close LDD;
177 die "ldd execution failed" if $?;
178
179 foreach (keys %versions) {
180   unless ($found{$_}) {
181     print "Library lib$_ is not correctly installed since the test program\n";
182     print "was not linked dynamically against it.\n";
183     print "Do you have a file/link lib$_.so?\n";
184     $ok = 0;
185   }
186 }
187
188 &installation_problem unless $ok;
189
190 # Finally execute the test program
191 system ("/tmp/test-prg$$") == 0
192   or die ("Execution of test program failed");
193
194 # Clean up after ourselves
195 unlink ("/tmp/test-prg$$", "/tmp/test-prg$$.c");