]> git.donarmstrong.com Git - debhelper.git/blobdiff - Debian/Debhelper/Dh_Lib.pm
Use Dpkg::BuildFlags module directly in set_buildflags().
[debhelper.git] / Debian / Debhelper / Dh_Lib.pm
index 7c12706a281d0c7c976be6231699104ff4009d3c..0c779d1f944bfea939a3d4829f6504530959d3ad 100644 (file)
@@ -15,11 +15,12 @@ use vars qw(@ISA @EXPORT %dh);
            &filedoublearray &getpackages &basename &dirname &xargs %dh
            &compat &addsubstvar &delsubstvar &excludefile &package_arch
            &is_udeb &udeb_filename &debhelper_script_subst &escape_shell
-           &inhibit_log &load_log &write_log &dpkg_architecture_value
-           &sourcepackage
-           &is_make_jobserver_unavailable &clean_jobserver_makeflags);
+           &inhibit_log &load_log &write_log &commit_override_log
+           &dpkg_architecture_value &sourcepackage
+           &is_make_jobserver_unavailable &clean_jobserver_makeflags
+           &cross_command &set_buildflags);
 
-my $max_compat=7;
+my $max_compat=9;
 
 sub init {
        my %params=@_;
@@ -106,16 +107,36 @@ sub END {
        }
 }
 
