automake
[Top][All Lists]
Advanced

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

Re: make automake less verbose (try 2)


From: Jan Engelhardt
Subject: Re: make automake less verbose (try 2)
Date: Thu, 23 Oct 2008 21:19:25 -0400 (EDT)
User-agent: Alpine 1.10 (LNX 962 2008-03-14)

On Thursday 2008-10-23 19:20, Ralf Wildenhues wrote:
>
>Anyway, when we use nonconforming constructs then it's probably safer if
>they are default-off, so the developer can choose to enable it and knows
>the limitation.  I suppose we can have an Automake option 'silent' or so
>(better name suggestions appreciated), or maybe additionally a command
>line argument if there is much desire for that.

Probably so. Then I would like to see a macro for use in configure.ac
that toggles the default behavior. Something like

        AM_SILENT_BY_DEFAULT
(and the converse,)
        AM_VERBOSE_BY_DEFAULT

where AM_VERBOSE_BY_DEFAULT is, eh, the default, when omitted.

When AM_VERBOSE_BY_DEFAULT is in effect, we can just add a V=1
to the Makefile, and users can override it with `make V=`
to quieten it. Sounds like a plan.

And soon, the next idea crops up :-/  a `make Q=` mnemonic
that is the opposite of V. I guess that will open a can of
syntax worms, and requires like

        __AM_VERBOSE_CC.1   = echo... # V=1
        __AM_VERBOSE_CC0.1  = echo... # V=1 Q=0
        __AM_VERBOSE_CC1.  = echo... # Q=1
        __AM_VERBOSE_CC1.1 = echo... #
        AM_VERBOSE_CC      = ${__AM_VERBOSE_CC${Q}.${V}}
        etc.

>A few more nits below.  FWIW, if you are willing to work on this more,
>that would be great.  If you aren't, then no problem, I (or somebody
>else) will get to it eventually.  (If you won't sign papers, then it's
>in fact easier for us to fix things if you don't submit patches.)

Let's see..

>Can you please state how and on what systems/packages/compilers etc. you
>tested the patch, and whether you ran Automake's testsuite?  Thanks!

Since this is automake related, I was totally ignorant about
compiler ;-)

Packages? Quite a few. Every RPM in my build root whose specfile
issued autoreconf/automake. I don't feel like counting them, but of
course, it is only a fraction of all RPMs produced, simply because
rebuilding the Makefile.ins does take its time, and it quickly
accumulates. Ever since I wrote the initial patch last year, all
those packages were under the testing of the modified automake.

The patch I posted today has not had exposure beyond libHX and
pam_mount yet, but this year's patch only had minimal changes from
last year's try. Essentially, only the AM_VERBOSE variables in the
biggest hunk were touched. I mean I knew the only thing that stopped
me from world dom^W^W^W was the $(ifeq) line. I would rather hit a
Perl syntax error before getting a problem with the Makefile automake
would produce ;-)  — at least within the tested systems.

Systems tested: GNU make 3.81, Solaris 10 make, OpenBSD 4.3's make.

For fun I tried it on some packages: hte (hte.sf.net) and pidgin.

>
>FWIW, the patch needs a test or two, documentation, a NEWS and a
>ChangeLog entry.
>
>> --- automake-1.10.1.orig/automake.in
>> +++ automake-1.10.1/automake.in
>
>> +               'verbose_link'    => '${AM_VERBOSE_CXXLD}',
>
>(wondering whether to use am__verbose_CCXLD and likewise here)

Most likely so.

>How come you use ${...} everywhere, instead of $(...) as is done in the
>rest of Automake?  See HACKING for some conventions, that, stupid as
>they may be, at least bring a bit of consistency.

Using ${} — for consistency, as strange as that sounds:
Shell uses ${foo}  (besides $foo, yes yes).
Perl uses ${foo}.
So does PHP.
And none of them use $() for variables.
So there must have been a mad scientist who stepped out of line and
added $() to make in the 70s(?) or so.

>I wonder whether verbose_compile and verbose_link can be autogenerated
>resp. mapped from compiler and lder, respectively.  Hmm.
>
>> @@ -2410,6 +2442,15 @@ sub handle_libtool
>>                                 LTRMS => join ("\n", @libtool_rms));
>>  }
>>  
>> +sub find_link_verbose($)
>> +{
>> +    foreach my $lang_name (keys %languages) {
>> +            if ($languages{$lang_name}->linker eq $_[0]) {
>> +                    return $languages{$lang_name}->verbose_link;
>> +            }
>> +    }
>> +}
>
>That's a bit inefficient, looping over all languages each time.
>Can't you do something like this?
>
>  if (exists $languages{$lang_name})
>    {
>      return $languages{$lang_name}->verbose_link;
>    }
>  return undef;

I did this because there seem to be multiple languages with the same
->linker but with different ->verbose_link -- something like that,
I really get lost in the automake source. It had to do with CXXLD
overriding CCLD in a program which consists of both flavors, i.e.

        bin_PROGRAMS = foo
        foo_SOURCES = a.c b.cpp

