]> git.donarmstrong.com Git - debhelper.git/commitdiff
Merge branch 'master' into smarter-targets origin/smarter-targets
authorJoey Hess <joey@kitenet.net>
Tue, 14 Jun 2011 21:25:24 +0000 (17:25 -0400)
committerJoey Hess <joey@kitenet.net>
Tue, 14 Jun 2011 21:25:24 +0000 (17:25 -0400)
Conflicts:
dh

1  2 
debhelper.pod
debian/changelog
dh

diff --combined debhelper.pod
index d54bf4e1daf1bb909067a9b1fc63d35c64d29c25,c076acf04f31d69e6e90f98520463a25270e9fd7..fbb76deb8f9bb8703efa1a7b31a2782001649b39
@@@ -191,6 -191,10 +191,10 @@@ in ALL packages acted on, not just the 
  
  =head1 BUILD SYSTEM OPTIONS
  
+ All of the B<dh_auto_>I<*> debhelper programs sets environment variables
+ listed by B<dpkg-buildflags>, unless they are already set. They
+ support DEB_BUILD_OPTIONS=noopt too.
  The following command line options are supported by all of the B<dh_auto_>I<*>
  debhelper programs. These programs support a variety of build systems,
  and normally heuristically determine which to use, and how to use them.
@@@ -552,12 -556,7 +556,12 @@@ ${misc:Pre-Depends
  
  =item -
  
 -B<dh_auto_configure> does not include the source package name
 +dh supports use of standard targets in debian/rules without needing
 +to manually define the dependencies between targets there.
 +
 +=item -
 +
 +<dh_auto_configure> does not include the source package name
  in --libexecdir when using autoconf.
  
  =back
diff --combined debian/changelog
index d22e50eac02de62b76701cb9936604d671351a1d,fb01bc65d27762f53c75f54cfbbc3ccd0ddb9ab6..9bf728aff09ddb474a4dd6eca618f5c8550b3714
@@@ -3,13 -3,14 +3,19 @@@ debhelper (8.1.7) UNRELEASED; urgency=l
    * Fix example. Closes: #627534
    * Fix error message. Closes: #628053
    * dh_movefiles: Optimise use of xargs. Closes: #627737
 +  * dh: In v9, any standard rules file targets, including build-arch,
 +    build-indep, build, install, etc, can be defined in debian/rules
 +    without needing to explicitly tell make the dependencies between
 +    the targets. Closes: #629139
 +    (Thanks, Roger Leigh)
    * dh_auto_configure: In v9, does not include the source package name
      in --libexecdir when using autoconf. Closes: #541458
+   * dh_auto_build, dh_auto_configure, dh: Set environment variables
+     listed by dpkg-buildflags --export. Any environment variables that
+     are already set to other values will not be changed.
+     Closes: #544844
+   * Also, support DEB_BUILD_OPTIONS=noopt, by changing -O2 to -O0
+     in any variables listed by dpkg-buildflags.
  
   -- Joey Hess <joeyh@debian.org>  Sat, 21 May 2011 15:24:19 -0400
  
diff --combined dh
index 8d8c920a18d69e67854a8aa299098a4926e987d2,7c53611a60827ed1837a84a3aaf783d4be60a07b..aba8c270efb29d8bc9c4ebbcec67e14775d63b58
--- 1/dh
--- 2/dh
+++ b/dh
@@@ -240,9 -240,9 +240,9 @@@ L<dh_listpackages(1)> to test what is b
        endif
  
  Finally, remember that you are not limited to using override targets in the
 -rules file when using B<dh>. You can also explicitly define the regular
 +rules file when using B<dh>. You can also explicitly define any of the regular
  rules file targets when it makes sense to do so. A common reason to do this
 -is if your package needs different B<build-arch> and B<build-indep> targets.
 +is when your package needs different B<build-arch> and B<build-indep> targets.
  For example, a package with a long document build process can put it in
  B<build-indep>.
  
        %:
                dh $@
        
 -      binary: binary-arch binary-indep ;
 -      binary-arch:: build-arch
 -      binary-indep:: build-indep
 -      build: build-arch build-indep ;
        build-indep:
                $(MAKE) docs
        build-arch:
                $(MAKE) bins
  
 +Note that in the example above, dh will arrange for "debian/rules build"
 +to call your build-indep and build-arch targets. You do not need to
 +explicitly define the dependencies in the rules file when using dh with
 +compatability level v9. This example would be more complicated with
 +earlier compatability levels.
 +
  =head1 INTERNALS
  
  If you're curious about B<dh>'s internals, here's how it works under the hood.
@@@ -275,9 -273,9 +275,12 @@@ that is in the specified sequence. It t
  in the sequence. The B<--until>, B<--before>, B<--after>, and B<--remaining>
  options can override this behavior.
  
 +A sequence can also run dependent targets in debian/rules.  For
 +example, the "binary" sequence runs the "install" target.
 +
+ B<dh> sets environment variables listed by B<dpkg-buildflags>, unless
+ they are already set. It supports DEB_BUILD_OPTIONS=noopt too.
  B<dh> uses the B<DH_INTERNAL_OPTIONS> environment variable to pass information
  through to debhelper commands that are run inside override targets. The
  contents (and indeed, existence) of this environment variable, as the name
@@@ -315,7 -313,7 +318,7 @@@ init(options => 
        bundling => 0,
  );
  inhibit_log();
+ set_buildflags();
  
  # If make is using a jobserver, but it is not available
  # to this process, clean out MAKEFLAGS. This avoids
@@@ -324,52 -322,21 +327,52 @@@ if (is_make_jobserver_unavailable()) 
        clean_jobserver_makeflags();
  }
  
 +# Process the sequence parameter.
 +my $sequence;
 +if (! compat(7)) {
 +      # From v8, the sequence is the very first parameter.
 +      $sequence=shift @ARGV_orig;
 +      if ($sequence=~/^-/) {
 +              error "Unknown sequence $sequence (options should not come before the sequence)";
 +      }
 +}
 +else {
 +      # Before v8, the sequence could be at any position in the parameters,
 +      # so was what was left after parsing.
 +      $sequence=shift;
 +      if (defined $sequence) {
 +              @ARGV_orig=grep { $_ ne $sequence } @ARGV_orig;
 +      }
 +}
 +if (! defined $sequence) {
 +      error "specify a sequence to run";
 +}
 +# make -B causes the rules file to be run as a target.
 +# Also support completly empty override targets.
 +# Note: it's not safe to use rules_explicit_target before this check,
 +# since it causes dh to be run.
 +my $dummy_target="debhelper-fail-me";
 +if ($sequence eq 'debian/rules' ||
 +    $sequence =~ /^override_dh_/ ||
 +    $sequence eq $dummy_target) {
 +      exit 0;
 +}
 +
 +
  # Definitions of sequences.
  my %sequences;
 -$sequences{build} = [qw{
 +my @bd_minimal = qw{
 +      dh_testdir
 +};
 +my @bd = qw{
        dh_testdir
        dh_auto_configure
        dh_auto_build
        dh_auto_test
 -}],
 -$sequences{'build-indep'} = [@{$sequences{build}}];
 -$sequences{'build-arch'} = [@{$sequences{build}}];
 -$sequences{clean} = [qw{
 -      dh_testdir
 -      dh_auto_clean
 -      dh_clean
 -}];
 +};
 +my @i_minimal = qw{
 +      dh_testroot
 +};
  my @i = qw{
        dh_testroot
        dh_prep
        dh_compress
        dh_fixperms
  };
 -$sequences{'install'} = [@{$sequences{build}}, @i];
 -$sequences{'install-indep'} = [@{$sequences{'build-indep'}}, @i];
 -$sequences{'install-arch'} = [@{$sequences{'build-arch'}}, @i];
  my @ba=qw{
        dh_strip
        dh_makeshlibs
@@@ -423,48 -393,9 +426,48 @@@ my @b=qw
        dh_md5sums
        dh_builddeb
  };
 -$sequences{binary} = [@{$sequences{install}}, @ba, @b];
 -$sequences{'binary-indep'} = [@{$sequences{'install-indep'}}, @b];
 -$sequences{'binary-arch'} = [@{$sequences{'install-arch'}}, @ba, @b];
 +$sequences{clean} = [qw{
 +      dh_testdir
 +      dh_auto_clean
 +      dh_clean
 +}];
 +$sequences{'build-indep'} = [@bd];
 +$sequences{'build-arch'} = [@bd];
 +if (! compat(8)) {
 +      # From v9, sequences take standard rules targets into account.
 +      if (rules_explicit_target('build-arch') ||
 +          rules_explicit_target('build-indep')) {
 +              # run sequences separately
 +              $sequences{build} = [@bd_minimal, rules("build-arch"), rules("build-indep")];
 +      }
 +      else {
 +              # run standard sequence (this is faster)
 +              $sequences{build} = [@bd];
 +      }
 +      $sequences{'install-indep'} = [rules("build-indep"), @i];
 +      $sequences{'install-arch'} = [rules("build-arch"), @i];
 +      if (rules_explicit_target('install-arch') ||
 +          rules_explicit_target('install-indep')) {
 +              # run sequences separately
 +              $sequences{'install'} = [rules("build"), @i_minimal, rules("install-arch"), rules("install-indep")];
 +      }
 +      else {
 +              # run standard sequence (this is faster)
 +              $sequences{'install'} = [rules("build"), @i, rules("install-arch"), rules("install-indep")];
 +      }
 +      $sequences{'binary-indep'} = [rules("install-indep"), @b];
 +      $sequences{'binary-arch'} = [rules("install-arch"), @ba, @b];
 +      $sequences{binary} = [rules("install"), rules("binary-arch"), rules("binary-indep")];
 +}
 +else {
 +      $sequences{build} = [@bd];
 +      $sequences{'install'} = [@{$sequences{build}}, @i];
 +      $sequences{'install-indep'} = [@{$sequences{'build-indep'}}, @i];
 +      $sequences{'install-arch'} = [@{$sequences{'build-arch'}}, @i];
 +      $sequences{binary} = [@{$sequences{install}}, @ba, @b];
 +      $sequences{'binary-indep'} = [@{$sequences{'install-indep'}}, @b];
 +      $sequences{'binary-arch'} = [@{$sequences{'install-arch'}}, @ba, @b];
 +}
  
  # Additional command options
  my %command_opts;
