]> git.ipfire.org Git - thirdparty/automake.git/commitdiff
Merged in Gord's libtool patches
authorTom Tromey <tromey@redhat.com>
Fri, 22 Nov 1996 06:58:20 +0000 (06:58 +0000)
committerTom Tromey <tromey@redhat.com>
Fri, 22 Nov 1996 06:58:20 +0000 (06:58 +0000)
ChangeLog
Makefile.am
automake.in
automake.texi
lib/am/Makefile.am
lib/am/program.am
lib/am/progs.am
program.am
progs.am

index 6f55c82209932160fb0c8125b26b89e9b21f8e45..e98ab4a35e908929e7ed2110fe9b302b30b5eea7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -62,6 +62,12 @@ Fri Nov 15 18:58:04 1996  Tom Tromey  <tromey@cygnus.com>
        files.
        (pretty_print_internal): Initialize $bol depending on the column.
 
+Mon Nov 18 19:11:53 1996  Gordon Matzigkeit  <gord@gnu.ai.mit.edu>
+
+       * automake.in: Added a lot of libtool support.  New variable
+       prog_LDFLAGS to pass linker flags.  Use libtoolize to install
+       libtool support files.
+
 Fri Nov 15 16:22:15 1996  Gordon Matzigkeit  <gord@gnu.ai.mit.edu>
 
        * library.am: Fixed references to LIBRARY according to new scheme.
index 91e160dd7f7da9037f70e5debdcd635a10d72ac1..37fbe77f7b3310845df8af613b7a2383862e9b84 100644 (file)
@@ -10,7 +10,7 @@ info_TEXINFOS = automake.texi
 
 pkgdata_DATA = clean-kr.am clean.am compile-kr.am comp-vars.am \
 compile.am data.am dejagnu.am depend.am depend2.am dist-vars.am footer.am \
-header.am header-vars.am kr-extra.am libs.am library.am \
+header.am header-vars.am kr-extra.am libs.am library.am libtool.am ltlibs.am \
 mans-vars.am program.am progs.am remake-hdr.am remake-subd.am \
 remake.am scripts.am subdirs.am tags.am tags-clean.am \
 texi-vers.am texinfos.am libs-clean.am \
index aca276e2aeef117bf97cd2d87185b37d7d57b793..19bc1ac1fad69bb6296791c2fca2b75eeab7bac6 100755 (executable)
@@ -167,6 +167,9 @@ $seen_arg_prog = 0;
 $seen_libtool = 0;
 $libtool_line = 0;
 
+# Files installed by libtoolize.
+@libtoolize_files = ('ltconfig', 'ltmain.sh', 'config.guess', 'config.sub');
+
 # TRUE if we've seen AM_MAINTAINER_MODE.
 $seen_maint_mode = 0;
 
@@ -411,8 +414,7 @@ sub generate_makefile
     {
        # libtool requires some files.
        &require_conf_file_with_conf_line ($libtool_line, $FOREIGN,
-                                          'config.sub', 'config.guess',
-                                          'ltconfig', 'ltmain.sh')
+                                          @libtoolize_files)
            if $seen_libtool;
 
         # AC_CANONICAL_HOST and AC_CANONICAL_SYSTEM need config.guess and
@@ -584,8 +586,15 @@ sub handle_options
 }
 
 # Return object extension.  Just once, put some code into the output.
+# Argument is the name of the output file
 sub get_object_extension
 {
+    local ($out) = @_;
+
+    # Maybe require libtool library object files.
+    local ($l) = '';
+    $l = 'l' if ($out =~ /^lib.*\.la$/);
+
     if (! $dir_holds_sources)
     {
        # Boilerplate.
@@ -615,10 +624,20 @@ sub get_object_extension
        }
 
        # Check for automatic de-ANSI-fication.
-       $dir_holds_sources = '.o';
+       $dir_holds_sources = 'o';
        push (@suffixes, '.c', '.o');
        push (@clean, 'compile');
 
+       if ($seen_libtool)
+       {
+           # Output the libtool compilation rules.
+           $output_rules .= &file_contents ('libtool');
+           &push_phony_cleaners ('libtool');
+
+           push (@suffixes, '.lo');
+           push (@clean, 'libtool');
+       }
+
        if (defined $options{'ansi2knr'})
        {
            if (! $am_c_prototypes)
@@ -666,9 +685,12 @@ sub get_object_extension
 
            push (@clean, 'kr');
            &push_phony_cleaners ('kr');
+
+           # FIXME - should be able to do libtool objects, too.
        }
     }
-    return $dir_holds_sources;
+
+    return '.' . $l . $dir_holds_sources;
 }
 
 # Handle yacc and lex.