+sub logfile {
+       my $package=shift;
+       my $ext=pkgext($package);
+       return "debian/${ext}debhelper.log"
+}
+
+sub add_override {
+       my $line=shift;
+       $line="override_$ENV{DH_INTERNAL_OVERRIDE} $line"
+               if defined $ENV{DH_INTERNAL_OVERRIDE};
+       return $line;
+}
+
+sub remove_override {
+       my $line=shift;
+       $line=~s/^\Qoverride_$ENV{DH_INTERNAL_OVERRIDE}\E\s+//
+               if defined $ENV{DH_INTERNAL_OVERRIDE};
+       return $line;
+}
+
 sub load_log {
        my ($package, $db)=@_;
-       my $ext=pkgext($package);
 
        my @log;
-       open(LOG, "<", "debian/${ext}debhelper.log") || return;
+       open(LOG, "<", logfile($package)) || return;
        while (<LOG>) {
                chomp;
-               push @log, $_;
-               $db->{$package}{$_}=1 if defined $db;
+               my $command=remove_override($_);
+               push @log, $command;
+               $db->{$package}{$command}=1 if defined $db;
        }
        close LOG;
        return @log;
@@ -126,10 +147,21 @@ sub write_log {
        my @packages=@_;
 
        foreach my $package (@packages) {
-               my $ext=pkgext($package);
-               my $log="debian/${ext}debhelper.log";
+               my $log=logfile($package);
                open(LOG, ">>", $log) || error("failed to write to ${log}: $!");
-               print LOG $cmd."\n";
+               print LOG add_override($cmd)."\n";
+               close LOG;
+       }
+}
+
+sub commit_override_log {
+       my @packages=@_;
+
+       foreach my $package (@packages) {
+               my @log=map { remove_override($_) } load_log($package);
+               my $log=logfile($package);
+               open(LOG, ">", $log) || error("failed to write to ${log}: $!");
+               print LOG $_."\n" foreach @log;
                close LOG;
        }
 }
@@ -215,6 +247,7 @@ sub xargs {
 
         # The kernel can accept command lines up to 20k worth of characters.
        my $command_max=20000; # LINUX SPECIFIC!!
+                       # (And obsolete; it's bigger now.)
                        # I could use POSIX::ARG_MAX, but that would be slow.
 
        # Figure out length of static portion of command.
@@ -364,9 +397,23 @@ sub pkgfile {
                $filename="$dh{NAME}.$filename";
        }
        
-       my @try=("debian/$package.$filename.".buildarch(),
-                "debian/$package.$filename.".buildos(),
-                "debian/$package.$filename");
+       # First, check for files ending in buildarch and buildos.
+       my $match;
+       foreach my $file (glob("debian/$package.$filename.*")) {
+               next if ! -f $file;
+               next if $dh{IGNORE} && exists $dh{IGNORE}->{$file};
+               if ($file eq "debian/$package.$filename.".buildarch()) {
+                       $match=$file;
+                       # buildarch files are used in preference to buildos files.
+                       last;
+               }
+               elsif ($file eq "debian/$package.$filename.".buildos()) {
+                       $match=$file;
+               }
+       }
+       return $match if defined $match;
+
+       my @try=("debian/$package.$filename");
        if ($package eq $dh{MAINPACKAGE}) {
                push @try, "debian/$filename";
        }
@@ -562,7 +609,7 @@ sub filedoublearray {
        my $globdir=shift;
 
        my @ret;
-       open (DH_FARRAY_IN, $file) || error("cannot read $file: $1");
+       open (DH_FARRAY_IN, $file) || error("cannot read $file: $!");
        while (<DH_FARRAY_IN>) {
                chomp;
                # Only ignore comments and empty lines in v5 mode.
@@ -610,13 +657,13 @@ sub excludefile {
        my %dpkg_arch_output;
        sub dpkg_architecture_value {
                my $var = shift;
-               local $_;
-               if (!exists($dpkg_arch_output{$var})) {
+               if (! exists($dpkg_arch_output{$var})) {
+                       local $_;
                        open(PIPE, '-|', 'dpkg-architecture')
                                or error("dpkg-architecture failed");
                        while (<PIPE>) {
-                               my ($k, $v) = split(/=/);
-                               chomp $v;
+                               chomp;
+                               my ($k, $v) = split(/=/, $_, 2);
                                $dpkg_arch_output{$k} = $v;
                        }
                        close(PIPE);
@@ -625,28 +672,14 @@ sub excludefile {
        }
 }
 
-# Returns the build architecture. (Memoized)
-{
-       my $arch;
-       
-       sub buildarch {
-               if (!defined $arch) {
-                   $arch=dpkg_architecture_value('DEB_HOST_ARCH');
-               }
-               return $arch;
-       }
+# Returns the build architecture.
+sub buildarch {
+       dpkg_architecture_value('DEB_HOST_ARCH');
 }
 
-# Returns the build OS. (Memoized)
-{
-       my $os;
-
-       sub buildos {
-               if (!defined $os) {
-                       $os=dpkg_architecture_value("DEB_HOST_ARCH_OS");
-               }
-               return $os;
-       }
+# Returns the build OS.
+sub buildos {
+       dpkg_architecture_value("DEB_HOST_ARCH_OS");
 }
 
 # Passed an arch and a list of arches to match against, returns true if matched
@@ -855,4 +888,38 @@ sub clean_jobserver_makeflags {
        }
 }
 
+# If cross-compiling, returns appropriate cross version of command.
+sub cross_command {
+       my $command=shift;
+       if (dpkg_architecture_value("DEB_BUILD_GNU_TYPE")
+           ne dpkg_architecture_value("DEB_HOST_GNU_TYPE")) {
+               return dpkg_architecture_value("DEB_HOST_GNU_TYPE")."-$command";
+       }
+       else {
+               return $command;
+       }
+}
+
+# Sets environment variables from dpkg-buildflags. Avoids changing
+# any existing environment variables.
+sub set_buildflags {
+       # optimisation
+       return if $ENV{DH_INTERNAL_BUILDFLAGS};
+       $ENV{DH_INTERNAL_BUILDFLAGS}=1;
+
+       eval "use Dpkg::BuildFlags";
+       if ($@) {
+               warning "unable to load build flags: $@";
+       }
+
+       my $buildflags = Dpkg::BuildFlags->new();
+       $buildflags->load_config();
+       foreach my $flag ($buildflags->list()) {
+               next unless $flag =~ /^[A-Z]/; # Skip flags starting with lowercase
+               if (! exists $ENV{$flag}) {
+                       $ENV{$flag} = $buildflags->get($flag);
+               }
+       }
+}
+
 1