@@@ -553,7 -484,6 +556,7 @@@ sub list_addons 
        exit 0;
  }
  
 +# Load addons, which can modify sequences.
  foreach my $addon (@{$dh{WITH}}) {
        my $mod="Debian::Debhelper::Sequence::$addon";
        $mod=~s/-/_/g;
        }
  }
  
 -my $sequence;
 -if (! compat(7)) {
 -      # From v8, the sequence is the very first parameter.
 -      $sequence=shift @ARGV_orig;
 -      if ($sequence=~/^-/) {
 -              error "Unknown sequence $sequence (options should not come before the sequence)";
 -      }
 -}
 -else {
 -      # Before v8, the sequence could be at any position in the parameters,
 -      # so was what was left after parsing.
 -      $sequence=shift;
 -      if (defined $sequence) {
 -              @ARGV_orig=grep { $_ ne $sequence } @ARGV_orig;
 -      }
 -}
 -if (! defined $sequence) {
 -      error "specify a sequence to run";
 -}
 -if ($sequence eq 'debian/rules' ||
 -    $sequence =~ /^override_dh_/) {
 -      # make -B causes the rules file to be run as a target.
 -      # Also support completly empty override targets.
 -      exit 0;
 -}
 -elsif (! exists $sequences{$sequence}) {
 +if (! exists $sequences{$sequence}) {
        error "Unknown sequence $sequence (choose from: ".
                join(" ", sort keys %sequences).")";
  }
 -my @sequence=@{$sequences{$sequence}};
 +my @sequence=optimize_sequence(@{$sequences{$sequence}});
  
  # The list of all packages that can be acted on.
  my @packages=@{$dh{DOPACKAGES}};
@@@ -693,19 -648,7 +696,19 @@@ sub run 
        # run them instead of running the command directly.
        my $override_command;
        my $has_explicit_target = rules_explicit_target("override_".$command);
 -      if (defined $has_explicit_target) {
 +
 +      my $rules_target = rules_target($command);
 +      if (defined $rules_target) {
 +              # Don't pass DH_ environment variables, since this is
 +              # a fresh invocation of debian/rules and any sub-dh
 +              # commands.
 +              $override_command=$command;
 +              delete $ENV{DH_INTERNAL_OPTIONS};
 +              delete $ENV{DH_INTERNAL_OVERRIDE};
 +              $command="debian/rules";
 +              @options=$rules_target;
 +      }
 +      elsif (defined $has_explicit_target) {
                $override_command=$command;
                # Check if target isn't noop
                if ($has_explicit_target) {
        }
  }
  
 +sub optimize_sequence {
 +      my @sequence;
 +      my %seen;
 +      my $add=sub {
 +              # commands can appear multiple times when sequences are
 +              # inlined together; only the first should be needed
 +              my $command=shift;
 +              if (! $seen{$command}) {
 +                      $seen{$command}=1;
 +                      push @sequence, $command;
 +              }
 +      };
 +      foreach my $command (@_) {
 +              my $rules_target=rules_target($command);
 +              if (defined $rules_target &&
 +                  ! defined rules_explicit_target($rules_target)) {
 +                      # inline the sequence for this implicit target
 +                      $add->($_) foreach optimize_sequence(@{$sequences{$rules_target}});
 +              }
 +              else {
 +                      $add->($command);
 +              }
 +      }
 +      return @sequence;
 +}
 +
 +sub rules_target {
 +      my $command=shift;
 +      if ($command =~ /^debian\/rules\s+(.*)/) {
 +              return $1
 +      }
 +      else {
 +              return undef;
 +      }
 +}
 +
 +sub rules {
 +      return "debian/rules ".join(" ", @_);
 +}
 +
  {
  my %targets;
  my $rules_parsed;
@@@ -819,7 -722,7 +822,7 @@@ sub rules_explicit_target 
                my $processing_targets = 0;
                my $not_a_target = 0;
                my $current_target;
 -              open(MAKE, "LC_ALL=C make -Rrnpsf debian/rules debhelper-fail-me 2>/dev/null |");
 +              open(MAKE, "LC_ALL=C make -Rrnpsf debian/rules $dummy_target 2>/dev/null |");
                while (<MAKE>) {
                        if ($processing_targets) {
                                if (/^# Not a target:/) {