There have been a number of attempts at introducing a quiet behavior to automake, much like the Linux kernel's kbuild does.
Reference: http://osdir.com/ml/sysutils.automake.patches/2007-07/msg00024.html (and others linked from the thread) Known previous attempts always either were POSIX-incompliant due to the use of $(if ...), were limited to selecting verbosity at configure-time, or involved the costly use of $(shell ...). This patch does it without any of these three. Getting your verbose output back is as simple as using `make V=1`, or by setting V statically in your Makefile.am. Signed-off-by: Jan Engelhardt <[EMAIL PROTECTED]> # All rights are handed to the automake team. --- automake.in | 91 ++++++++++++++++++++++++++++++++++++++++++++++------ lib/am/depend2.am | 6 +++ lib/am/library.am | 5 +- lib/am/ltlibrary.am | 1 lib/am/program.am | 1 5 files changed, 93 insertions(+), 11 deletions(-) Index: automake-1.10.1/automake.in =================================================================== --- automake-1.10.1.orig/automake.in +++ automake-1.10.1/automake.in @@ -51,6 +51,9 @@ struct (# Short name of the language (c, # Nice name of the language (C, Fortran 77...). 'Name' => "\$", + "verbose_compile" => '$', + "verbose_link" => '$', + # List of configure variables which must be defined. 'config_vars' => '@', @@ -696,6 +699,8 @@ sub initialize_per_input () # C. register_language ('name' => 'c', 'Name' => 'C', + 'verbose_compile' => '${AM_VERBOSE_CC}', + 'verbose_link' => '${AM_VERBOSE_CCLD}', 'config_vars' => ['CC'], 'ansi' => 1, 'autodep' => '', @@ -714,6 +719,8 @@ register_language ('name' => 'c', # C++. register_language ('name' => 'cxx', 'Name' => 'C++', + 'verbose_compile' => '${AM_VERBOSE_CXX}', + 'verbose_link' => '${AM_VERBOSE_CXXLD}', 'config_vars' => ['CXX'], 'linker' => 'CXXLINK', 'link' => '$(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -732,6 +739,8 @@ register_language ('name' => 'cxx', # Objective C. register_language ('name' => 'objc', 'Name' => 'Objective C', + 'verbose_compile' => '${AM_VERBOSE_OBJC}', + 'verbose_link' => '${AM_VERBOSE_OBJCLD}', 'config_vars' => ['OBJC'], 'linker' => 'OBJCLINK', 'link' => '$(OBJCLD) $(AM_OBJCFLAGS) $(OBJCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -749,6 +758,8 @@ register_language ('name' => 'objc', # Unified Parallel C. register_language ('name' => 'upc', 'Name' => 'Unified Parallel C', + 'verbose_compile' => '${AM_VERBOSE_UPC}', + 'verbose_link' => '${AM_VERBOSE_UPCLD}', 'config_vars' => ['UPC'], 'linker' => 'UPCLINK', 'link' => '$(UPCLD) $(AM_UPCFLAGS) $(UPCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -776,6 +787,7 @@ register_language ('name' => 'header', # Yacc (C & C++). register_language ('name' => 'yacc', 'Name' => 'Yacc', + 'verbose_compile' => '${AM_VERBOSE_YACC}', 'config_vars' => ['YACC'], 'flags' => ['YFLAGS'], 'compile' => '$(YACC) $(YFLAGS) $(AM_YFLAGS)', @@ -789,6 +801,7 @@ register_language ('name' => 'yacc', 'nodist_specific' => 1); register_language ('name' => 'yaccxx', 'Name' => 'Yacc (C++)', + 'verbose_compile' => '${AM_VERBOSE_YACC}', 'config_vars' => ['YACC'], 'rule_file' => 'yacc', 'flags' => ['YFLAGS'], @@ -804,6 +817,7 @@ register_language ('name' => 'yaccxx', # Lex (C & C++). register_language ('name' => 'lex', 'Name' => 'Lex', + 'verbose_compile' => '${AM_VERBOSE_LEX}', 'config_vars' => ['LEX'], 'rule_file' => 'lex', 'flags' => ['LFLAGS'], @@ -817,6 +831,7 @@ register_language ('name' => 'lex', 'nodist_specific' => 1); register_language ('name' => 'lexxx', 'Name' => 'Lex (C++)', + 'verbose_compile' => '${AM_VERBOSE_LEX}', 'config_vars' => ['LEX'], 'rule_file' => 'lex', 'flags' => ['LFLAGS'], @@ -832,6 +847,7 @@ register_language ('name' => 'lexxx', # Assembler. register_language ('name' => 'asm', 'Name' => 'Assembler', + 'verbose_compile' => '${AM_VERBOSE_AS}', 'config_vars' => ['CCAS', 'CCASFLAGS'], 'flags' => ['CCASFLAGS'], @@ -850,6 +866,7 @@ register_language ('name' => 'asm', # Preprocessed Assembler. register_language ('name' => 'cppasm', 'Name' => 'Preprocessed Assembler', + 'verbose_compile' => '${AM_VERBOSE_AS}', 'config_vars' => ['CCAS', 'CCASFLAGS'], 'autodep' => 'CCAS', @@ -866,6 +883,8 @@ register_language ('name' => 'cppasm', # Fortran 77 register_language ('name' => 'f77', 'Name' => 'Fortran 77', + 'verbose_compile' => '${AM_VERBOSE_F77}', + 'verbose_link' => '${AM_VERBOSE_F77LD}', 'config_vars' => ['F77'], 'linker' => 'F77LINK', 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -883,6 +902,8 @@ register_language ('name' => 'f77', # Fortran register_language ('name' => 'fc', 'Name' => 'Fortran', + 'verbose_compile' => '${AM_VERBOSE_FC}', + 'verbose_link' => '${AM_VERBOSE_FCLD}', 'config_vars' => ['FC'], 'linker' => 'FCLINK', 'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -899,6 +920,8 @@ register_language ('name' => 'fc', # Preprocessed Fortran register_language ('name' => 'ppfc', 'Name' => 'Preprocessed Fortran', + 'verbose_compile' => '${AM_VERBOSE_FC}', + 'verbose_link' => '${AM_VERBOSE_FCLD}', 'config_vars' => ['FC'], 'linker' => 'FCLINK', 'link' => '$(FCLD) $(AM_FCFLAGS) $(FCFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -930,6 +953,8 @@ register_language ('name' => 'ppfc', # available). register_language ('name' => 'ppf77', 'Name' => 'Preprocessed Fortran 77', + 'verbose_compile' => '${AM_VERBOSE_F77}', + 'verbose_link' => '${AM_VERBOSE_F77LD}', 'config_vars' => ['F77'], 'linker' => 'F77LINK', 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -947,6 +972,8 @@ register_language ('name' => 'ppf77', # Ratfor. register_language ('name' => 'ratfor', 'Name' => 'Ratfor', + 'verbose_compile' => '${AM_VERBOSE_F77}', + 'verbose_link' => '${AM_VERBOSE_F77LD}', 'config_vars' => ['F77'], 'linker' => 'F77LINK', 'link' => '$(F77LD) $(AM_FFLAGS) $(FFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -965,6 +992,8 @@ register_language ('name' => 'ratfor', # Java via gcj. register_language ('name' => 'java', 'Name' => 'Java', + 'verbose_compile' => '${AM_VERBOSE_GCJ}', + 'verbose_link' => '${AM_VERBOSE_GCJLD}', 'config_vars' => ['GCJ'], 'linker' => 'GCJLINK', 'link' => '$(GCJLD) $(AM_GCJFLAGS) $(GCJFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@', @@ -1286,6 +1315,7 @@ sub handle_languages OBJOBJ => '$@', LTOBJ => '$@', + VERBOSE => $lang->verbose_compile, COMPILE => '$(' . $lang->compiler . ')', LTCOMPILE => '$(LT' . $lang->compiler . ')', -o => $output_flag, @@ -1329,7 +1359,7 @@ sub handle_languages $ptltflags = 'AM_LIBTOOLFLAGS' unless set_seen $ptltflags; my $obj_ltcompile = - "\$(LIBTOOL) $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) " + "\$(LIBTOOL) \${AM_LIBTOOL_SILENT} $libtool_tag\$($ptltflags) \$(LIBTOOLFLAGS) " . "--mode=compile $obj_compile"; # We _need_ `-o' for per object rules. @@ -1422,6 +1452,7 @@ sub handle_languages OBJOBJ => "$obj_.obj", LTOBJ => "$obj_.lo", + VERBOSE => $lang->verbose_compile, COMPILE => $obj_compile, LTCOMPILE => $obj_ltcompile, -o => $output_flag, @@ -1448,6 +1479,7 @@ sub handle_languages OBJOBJ => "$obj.obj", LTOBJ => "$obj.lo", + VERBOSE => $lang->verbose_compile, COMPILE => $obj_compile, LTCOMPILE => $obj_ltcompile, -o => $output_flag, @@ -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; + } + } +} + # handle_programs () # ------------------ # Handle C programs. @@ -2472,7 +2513,9 @@ sub handle_programs set_seen ($xname . '_LDFLAGS'); # Determine program to use for link. - my $xlink = &define_per_target_linker_variable ($linker, $xname); + my($xlink, $vlink) = &define_per_target_linker_variable ($linker, $xname); + $vlink ||= &find_link_verbose($xlink); + $vlink ||= ""; # If the resulting program lies into a subdirectory, # make sure this directory will exist. @@ -2485,6 +2528,7 @@ sub handle_programs PROGRAM => $one_file, XPROGRAM => $xname, XLINK => $xlink, + VERBOSE => $vlink, DIRSTAMP => $dirstamp, EXEEXT => '$(EXEEXT)'); @@ -2585,6 +2629,7 @@ sub handle_libraries $output_rules .= &file_contents ('library', $where, + VERBOSE => '${AM_VERBOSE_AR}', LIBRARY => $onelib, XLIBRARY => $xlib, DIRSTAMP => $dirstamp); @@ -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)"; @@ -2809,6 +2856,7 @@ sub handle_ltlibraries XLTLIBRARY => $xlib, RPATH => $rpath, XLINK => $xlink, + VERBOSE => $vlink, DIRSTAMP => $dirstamp); if ($seen_libobjs) { @@ -5872,7 +5920,6 @@ sub define_pretty_variable ($$$@) } } - # define_variable ($VAR, $VALUE, $WHERE) # -------------------------------------- # Define a new Automake Makefile variable VAR to VALUE, but only if @@ -5936,7 +5983,7 @@ sub define_compiler_variable ($) if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; &define_variable ($var, $value, INTERNAL); &define_variable ("LT$var", - "\$(LIBTOOL) $libtool_tag\$(AM_LIBTOOLFLAGS) " + "\$(LIBTOOL) \${AM_LIBTOOL_SILENT} $libtool_tag\$(AM_LIBTOOLFLAGS) " . "\$(LIBTOOLFLAGS) --mode=compile $value", INTERNAL) if var ('LIBTOOL'); @@ -5958,7 +6005,7 @@ sub define_linker_variable ($) # CCLINK = $(CCLD) blah blah... &define_variable ($lang->linker, ((var ('LIBTOOL') ? - "\$(LIBTOOL) $libtool_tag\$(AM_LIBTOOLFLAGS) " + "\$(LIBTOOL) \${AM_LIBTOOL_SILENT} $libtool_tag\$(AM_LIBTOOLFLAGS) " . "\$(LIBTOOLFLAGS) --mode=link " : '') . $lang->link), INTERNAL); @@ -5986,7 +6033,7 @@ sub define_per_target_linker_variable ($ if $lang->libtool_tag && exists $libtool_tags{$lang->libtool_tag}; $link_command = - "\$(LIBTOOL) $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) " + "\$(LIBTOOL) \${AM_LIBTOOL_SILENT} $libtool_tag\$(AM_LIBTOOLFLAGS) \$(LIBTOOLFLAGS) " . "--mode=link " . $link_command; } @@ -6004,11 +6051,11 @@ sub define_per_target_linker_variable ($ # If the computed command is the same as the generic command, use # the command linker variable. - return $lang->linker + return ($lang->linker, $lang->verbose_link) if $link_command eq $orig_command; &define_variable ("${target}_LINK", $link_command, INTERNAL); - return "${target}_LINK"; + return ("${target}_LINK", $lang->verbose_link); } ################################################################ @@ -6355,6 +6402,55 @@ sub read_main_am_file $output_vars .= '# ' . subst ('configure_input') . "\n"; $output_vars .= $gen_copyright; + # 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', + '__AM_VERBOSE_CC = @echo " CC " $@;', + '__AM_VERBOSE_CCLD = @echo " CCLD " $@;', + '__AM_VERBOSE_CXX = @echo " CXX " $@;', + '__AM_VERBOSE_CXXLD = @echo " CXXLD " $@;', + '__AM_VERBOSE_OBJC = @echo " OBJC " $@;', + '__AM_VERBOSE_OBJCLD = @echo " OBJCLD " $@;', + '__AM_VERBOSE_UPC = @echo " UPC " $@;', + '__AM_VERBOSE_UPCLD = @echo " UPCLD " $@;', + '__AM_VERBOSE_YACC = @echo " YACC " $@;', + '__AM_VERBOSE_LEX = @echo " LEX " $@;', + '__AM_VERBOSE_AS = @echo " AS " $@;', + '__AM_VERBOSE_F77 = @echo " F77 " $@;', + '__AM_VERBOSE_F77LD = @echo " F77LD " $@;', + '__AM_VERBOSE_FC = @echo " FC " $@;', + '__AM_VERBOSE_FCLD = @echo " FCLD " $@;', + '__AM_VERBOSE_GCJ = @echo " GCJ " $@;', + '__AM_VERBOSE_GCJLD = @echo " GCJLD " $@;', + '__AM_VERBOSE_AR = @echo " AR " $@;', + '__AM_VERBOSE_GEN = @echo " GEN " $@;', + 'AM_LIBTOOL_SILENT = ${__AM_LIBTOOL_SILENT${V}}', + 'AM_VERBOSE_CC = ${__AM_VERBOSE_CC${V}}', + 'AM_VERBOSE_CCLD = ${__AM_VERBOSE_CCLD${V}}', + 'AM_VERBOSE_CXX = ${__AM_VERBOSE_CXX${V}}', + 'AM_VERBOSE_CXXLD = ${__AM_VERBOSE_CXXLD${V}}', + 'AM_VERBOSE_OBJC = ${__AM_VERBOSE_OBJC${V}}', + 'AM_VERBOSE_OBJCLD = ${__AM_VERBOSE_OBJCLD${V}}', + 'AM_VERBOSE_UPC = ${__AM_VERBOSE_UPC${V}}', + 'AM_VERBOSE_UPCLD = ${__AM_VERBOSE_UPCLD${V}}', + 'AM_VERBOSE_YACC = ${__AM_VERBOSE_YACC${V}}', + 'AM_VERBOSE_LEX = ${__AM_VERBOSE_LEX${V}}', + 'AM_VERBOSE_AS = ${__AM_VERBOSE_AS${V}}', + 'AM_VERBOSE_F77 = ${__AM_VERBOSE_F77${V}}', + 'AM_VERBOSE_F77LD = ${__AM_VERBOSE_F77LD${V}}', + 'AM_VERBOSE_FC = ${__AM_VERBOSE_FC${V}}', + 'AM_VERBOSE_FCLD = ${__AM_VERBOSE_FCLD${V}}', + 'AM_VERBOSE_GCJ = ${__AM_VERBOSE_GCJ${V}}', + 'AM_VERBOSE_GCJLD = ${__AM_VERBOSE_GCJLD${V}}', + 'AM_VERBOSE_AR = ${__AM_VERBOSE_AR${V}}', + 'AM_VERBOSE_GEN = ${__AM_VERBOSE_GEN${V}}', + '', + ); + # We want to predefine as many variables as possible. This lets # the user set them with `+=' in Makefile.am. &define_standard_variables; Index: automake-1.10.1/lib/am/depend2.am =================================================================== --- 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% \ ## 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 else !%FASTDEP% + %VERBOSE% @AMDEPBACKSLASH@ if %AMDEP% source='%SOURCE%' object='%OBJ%' libtool=no @AMDEPBACKSLASH@ DEPDIR=$(DEPDIR) $(%FPFX%DEPMODE) $(depcomp) @AMDEPBACKSLASH@ @@ -88,6 +90,7 @@ endif !%FASTDEP% ?GENERIC?%EXT%.obj: ?!GENERIC?%OBJOBJ%: %SOURCE% if %FASTDEP% + %VERBOSE% \ ## In fast-dep mode, we can always use -o. ## For non-suffix rules, we must emulate a VPATH search on %SOURCE%. ?!GENERIC? %COMPILE% -MT %OBJOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJOBJ% `if test -f '%SOURCE%'; then $(CYGPATH_W) '%SOURCE%'; else $(CYGPATH_W) '$(srcdir)/%SOURCE%'; fi` && \ @@ -96,6 +99,7 @@ if %FASTDEP% ?GENERIC??SUBDIROBJ? %COMPILE% -MT %OBJOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJOBJ% `$(CYGPATH_W) '%SOURCE%'` &&\ mv -f %DEPBASE%.Tpo %DEPBASE%.Po else !%FASTDEP% + %VERBOSE% @AMDEPBACKSLASH@ if %AMDEP% source='%SOURCE%' object='%OBJOBJ%' libtool=no @AMDEPBACKSLASH@ DEPDIR=$(DEPDIR) $(%FPFX%DEPMODE) $(depcomp) @AMDEPBACKSLASH@ @@ -115,6 +119,7 @@ if %?LIBTOOL% ?GENERIC?%EXT%.lo: ?!GENERIC?%LTOBJ%: %SOURCE% if %FASTDEP% + %VERBOSE% \ ## In fast-dep mode, we can always use -o. ## For non-suffix rules, we must emulate a VPATH search on %SOURCE%. ?!GENERIC? %LTCOMPILE% -MT %LTOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %LTOBJ% `test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE% && \ @@ -123,6 +128,7 @@ if %FASTDEP% ?GENERIC??SUBDIROBJ? %LTCOMPILE% -MT %LTOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %LTOBJ% %SOURCE% &&\ mv -f %DEPBASE%.Tpo %DEPBASE%.Plo else !%FASTDEP% + %VERBOSE% @AMDEPBACKSLASH@ if %AMDEP% source='%SOURCE%' object='%LTOBJ%' libtool=yes @AMDEPBACKSLASH@ DEPDIR=$(DEPDIR) $(%FPFX%DEPMODE) $(depcomp) @AMDEPBACKSLASH@ Index: automake-1.10.1/lib/am/library.am =================================================================== --- automake-1.10.1.orig/lib/am/library.am +++ automake-1.10.1/lib/am/library.am @@ -16,6 +16,7 @@ ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ## 02110-1301, USA. %LIBRARY%: $(%XLIBRARY%_OBJECTS) $(%XLIBRARY%_DEPENDENCIES) %DIRSTAMP% - -rm -f %LIBRARY% - $(%XLIBRARY%_AR) %LIBRARY% $(%XLIBRARY%_OBJECTS) $(%XLIBRARY%_LIBADD) + %VERBOSE% \ + rm -f %LIBRARY% || true; \ + $(%XLIBRARY%_AR) %LIBRARY% $(%XLIBRARY%_OBJECTS) $(%XLIBRARY%_LIBADD); \ $(RANLIB) %LIBRARY% Index: automake-1.10.1/lib/am/ltlibrary.am =================================================================== --- automake-1.10.1.orig/lib/am/ltlibrary.am +++ automake-1.10.1/lib/am/ltlibrary.am @@ -16,4 +16,5 @@ ## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ## 02110-1301, USA. %LTLIBRARY%: $(%XLTLIBRARY%_OBJECTS) $(%XLTLIBRARY%_DEPENDENCIES) %DIRSTAMP% + %VERBOSE% \ $(%XLINK%) %RPATH% $(%XLTLIBRARY%_OBJECTS) $(%XLTLIBRARY%_LIBADD) $(LIBS) Index: automake-1.10.1/lib/am/program.am =================================================================== --- automake-1.10.1.orig/lib/am/program.am +++ automake-1.10.1/lib/am/program.am @@ -23,4 +23,5 @@ ## Or maybe not... sadly, incremental linkers are rarer than losing ## systems. @rm -f %PROGRAM%%EXEEXT% + %VERBOSE% \ $(%XLINK%) $(%XPROGRAM%_OBJECTS) $(%XPROGRAM%_LDADD) $(LIBS)