automake-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

FYI: correctly handle `bin_PROGRAMS = foo.la'


From: Alexandre Duret-Lutz
Subject: FYI: correctly handle `bin_PROGRAMS = foo.la'
Date: Thu, 21 Oct 2004 23:37:25 +0200
User-agent: Gnus/5.1003 (Gnus v5.10.3) Emacs/21.3.50 (gnu/linux)

I'm installing this on HEAD and branch-1-9.

Nowadays get_object_extension exist mainly for historic reasons.
It was a 150-line long function in Automake 1.4, with many side
effects.

It used to look at the target being generated to select
the object extension.  Assuming *.la need *.lo objects and 
other target need .$(OBJEXT).  This is wrongly assuming
that only _LTLIBRARIES can be named *.la.  

This selection should rather be based on the primary.  We already
perform such a selection in handle_programs(), handle_libraries(),
handle_ltlibraries() when we decide to emit compile rules for
.o/.obj or .lo.  [This was new in 1.9.]

Some people have abused _PROGRAMS to build Libtool libraries
because of the behavior of get_object_extension.  I believe
the reason is they wanted to bypass the "standard library
name" check when building modules.  (If course this is wrong,
because the handling of programs is not exactly the same of
that of ltlibraries, but it mostly worked.)  Such setup broke
in 1.9, because of the aforementioned change to not emit .lo
build rules for programs.

This patch fixes `bin_PROGRAMS = foo.la' to do what it should do
according to the documentation and common sense: build a program
named `foo.la'.  (This will still break the setups of those
abusing _PROGRAMS, but since these setups do not work with any
version of the 1.9 series that seems OK API-wise).
   
2004-10-21  Alexandre Duret-Lutz  <address@hidden>

        * automake.in (get_object_extension): The extension to use is know
        by the caller, and cannot be selected by looking only at the
        target name.  Simplify this function to simply conditionally
        prepend $U to the given extension.
        (handle_programs, handle_libraries, handle_ltlibraries): Hard-code
        the extension to use.  This way Automake won't mistake a program
        named `foo.la' as a libtool library.
        * tests/primary3.test: New file.
        * tests/Makefile.am (TESTS): Add primary3.test.

Index: automake.in
===================================================================
RCS file: /cvs/automake/automake/automake.in,v
retrieving revision 1.1569.2.5
diff -u -r1.1569.2.5 automake.in
--- automake.in 28 Sep 2004 22:02:53 -0000      1.1569.2.5
+++ automake.in 21 Oct 2004 20:28:32 -0000
@@ -1033,17 +1033,12 @@
   return "\$($varname)"
 }
 
-# get_object_extension ($OUT)
-# ---------------------------
-# Return object extension.  Just once, put some code into the output.
-# OUT is the name of the output file
-sub get_object_extension
-{
-    my ($out) = @_;
-
-    # Maybe require libtool library object files.
-    my $extension = '.$(OBJEXT)';
-    $extension = '.lo' if ($out =~ /\.la$/);
+# get_object_extension ($EXTENSION)
+# ---------------------------------
+# Prefix $EXTENSION with $U if ansi2knr is in use.
+sub get_object_extension ($)
+{
+    my ($extension) = @_;
 
     # Check for automatic de-ANSI-fication.
     $extension = '$U' . $extension
@@ -2254,7 +2249,7 @@
       my ($where, $one_file) = @$pair;
 
       my $seen_libobjs = 0;
-      my $obj = &get_object_extension ($one_file);
+      my $obj = get_object_extension '.$(OBJEXT)';
 
       # Strip any $(EXEEXT) suffix the user might have added, or this
       # will confuse &handle_source_transform and &check_canonical_spelling.
@@ -2374,7 +2369,7 @@
       $where->push_context ("while processing library `$onelib'");
       $where->set (INTERNAL->get);
 
-      my $obj = &get_object_extension ($onelib);
+      my $obj = get_object_extension '.$(OBJEXT)';
 
       # Canonicalize names and check for misspellings.
       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_SOURCES',
@@ -2524,7 +2519,7 @@
       my ($where, $onelib) = @$pair;
 
       my $seen_libobjs = 0;
-      my $obj = &get_object_extension ($onelib);
+      my $obj = get_object_extension '.lo';
 
       # Canonicalize names and check for misspellings.
       my $xlib = &check_canonical_spelling ($onelib, '_LIBADD', '_LDFLAGS',
Index: tests/Makefile.am
===================================================================
RCS file: /cvs/automake/automake/tests/Makefile.am,v
retrieving revision 1.565.2.4
diff -u -r1.565.2.4 Makefile.am
--- tests/Makefile.am   21 Sep 2004 19:26:22 -0000      1.565.2.4
+++ tests/Makefile.am   21 Oct 2004 20:28:32 -0000
@@ -404,6 +404,7 @@
 prefix.test \
 primary.test \
 primary2.test \
+primary3.test \
 proginst.test \
 python.test \
 python2.test \
Index: tests/primary3.test
===================================================================
RCS file: tests/primary3.test
diff -N tests/primary3.test
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ tests/primary3.test 21 Oct 2004 20:28:34 -0000
@@ -0,0 +1,44 @@
+#! /bin/sh
+# Copyright (C) 2004  Free Software Foundation, Inc.
+#
+# This file is part of GNU Automake.
+#
+# GNU Automake 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, or (at your option)
+# any later version.
+#
+# GNU Automake 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 Automake; see the file COPYING.  If not, write to
+# the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# Make sure we can build programs ending in `.la'
+
+required=gcc
+. ./defs || exit 1
+
+set -e
+
+cat >>configure.in <<EOF
+AC_PROG_CC
+AC_OUTPUT
+EOF
+
+cat > Makefile.am << 'END'
+bin_PROGRAMS = foo.la
+foo_la_SOURCES = foo.c
+END
+
+echo 'int main () { return 0; }' > foo.c
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+./configure
+$MAKE

-- 
Alexandre Duret-Lutz





reply via email to

[Prev in Thread] Current Thread [Next in Thread]