From: Stefano Lattarini Date: Thu, 26 Jan 2012 10:24:23 +0000 (+0100) Subject: [ng] deptrack: refactoring for "fastdep" mode X-Git-Tag: ng-0.5a~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e38f31ff96a725e55d1feb31cb53c85dc45c93b7;p=thirdparty%2Fautomake.git [ng] deptrack: refactoring for "fastdep" mode * lib/am/depcomp2.am: Use more GNU make capabilities in the rules implementing fast dependency tracking. This change nicely reduce the size and complexity of the existing code. * automake.in (handle_languages): Simplify accordingly. --- diff --git a/automake.in b/automake.in index 087c3c00e..151ae5d6a 100644 --- a/automake.in +++ b/automake.in @@ -1385,27 +1385,6 @@ sub handle_languages # This is not used by depend2.am. my $der_ext = (&{$lang->output_extensions} ($ext))[0]; - # When we output an inference rule like `.c.o:' we - # have two cases to consider: either subdir-objects - # is used, or it is not. - # - # In the latter case the rule is used to build objects - # in the current directory, and dependencies always - # go into `./$(DEPDIR)/'. We can hard-code this value. - # - # In the former case the rule can be used to build - # objects in sub-directories too. Dependencies should - # go into the appropriate sub-directories, e.g., - # `sub/$(DEPDIR)/'. The value of this directory - # needs to be computed on-the-fly. - # - # DEPBASE holds the name of this directory, plus the - # basename part of the object file (extensions Po, TPo, - # Plo, TPlo will be added later as appropriate). It is - # either hardcoded, or a shell variable (`$depbase') that - # will be computed by the rule. - my $depbase = - option ('subdir-objects') ? '$$depbase' : '$(DEPDIR)/$*'; $output_rules .= file_contents ($rule_file, new Automake::Location, @@ -1414,7 +1393,6 @@ sub handle_languages 'DERIVED-EXT' => $der_ext, - DEPBASE => $depbase, BASE => '$*', SOURCE => '$<', SOURCEFLAG => $sourceflags{$ext} || '', @@ -1472,20 +1450,12 @@ sub handle_languages # We _need_ `-o' for per object rules. my $output_flag = $lang->output_flag || '-o'; - my $depbase = dirname ($obj); - $depbase = '' - if $depbase eq '.'; - $depbase .= '/' - unless $depbase eq ''; - $depbase .= '$(DEPDIR)/' . basename ($obj); - $output_rules .= file_contents ($rule_file, new Automake::Location, %transform, GENERIC => 0, - DEPBASE => $depbase, BASE => $obj, SOURCE => $source, SOURCEFLAG => $sourceflags{$srcext} || '', diff --git a/lib/am/depend2.am b/lib/am/depend2.am index 9a193a471..b948a2ad7 100644 --- a/lib/am/depend2.am +++ b/lib/am/depend2.am @@ -1,6 +1,7 @@ ## automake - create Makefile.in from Makefile.am ## Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -## 2003, 2004, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +## 2003, 2004, 2006, 2008, 2009, 2010, 2012 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 @@ -57,19 +58,23 @@ ## line and is therefore easier to spot. (We need an extra line when ## depbase is used.) +if %?FIRST% +?SUBDIROBJ?am__depdir = $(dir $@)/$(DEPDIR) +?!SUBDIROBJ?am__depdir = $(DEPDIR) +## FIXME: more precise in the removal of the suffix? +am__depbase = $(am__depdir)/$(basename $(notdir $@)) +endif %?FIRST% + if %?NONLIBTOOL% ?GENERIC?%EXT%.o: ?!GENERIC?%OBJ%: %SOURCE% if %FASTDEP% ## In fast-dep mode, we can always use -o. + %VERBOSE%%COMPILE% -MT $@ -MD -MP -MF $(am__depbase).Tpo %-c% -o $@ \ +?GENERIC? %SOURCEFLAG%%SOURCE% ## For non-suffix rules, we must emulate a VPATH search on %SOURCE%. -?!GENERIC? %VERBOSE%%COMPILE% -MT %OBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE% -?!GENERIC? %SILENT%$(am__mv) %DEPBASE%.Tpo %DEPBASE%.Po -?GENERIC??!SUBDIROBJ? %VERBOSE%%COMPILE% -MT %OBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJ% %SOURCEFLAG%%SOURCE% -?GENERIC??!SUBDIROBJ? %SILENT%$(am__mv) %DEPBASE%.Tpo %DEPBASE%.Po -?GENERIC??SUBDIROBJ? %VERBOSE%depbase=`echo %OBJ% | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -?GENERIC??SUBDIROBJ? %COMPILE% -MT %OBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJ% %SOURCEFLAG%%SOURCE% &&\ -?GENERIC??SUBDIROBJ? $(am__mv) %DEPBASE%.Tpo %DEPBASE%.Po +?!GENERIC? %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE% + %SILENT%$(am__mv) $(am__depbase).Tpo $(am__depbase).Po else !%FASTDEP% if %AMDEP% %VERBOSE%source='%SOURCE%' object='%OBJ%' libtool=no @AMDEPBACKSLASH@ @@ -89,14 +94,14 @@ endif !%FASTDEP% ?!GENERIC?%OBJOBJ%: %SOURCE% if %FASTDEP% ## In fast-dep mode, we can always use -o. + %VERBOSE%%COMPILE% -MT $@ -MD -MP -MF $(am__depbase).Tpo %-c% -o $@ \ +?GENERIC? %SOURCEFLAG%`$(CYGPATH_W) '%SOURCE%'` ## For non-suffix rules, we must emulate a VPATH search on %SOURCE%. -?!GENERIC? %VERBOSE%%COMPILE% -MT %OBJOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJOBJ% %SOURCEFLAG%`if test -f '%SOURCE%'; then $(CYGPATH_W) '%SOURCE%'; else $(CYGPATH_W) '$(srcdir)/%SOURCE%'; fi` -?!GENERIC? %SILENT%$(am__mv) %DEPBASE%.Tpo %DEPBASE%.Po -?GENERIC??!SUBDIROBJ? %VERBOSE%%COMPILE% -MT %OBJOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJOBJ% %SOURCEFLAG%`$(CYGPATH_W) '%SOURCE%'` -?GENERIC??!SUBDIROBJ? %SILENT%$(am__mv) %DEPBASE%.Tpo %DEPBASE%.Po -?GENERIC??SUBDIROBJ? %VERBOSE%depbase=`echo %OBJ% | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -?GENERIC??SUBDIROBJ? %COMPILE% -MT %OBJOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %OBJOBJ% %SOURCEFLAG%`$(CYGPATH_W) '%SOURCE%'` &&\ -?GENERIC??SUBDIROBJ? $(am__mv) %DEPBASE%.Tpo %DEPBASE%.Po +?!GENERIC? %SOURCEFLAG%`if test -f '%SOURCE%'; \ +?!GENERIC? then $(CYGPATH_W) '%SOURCE%'; \ +?!GENERIC? else $(CYGPATH_W) '$(srcdir)/%SOURCE%'; \ +?!GENERIC? fi` + %SILENT%$(am__mv) $(am__depbase).Tpo $(am__depbase).Po else !%FASTDEP% if %AMDEP% %VERBOSE%source='%SOURCE%' object='%OBJOBJ%' libtool=no @AMDEPBACKSLASH@ @@ -118,14 +123,11 @@ if %?LIBTOOL% ?!GENERIC?%LTOBJ%: %SOURCE% if %FASTDEP% ## In fast-dep mode, we can always use -o. + %VERBOSE%%LTCOMPILE% -MT $@ -MD -MP -MF $(am__depbase).Tpo %-c% -o $@ \ +?GENERIC? %SOURCEFLAG%%SOURCE% ## For non-suffix rules, we must emulate a VPATH search on %SOURCE%. -?!GENERIC? %VERBOSE%%LTCOMPILE% -MT %LTOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %LTOBJ% %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE% -?!GENERIC? %SILENT%$(am__mv) %DEPBASE%.Tpo %DEPBASE%.Plo -?GENERIC??!SUBDIROBJ? %VERBOSE%%LTCOMPILE% -MT %LTOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %LTOBJ% %SOURCEFLAG%%SOURCE% -?GENERIC??!SUBDIROBJ? %SILENT%$(am__mv) %DEPBASE%.Tpo %DEPBASE%.Plo -?GENERIC??SUBDIROBJ? %VERBOSE%depbase=`echo %OBJ% | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -?GENERIC??SUBDIROBJ? %LTCOMPILE% -MT %LTOBJ% -MD -MP -MF %DEPBASE%.Tpo %-c% -o %LTOBJ% %SOURCEFLAG%%SOURCE% &&\ -?GENERIC??SUBDIROBJ? $(am__mv) %DEPBASE%.Tpo %DEPBASE%.Plo +?!GENERIC? %SOURCEFLAG%`test -f '%SOURCE%' || echo '$(srcdir)/'`%SOURCE% + %SILENT%$(am__mv) $(am__depbase).Tpo $(am__depbase).Plo else !%FASTDEP% if %AMDEP% %VERBOSE%source='%SOURCE%' object='%LTOBJ%' libtool=yes @AMDEPBACKSLASH@