automake-patches
[Top][All Lists]
Advanced

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

Re: AM_DEFAULT_SOURCE_EXT


From: Ralf Wildenhues
Subject: Re: AM_DEFAULT_SOURCE_EXT
Date: Sun, 2 Nov 2008 22:58:08 +0100
User-agent: Mutt/1.5.18 (2008-05-17)

Hi Akim,

hope I'm not going on your nerves yet .. ;-)

* Ralf Wildenhues wrote on Tue, Oct 21, 2008 at 05:00:34AM CEST:
> * Akim Demaille wrote on Mon, Oct 20, 2008 at 12:56:23AM CEST:
> > Le 18 oct. 08 à 03:02, Ralf Wildenhues a écrit :
> >> * Akim Demaille wrote on Thu, Oct 16, 2008 at 04:11:22PM CEST:
> >>>
> >>>  AM_DEFAULT_SOURCE_EXT = .cc

> > Hum, actually I meant to use extensions without the dot :(
> 
> Erm, but you certainly didn't write it that way before!  ;-)
> 
> > Trying to  find a distinctive meaning to extension and suffix…  Of
> > course you  should add a period before an extension to get a suffix
> > only when the  extension is non-empty :)
> 
> This is a bike-shedding issue, right?  Or is there a real reason?
> 
> FWIW, I find it easier to search for if the dot is part of the thing;
> also, most uses inside automake include the dot (accept_extension et
> al).

OK, so I thought long enough about this issue to find an actual argument
to support my case, and failed to find a good one for your case in the
next couple of seconds after that.  :-)

Here it goes: the user could arguably want to use file names that do not
contain a dot _at all_.  So, the setup could be

  AM_DEFAULT_SOURCE_EXT = -bla
  bin_PROGRAMS = foo
  foo.c: foo-bla
        generate $@ from foo-bla
  CLEANFILES = foo.c

and automake would happily generate
  bla_SOURCES = foo-bla

The only thing that is missing from portable make is that an inference
rule
  SUFFIXES = -bla .c
  -bla.c:
        generate foo.c from foo-bla

is not Posix-conforming (but in practice supported by several make
implementations).

> >> I am wondering whether DEFAULT_SOURCE_EXT would be preferable to
> >> AM_DEFAULT_SOURCE_EXT?
> >
> > I made it AM_ to avoid infringing on the user name space, but I'm fine  
> > with just any name.

Good enough; I stuck with AM_DEFAULT_SOURCE_EXT for now.

Here's what I pushed.