@@ -739,6 +761,16 @@ sub handle_yacc_lex_cxx
        &define_variable ('YLWRAP', $config_aux_dir . "/ylwrap");
     }
 
+    #
+    # Handle libtool.
+    #
+    local ($libtool) = '';
+    if ($seen_libtool)
+    {
+       &define_configure_variable ("LIBTOOL");
+       $libtool = '$(LIBTOOL) ';
+    }
+
     #
     # Now handle C++.
     #
@@ -750,13 +782,16 @@ sub handle_yacc_lex_cxx
 
        &define_configure_variable ("CXXFLAGS");
        &define_variable ('CXXCOMPILE', '$(CXX) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CXXFLAGS)');
-       &define_variable ('CXXLINK', '$(CXX) $(LDFLAGS) -o $@');
+       &define_variable ('CXXLINK', $libtool . '$(CXX) $(LDFLAGS) -o $@');
 
        local ($ext);
        foreach $ext (@cxx_list)
        {
            $output_rules .= ("$ext.o:\n"
                              . "\t\$(CXXCOMPILE) -c \$<\n");
+           $output_rules .= ("$ext.lo:\n"
+                             . "\t\$(LIBTOOL) $(CXXCOMPILE) -c \$<\n")
+               if ($seen_libtool);
        }
 
        if (! defined $configure_vars{'CXX'})
@@ -784,7 +819,7 @@ sub handle_yacc_lex_cxx
        &define_configure_variable ('CFLAGS');
        &define_variable ('COMPILE',
                          '$(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)');
