&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 &get_buildoption);
-my $max_compat=8;
+my $max_compat=9;
sub init {
my %params=@_;
}
}
+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;
my $cmd=shift;
my @packages=@_;
- return if defined $ENV{DH_INHIBIT_LOG} && $cmd eq $ENV{DH_INHIBIT_LOG};
+ return if $dh{NO_ACT};
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=@_;
+
+ return if $dh{NO_ACT};
+
+ 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;
}
}
sub compat {
my $num=shift;
+ my $nowarn=shift;
if (! defined $c) {
$c=1;
}
}
- if ($c <= 4 && ! $warned_compat) {
+ if ($c <= 4 && ! $warned_compat && ! $nowarn) {
warning("Compatibility levels before 5 are deprecated.");
$warned_compat=1;
}
my $file=shift;
my $globdir=shift;
+ # executable confi files are a v9 thing.
+ my $x=! compat(8) && -x $file;
+ if ($x) {
+ require Cwd;
+ my $cmd=Cwd::abs_path($file);
+ open (DH_FARRAY_IN, "$cmd |") || error("cannot run $file: $!");
+ }
+ else {
+ open (DH_FARRAY_IN, $file) || error("cannot read $file: $!");
+ }
+
my @ret;
- open (DH_FARRAY_IN, $file) || error("cannot read $file: $1");
while (<DH_FARRAY_IN>) {
chomp;
# Only ignore comments and empty lines in v5 mode.
- if (! compat(4)) {
+ if (! compat(4) && ! $x) {
next if /^#/ || /^$/;
}
my @line;
# The tricky bit is that the glob expansion is done
# as if we were in the specified directory, so the
# filenames that come out are relative to it.
- if (defined $globdir && ! compat(2)) {
+ if (defined $globdir && ! compat(2) && ! $x) {
foreach (map { glob "$globdir/$_" } split) {
s#^$globdir/##;
push @line, $_;
}
push @ret, [@line];
}
- close DH_FARRAY_IN;
+
+ close DH_FARRAY_IN || error("problem reading $file: $!");
return @ret;
}
}
}
+# 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 {
+ return if $ENV{DH_INTERNAL_BUILDFLAGS} || compat(8);
+ $ENV{DH_INTERNAL_BUILDFLAGS}=1;
+
+ eval "use Dpkg::BuildFlags";
+ if ($@) {
+ warning "unable to load build flags: $@";
+ return;
+ }
+
+ 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);
+ }
+ }
+}
+
+# Gets a DEB_BUILD_OPTIONS option, if set.
+sub get_buildoption {
+ my $wanted=shift;
+
+ return undef unless exists $ENV{DEB_BUILD_OPTIONS};
+
+ foreach my $opt (split(/\s+/, $ENV{DEB_BUILD_OPTIONS})) {
+ # currently parallel= is the only one with a parameter
+ if ($opt =~ /^parallel=(-?\d+)$/ && $wanted eq 'parallel') {
+ return $1;
+ }
+ elsif ($opt eq $wanted) {
+ return 1;
+ }
+ }
+}
+
1