>> @@ -2761,7 +2806,9 @@ sub handle_ltlibraries
>>                                           NONLIBTOOL => 0, LIBTOOL => 1);
>>  
>>        # Determine program to use for link.
>> -      my $xlink = &define_per_target_linker_variable ($linker, $xlib);
>> +      my($xlink, $vlink) = &define_per_target_linker_variable ($linker, 
>> $xlib);
>> +      $vlink ||= &find_link_verbose($xlink);
>> +      $vlink ||= "";
>>  
>>        my $rpathvar = "am_${xlib}_rpath";
>>        my $rpath = "\$($rpathvar)";
>
>
>> +    # We are using an indirection via __AM_VERBOSE_* here so that
>> +    # ${V} is not used in any files but automake.in itself,
>> +    # especially avoiding the use of ${V} template files.
>> +    #
>> +    # GEN is for generate, which you can use for any manual rules.
>> +    $output_vars .= join("\n",
>> +            '__AM_LIBTOOL_SILENT = --silent',
>
>Variables with leading underscores are not universally portable; the
>naming convention in HACKING recommends am__ as prefix.

yup. let's do that.

>I think this code piece should use one of the define_*variable
>functions, for nicely formatted output, and variables that are not used
>in the Makefile.in should not need to be defined, to avoid bloat.

Right. But I would like to keep AM_VERBOSE_GEN, to be able to have
some sort of silent output for non-automake programs, e.g.:

foo.out: foo.in
        ${AM_VERBOSE_GEN}perl $< >$@

>> +             '__AM_VERBOSE_CC     = @echo "  CC      " $@;',
>
>Honest question: why the leading white space in the output?
>All it does is take away screen space, no?  Or is the goal
>bit-for-bit compatibility with Linux output?

bit-for-bit compatibility. I wanted the exact Linux output.
No square brackets or other funstuff people added to their version
of silence-automake patches. As I think about it, the leading
indent actually helps readability - IMO - since both make's
"entering subdirectory" as well as compile warnings/errors
begin in the first column. That's probably also the reason
why this was done so in kbuild.

>[...]
>> +            'AM_LIBTOOL_SILENT   = ${__AM_LIBTOOL_SILENT${V}}',
>
>
>> --- automake-1.10.1.orig/lib/am/depend2.am
>> +++ automake-1.10.1/lib/am/depend2.am
>> @@ -63,6 +63,7 @@ if %?NONLIBTOOL%
>>  ?GENERIC?%EXT%.o:
>>  ?!GENERIC?%OBJ%: %SOURCE%
>>  if %FASTDEP%
>> +    %VERBOSE% \
>
>For a default-off automake-time decision, the .am snippets changes would
>need a ?SILENT? or so modifier (can also use ternary operators for bits
>with finer than line granularity).

See above; I think default-off/default-on behavior can simply
be toggled (and should be togglable)
using a configure-time @VARIABLE@ instead of an automake-specific
%VARIABLE%.

>I'm not all that happy about the extra line of output in the V=1 case
>here.  Probably better if the %VERBOSE% happens on the same line as the
>compile command, even if that unfortunately means more duplication
>inside depend2.am; like

I noticed. It's a byproduct that I happen to like. Even with V=1 you get a
blank line for, ahem, what people tout as readability :)

That way, the compile line(s) and any errors caused by it are
agglomerated together in a blob block on-screen.

>?!GENERIC?     %SILENT?%VERBOSE% :%%COMPILE% -MT ...
>
>Ah, there may be an even better alternative.  At least for the gcc3
>fastdep path, we can just use another command line, with @ prefixed.
>Since there 
>
>>  ## In fast-dep mode, we can always use -o.
>>  ## For non-suffix rules, we must emulate a VPATH search on %SOURCE%.
>>  ?!GENERIC?  %COMPILE% -MT %OBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJ% 
>> `test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE% && \
>> @@ -71,6 +72,7 @@ if %FASTDEP%
>>  ?GENERIC??SUBDIROBJ?        %COMPILE% -MT %OBJ% -MD -MP -MF %DEPBASE%.Tpo 
>> %-c% -o %OBJ% %SOURCE% &&\
>>      mv -f %DEPBASE%.Tpo %DEPBASE%.Po
>
>How come you didn't address the mv calls?  Should be possible with
>something like
>        am__at = @
>        AM__AT = $(am__at$(V))
>
>       $(AM__AT)mv -f %DEPBASE%.Tpo %DEPBASE%.Po

I did not want to overdo it. Non-compile lines are rare in my
projects, and I guess you could call me lazy here. Feel free to
add a AM_VERBOSE_MV and AM_VERBOSE_RM if you feel like. Users
will probably like it because it goes in line with the
compile-quietness of AM_VERBOSE_CC.


Since you quoted am__at, I think that is what should also be
used instead of the literal @ in AM_VERBOSE_*.




reply via email to

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