-       &define_variable ('LINK', '$(CC) $(LDFLAGS) -o $@');
+       &define_variable ('LINK', $libtool . '$(CC) $(LDFLAGS) -o $@');
 
        if (! defined $configure_vars{'CC'})
        {
@@ -1036,11 +1071,29 @@ sub handle_lib_objects
     local ($lex_ok) = $lex_seen ? 0 : 1;
 
     local ($seen_libobjs) = 0;
+    local ($flagvar) = 0;
 
     foreach $lsearch (&variable_value_as_list ($var))
     {
        # Skip -lfoo and -Ldir.
        next if $lsearch =~ /^-[lL]/;
+       if (! $flagvar && $lsearch =~ /^-/)
+       {
+           if ($var =~ /^(.*)LDADD$/)
+           {
+               $flagvar = $1 . 'LDFLAGS';
+           }
+           if ($flagvar)
+           {
+               &am_line_error ($var, "linker flags such as \`$lsearch' belong in $flagvar");
+           }
+           else
+           {
+               # Only get this error once.
+               $flagvar = 1;
+               &am_line_error ($var, "you cannot use linker flags such as \`$lsearch' in $var");
+           }
+       }
 
        # Assume we have a file of some sort, and push it onto the
        # dependency list.  Autoconf substitutions are not pushed;
@@ -1113,7 +1166,7 @@ sub handle_lib_objects
 # Handle C programs.
 sub handle_programs
 {
-    local (@proglist) = &am_install_var ('-clean',
+    local (@proglist) = &am_install_var ('-clean', '-ltlibs',
                                         'progs', 'PROGRAMS',
                                         'bin', 'sbin', 'libexec', 'pkglib',
                                         'noinst', 'check');
@@ -1125,18 +1178,19 @@ sub handle_programs
        unless $seen_arg_prog;
     $seen_arg_prog = 1;
 
-    local ($obj) = &get_object_extension;
     local ($one_file, $xname, $munge);
 
     local ($seen_libobjs) = 0;
     foreach $one_file (@proglist)
     {
+       local ($obj) = &get_object_extension ($one_file);
+
        # Canonicalize names.
        ($xname = $one_file) =~ tr/A-Za-z0-9_/_/c;
        if ($xname ne $one_file)
        {
            local ($xt);
-           foreach $xt ('_LDADD', '_SOURCES', '_OBJECTS', '_DEPENDENCIES')
+           foreach $xt ('_LDADD', '_LDFLAGS', '_SOURCES', '_OBJECTS', '_DEPENDENCIES')
            {
                &am_line_error ($one_file . $xt,
                                "invalid variable \`" . $one_file . $xt
@@ -1177,6 +1231,12 @@ sub handle_programs
            }
        }
 
+       if (! &variable_defined ($xname . '_LDFLAGS'))
+       {
+           # Define the prog_LDFLAGS variable.
+           &define_variable ($xname . '_LDFLAGS', '');
+       }
+
        if ($lex_file_seen)
        {
            &am_line_error ($one_file . $xt,
@@ -1226,6 +1286,7 @@ sub handle_programs
     }
 }
 
+
 # Handle libraries.
 sub handle_libraries
 {
@@ -1252,7 +1313,6 @@ sub handle_libraries
     }
 
     local ($onelib);
-    local ($obj) = &get_object_extension;
     local ($munge);
     local ($xlib);
     local ($seen_libobjs) = 0;
@@ -1266,6 +1326,8 @@ sub handle_libraries
                            "\`$onelib' is not a standard library name");
        }
 
+       local ($obj) = &get_object_extension ($onelib);
+
        # Canonicalize names.
        ($xlib = $onelib) =~ tr/A-Za-z0-9_/_/c;
        if ($xlib ne $onelib)
@@ -1327,7 +1389,7 @@ sub check_typos
     local ($varname, $primary, $ckey);
     foreach $varname (keys %contents)
     {
-       foreach $primary ('_SOURCES', '_LIBADD', '_LDADD', '_DEPENDENCIES')
+       foreach $primary ('_SOURCES', '_LIBADD', '_LDADD', '_LDFLAGS', '_DEPENDENCIES')
        {
            if ($varname =~ /$primary$/ && ! $content_seen{$varname})
            {
@@ -3756,7 +3818,7 @@ sub initialize_global_constants
     @common_sometimes =
        (
         "aclocal.m4", "acconfig.h", "config.h.top",
-        "config.h.bot", "stamp-h.in", 'stamp-vti', 'ltconfig', 'ltmain.sh'
+        "config.h.bot", "stamp-h.in", 'stamp-vti', @libtoolize_files
         );
 
     $USAGE = "\
@@ -4054,13 +4116,17 @@ sub am_install_var
 {
     local (@args) = @_;
 
-    local ($do_all, $do_clean) = (1, 0);
+    local ($do_clean, $do_ltlibs) = (0, 0);
     while (@args)
     {
        if ($args[0] eq '-clean')
        {
            $do_clean = 1;
        }
+       if ($args[0] eq '-ltlibs')
+       {
+           $do_ltlibs = 1;
+       }
        elsif ($args[0] !~ /^-/)
        {
            last;
@@ -4068,6 +4134,7 @@ sub am_install_var
        shift (@args);
     }
     local ($file, $primary, @prefixes) = @args;
+    unshift (@prefixes, 'lib') if ($do_ltlibs);
 
     local (@used) = ();
     local (@result) = ();
@@ -4129,6 +4196,36 @@ sub am_install_var
                    }
                    next;
                }
+
+               if ($do_ltlibs)
+               {
+                   if ($rcurs =~ /^lib.*\.l?a$/)
+                   {
+                       if (! $seen_libtool)
+                       {
+                           &am_line_error ($one_name,
+                                           "\`$rcurse' is a libtool library name, but AM_PROG_LIBTOOL is not in \`configure.in'");
+                           $seen_libtool = 1;
+                       }
+
+                       # Check that libtool libraries go only into libdir.
+                       if ($rcurs =~ /^lib.*\.la$/ && $X ne 'lib')
+                       {
+                           &am_line_error ($one_name,
+                                           "libtool library \`$rcurs' must only be installed in libdir");
+                       }
+                       elsif ($X =~ /^s?bin|libexec$/)
+                       {
+                           &am_line_error ($one_name,
+                                           "library \`$rcurs' must not be installed in a binary directory");
+                       }
+                   }
+                   elsif ($X eq 'lib')
+                   {
+                       &am_line_error ($one_name,
+                                       "only libraries (not \`$rcurs') may be installed in libdir");
+                   }
+               }
                push (@result, $rcurs);
            }
 
@@ -4160,9 +4257,18 @@ sub am_install_var
                next;
            }
 
-           $output_rules .=
-               &file_contents_with_transform ('s/\@DIR\@/' . $X . '/go',
-                                              $file);
+           if ($do_ltlibs && $X eq 'lib')
+           {
+               $output_rules .=
+                   &file_contents_with_transform ('s/\@DIR\@/' . $X . '/go',
+                                                  'ltlibs');
+           }
+           else
+           {
+               $output_rules .=
+                   &file_contents_with_transform ('s/\@DIR\@/' . $X . '/go',
+                                                  $file);
+           }
 
            push (@uninstall, 'uninstall-' . $X . $primary);
            push (@phony, 'uninstall-' . $X . $primary);
@@ -4195,7 +4301,7 @@ sub am_install_var
 
     # Push here because PRIMARY might be configure time determined.
     push (@all, '$(' . $primary . ')')
-       if $do_all && @used;
+       if @used;
 
     return (@result);
 }
@@ -4266,28 +4372,40 @@ sub require_file_internal
 
                # Only install missing files according to our desired
                # strictness level.
-               if ($add_missing && -f ($am_dir . '/' . $file))
+               if ($add_missing)
                {
                    $trailer = "; installing";
                    $suppress = 1;
-                   # Install the missing file.  Symlink if we can,
-                   # copy if we must.  Note: delete the file first,
-                   # in case it is a dangling symlink.
-                   unlink ($errfile);
-                   if ($symlink_exists)
+
+                   # Maybe run libtoolize.
+                   if ($seen_libtool
+                       && grep ($_ eq $file, @libtoolize_files)
+                       && system ('libtoolize', '--automake'))
                    {
-                       if (! symlink ($am_dir . '/' . $file, $errfile))
-                       {
-                           $suppress = 0;
-                           $trailer .= "; error while making link: $!\n";
-                       }
+                       $suppress = 0;
+                       $trailer .= "; cannot run \`libtoolize': $!";
                    }
-                   else
+                   elsif (-f ($am_dir . '/' . $file))
                    {
-                       if (! system ('cp', $am_dir . '/' . $file, $errfile))
+                       # Install the missing file.  Symlink if we
+                       # can, copy if we must.  Note: delete the file
+                       # first, in case it is a dangling symlink.
+                       unlink ($errfile);
+                       if ($symlink_exists)
+                       {
+                           if (! symlink ($am_dir . '/' . $file, $errfile))
+                           {
+                               $suppress = 0;
+                               $trailer .= "; error while making link: $!\n";
+                           }
+                       }
+                       else
                        {
-                           $suppress = 0;
-                           $trailer .= "\n    error while making link: $!\n";
+                           if (! system ('cp', $am_dir . '/' . $file, $errfile))
+                           {
+                               $suppress = 0;
+                               $trailer .= "\n    error while making link: $!\n";
+                           }
                        }
                    }
                }
index 61757be6bb99581e671efc6c4e90c115be0d4cab..8e58e9aabe0b51183421e0377f591119e29dfb1b 100644 (file)
@@ -655,11 +655,10 @@ This is required if any libraries are built in the package.
 This is required if any C++ source is included.
 @cvindex AC_PROG_CXX
 
-@c @item AM_PROG_LIBTOOL
-@c Automake will turn on processing for @code{libtool} (@pxref{Top, , The
-@c Libtool Manual, libtool.info, The Libtool Manual}).  This work is
-@c still preliminary.
-@c @cvindex AM_PROG_LIBTOOL
+@item AM_PROG_LIBTOOL
+Automake will turn on processing for @code{libtool} (@pxref{Top, , The
+Libtool Manual, libtool.info, The Libtool Manual}).
+@cvindex AM_PROG_LIBTOOL
 
 @item AC_PROG_YACC
 If a Yacc source file is seen, then you must either use this macro or
@@ -934,16 +933,20 @@ mt_SOURCES = @dots{}
 rmt_SOURCES = @dots{}
 @end example
 
+@samp{prog_LDADD} is inappropriate for passing program-specific linker
+flags (except for @samp{-l} and @samp{-L}).  So, use the
+@samp{prog_LDFLAGS} variable for this purpose.
+@vindex _LDFLAGS
+
 It is also occasionally useful to have a program depend on some other
 target which is not actually part of that program.  This can be done
 using the @samp{prog_DEPENDENCIES} variable.  Each program depends on
 the contents of such a variable, but no further interpretation is done.
 
 If @samp{prog_DEPENDENCIES} is not supplied, it is computed by Automake.
-The automatically-assigned value is the contents of @samp{prog_LDADD}
-with all the @samp{-l} and @samp{-L} options removed.  Be warned that
-@file{configure} substitutions are preserved; this can lead to bad
-dependencies if you are not careful.
+The automatically-assigned value is the contents of @samp{prog_LDADD}.
+Be warned that @file{configure} substitutions are preserved; this can
+lead to bad dependencies if you are not careful.
 
 
 @node A Library
@@ -977,6 +980,14 @@ variable.  This should be used for objects determined by
 libcpio_a_LIBADD = @@LIBOBJS@@ @@ALLOCA@@
 @end example
 
+@unnumberedsubsec Building Libraries with @code{libtool}
+
+The innovation used by GNU Libtool (@pxref{Top, , The Libtool Manual,
+libtool.info, The Libtool Manual}) is that libraries are programs.
+
+So, if you have GNU Libtool and want to use it to build your libraries,
+you should use the @samp{lib_PROGRAMS} variable (@pxref{Using Automake,
+, Using Automake with Libtool, libtool.info, The Libtool Manual}).
 
 @node LIBOBJS
 @section Special handling for LIBOBJS and ALLOCA
@@ -1002,7 +1013,7 @@ own compilation in some special cases.
 Some variables are inherited from Autoconf; these are @code{CC},
 @code{CFLAGS}, @code{CPPFLAGS}, @code{DEFS}, @code{LDFLAGS}, and
 @code{LIBS}.
-
+@vindex LDFLAGS
 
 There are some additional variables which Automake itself defines:
 
index 91e160dd7f7da9037f70e5debdcd635a10d72ac1..37fbe77f7b3310845df8af613b7a2383862e9b84 100644 (file)
@@ -10,7 +10,7 @@ info_TEXINFOS = automake.texi
 
 pkgdata_DATA = clean-kr.am clean.am compile-kr.am comp-vars.am \
 compile.am data.am dejagnu.am depend.am depend2.am dist-vars.am footer.am \
-header.am header-vars.am kr-extra.am libs.am library.am \
+header.am header-vars.am kr-extra.am libs.am library.am libtool.am ltlibs.am \
 mans-vars.am program.am progs.am remake-hdr.am remake-subd.am \
 remake.am scripts.am subdirs.am tags.am tags-clean.am \
 texi-vers.am texinfos.am libs-clean.am \
index 03227793f346820538af819e3dc55c37c7a2f517..e91639ed6131210ddc45d14ce64a3fadb8fc2ccc 100644 (file)
@@ -16,4 +16,4 @@
 ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 ## 02111-1307, USA.
 @PROGRAM@: $(@XPROGRAM@_OBJECTS) $(@XPROGRAM@_DEPENDENCIES)
-       $(@XLINK@) $(@XPROGRAM@_OBJECTS) $(@XPROGRAM@_LDADD) $(LIBS)
+       $(@XLINK@) $(@XPROGRAM@_LDFLAGS) $(@XPROGRAM@_OBJECTS) $(@XPROGRAM@_LDADD) $(LIBS)
index 406b2f89f3485d2db3403c70471567537152a25d..bd667e477d7d0740e25f64d0d47c01af8a574f96 100644 (file)
@@ -22,7 +22,10 @@ install-@DIR@PROGRAMS: $(@DIR@_PROGRAMS)
 ## a syntax error in sh.
        list="$(@DIR@_PROGRAMS)"; for p in $$list; do \
          if test -f $$p; then \
-           $(INSTALL_PROGRAM) $$p $(@DIR@dir)/`echo $$p|sed '$(transform)'`; \
+## It is harmless to unconditionally use $(LIBTOOL) here because it
+## will be null in non-libtoolized packages, and even if it is set to
+## a real libtool, its behaviour is identical to normal INSTALL_PROGRAM.
+           $(LIBTOOL) $(INSTALL_PROGRAM) $$p $(@DIR@dir)/`echo $$p|sed '$(transform)'`; \
          else :; fi; \
        done
 
index 03227793f346820538af819e3dc55c37c7a2f517..e91639ed6131210ddc45d14ce64a3fadb8fc2ccc 100644 (file)
@@ -16,4 +16,4 @@
 ## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 ## 02111-1307, USA.
 @PROGRAM@: $(@XPROGRAM@_OBJECTS) $(@XPROGRAM@_DEPENDENCIES)
-       $(@XLINK@) $(@XPROGRAM@_OBJECTS) $(@XPROGRAM@_LDADD) $(LIBS)
+       $(@XLINK@) $(@XPROGRAM@_LDFLAGS) $(@XPROGRAM@_OBJECTS) $(@XPROGRAM@_LDADD) $(LIBS)
index 406b2f89f3485d2db3403c70471567537152a25d..bd667e477d7d0740e25f64d0d47c01af8a574f96 100644 (file)
--- a/progs.am
+++ b/progs.am
@@ -22,7 +22,10 @@ install-@DIR@PROGRAMS: $(@DIR@_PROGRAMS)
 ## a syntax error in sh.
        list="$(@DIR@_PROGRAMS)"; for p in $$list; do \
          if test -f $$p; then \
-           $(INSTALL_PROGRAM) $$p $(@DIR@dir)/`echo $$p|sed '$(transform)'`; \
+## It is harmless to unconditionally use $(LIBTOOL) here because it
+## will be null in non-libtoolized packages, and even if it is set to
+## a real libtool, its behaviour is identical to normal INSTALL_PROGRAM.
+           $(LIBTOOL) $(INSTALL_PROGRAM) $$p $(@DIR@dir)/`echo $$p|sed '$(transform)'`; \
          else :; fi; \
        done