Cheers,
Ralf

    Choose default source extension: AM_DEFAULT_SOURCE_EXT.
    
    * automake.in (handle_source_transform): Accept unconditional
    literal extension in AM_DEFAULT_SOURCE_EXT as override for the
    default source extension `.c'.  If set, ignore the old default
    source rule for libtool libraries.
    * doc/automake.texi (Default _SOURCES): Document this.
    * NEWS: Update.
    * tests/specflg10.test: New test.
    * tests/Makefile.am: Update.
    Suggestion by Akim Demaille.

diff --git a/NEWS b/NEWS
index 98f6b53..5c7d295 100644
--- a/NEWS
+++ b/NEWS
@@ -36,6 +36,9 @@ New in 1.10a:
   - Python 3.0 is supported now, Python releases prior to 2.0 are no
     longer supported.
 
+  - The default source file extension (.c) can be overridden with
+    AM_DEFAULT_SOURCE_EXT now.
+
 * Miscellaneous changes:
 
   - Automake development is done in a git repository on Savannah now, see
diff --git a/automake.in b/automake.in
index 0815773..4b54457 100755
--- a/automake.in
+++ b/automake.in
@@ -2058,10 +2058,16 @@ sub handle_source_transform ($$$$%)
     if (scalar @keys == 0)
     {
        # The default source for libfoo.la is libfoo.c, but for
-       # backward compatibility we first look at libfoo_la.c
+       # backward compatibility we first look at libfoo_la.c,
+       # if no default source suffix is given.
        my $old_default_source = "$one_file.c";
-       (my $default_source = $unxformed) =~ s,(\.[^./\\]*)?$,.c,;
+       my $ext_var = var ('AM_DEFAULT_SOURCE_EXT');
+       my $default_source_ext = $ext_var ? variable_value ($ext_var) : '.c';
+       msg_var ('unsupported', $ext_var, $ext_var->name . " can assume at most 
one value")
+         if $default_source_ext =~ /[\t ]/;
+       (my $default_source = $unxformed) =~ 
s,(\.[^./\\]*)?$,$default_source_ext,;
        if ($old_default_source ne $default_source
+           && !$default_source_ext
            && (rule $old_default_source
                || rule '$(srcdir)/' . $old_default_source
                || rule '${srcdir}/' . $old_default_source
diff --git a/doc/automake.texi b/doc/automake.texi
index cd2f920..86f1312 100644
--- a/doc/automake.texi
+++ b/doc/automake.texi
@@ -5605,6 +5605,7 @@ and we recommend avoiding it until you find it is 
required.
 @vindex SOURCES
 @cindex @code{_SOURCES}, default
 @cindex default @code{_SOURCES}
address@hidden AM_DEFAULT_SOURCE_EXT
 
 @code{_SOURCES} variables are used to specify source files of programs
 (@pxref{A Program}), libraries (@pxref{A Library}), and Libtool
@@ -5613,8 +5614,7 @@ libraries (@pxref{A Shared Library}).
 When no such variable is specified for a target, Automake will define
 one itself.  The default is to compile a single C file whose base name
 is the name of the target itself, with any extension replaced by
address@hidden  (Defaulting to C is terrible but we are stuck with it for
-historical reasons.)
address@hidden, which defaults to @file{.c}.
 
 For example if you have the following somewhere in your
 @file{Makefile.am} with no corresponding @code{libfoo_a_SOURCES}:
@@ -5631,7 +5631,7 @@ would be built from @file{sub_libc___a.c}, i.e., the 
default source
 was the canonized name of the target, with @file{.c} appended.
 We believe the new behavior is more sensible, but for backward
 compatibility automake will use the old name if a file or a rule
-with that name exist.)
+with that name exist and @code{AM_DEFAULT_SOURCE_EXT} is not used.)
 
 @cindex @code{check_PROGRAMS} example
 @vindex check_PROGRAMS
@@ -5640,16 +5640,20 @@ tests programs each from a single source.  For 
instance, in
 
 @example
 check_PROGRAMS = test1 test2 test3
+AM_DEFAULT_SOURCE_EXT = .cpp
 @end example
 
 @noindent
 @file{test1}, @file{test2}, and @file{test3} will be built
-from @file{test1.c}, @file{test2.c}, and @file{test3.c}.
+from @file{test1.cpp}, @file{test2.cpp}, and @file{test3.cpp}.
+Without the last line, they will be built from @file{test1.c},
address@hidden, and @file{test3.c}.
 
 @cindex Libtool modules, default source example
 @cindex default source, Libtool modules example
 Another case where is this convenient is building many Libtool modules
-(@file{moduleN.la}), each defined in its own file (@file{moduleN.c}).
+(@address@hidden), each defined in its own file
+(@address@hidden).
 
 @example
 AM_LDFLAGS = -module
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2526acf..fa2b9a8 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -533,6 +533,7 @@ specflg6.test       \
 specflg7.test  \
 specflg8.test  \
 specflg9.test  \
+specflg10.test \
 spell.test \
 spell2.test \
 spell3.test \
diff --git a/tests/specflg10.test b/tests/specflg10.test
new file mode 100755
index 0000000..23a7e64
--- /dev/null
+++ b/tests/specflg10.test
@@ -0,0 +1,87 @@
+#! /bin/sh
+# Copyright (C) 2008  Free Software Foundation, Inc.
+#
+# This program 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 3, or (at your option)
+# any later version.
+#
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# AM_DEFAULT_SOURCE_EXT
+
+. ./defs || Exit 1
+
+set -e
+
+cat >> configure.in << 'END'
+AC_PROG_CC
+AC_PROG_CXX
+AC_CONFIG_FILES([sub/Makefile sub2/Makefile])
+AM_CONDITIONAL([COND], [:])
+AC_OUTPUT
+END
+
+mkdir sub sub2
+
+cat > Makefile.am << 'END'
+SUBDIRS = sub sub2
+bin_PROGRAMS = foo
+END
+
+cat > sub/Makefile.am << 'END'
+bin_PROGRAMS = bar baz
+AM_DEFAULT_SOURCE_EXT = .cpp
+END
+
+cat > sub2/Makefile.am << 'END'
+bin_PROGRAMS = bla
+if COND
+AM_DEFAULT_SOURCE_EXT = .foo .quux
+endif
+SUFFIXES = .foo .c
+.foo.c:
+       cat $< >$@
+CLEANFILES = bla.c
+END
+
+cat > foo.c << 'END'
+int main () { return 0; }
+END
+
+cp foo.c sub/bar.cpp
+cp foo.c sub/baz.cpp
+cp foo.c sub2/bla.foo
+
+$ACLOCAL
+$AUTOCONF
+
+# Conditional AM_DEFAULT_SOURCE_EXT does not work yet  :-(
+# (this limitation could be lifted).
+AUTOMAKE_fails --add-missing
+grep 'defined conditionally' stderr
+
+sed '/^if/d; /^endif/d' sub2/Makefile.am > t
+mv -f t sub2/Makefile.am
+
+# AM_DEFAULT_SOURCE_EXT can only assume one value
+# (lifting this limitation is not such a good idea).
+AUTOMAKE_fails --add-missing
+grep 'at most one value' stderr
+
+sed 's/ \.quux//' sub2/Makefile.am > t
+mv -f t sub2/Makefile.am
+
+$AUTOMAKE --add-missing
+
+./configure
+$MAKE
+$MAKE distcheck
+
+:




reply via email to

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