From 322153b6e8cbe50724f85678f46be5193a751a12 Mon Sep 17 00:00:00 2001 From: Raphael Hertzog Date: Sat, 21 Jun 2008 18:29:47 +0200 Subject: [PATCH] Building blocks for vendor-specific build of Debian packages * scripts/Dpkg/Vendor.pm: Provide simple parser for vendor-specific information stored in /etc/dpkg/origins/. The current vendor can be identified through get_current_vendor() and get_vendor_info() retrieves the information stores within those files. * scripts/dpkg-buildpackage.pl: Setup the DEB_VENDOR environment variable if possible. * man/dpkg-buildpackage.1: Document the above changes. * scripts/Dpkg/Source/Package/V3/quilt.pm (get_series_file): Use get_current_vendor() to decide the name of the vendor-specific series file that should be used in priority. --- ChangeLog | 13 +++ debian/changelog | 4 + man/dpkg-buildpackage.1 | 8 +- scripts/Dpkg/Source/Package/V3/quilt.pm | 6 +- scripts/Dpkg/Vendor.pm | 102 ++++++++++++++++++++++++ scripts/dpkg-buildpackage.pl | 8 ++ 6 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 scripts/Dpkg/Vendor.pm diff --git a/ChangeLog b/ChangeLog index b512d807..c30c4a7b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2008-06-21 Raphael Hertzog + + * scripts/Dpkg/Vendor.pm: Provide simple parser for vendor-specific + information stored in /etc/dpkg/origins/. The current vendor can + be identified through get_current_vendor() and get_vendor_info() + retrieves the information stores within those files. + * scripts/dpkg-buildpackage.pl: Setup the DEB_VENDOR environment + variable if possible. + * man/dpkg-buildpackage.1: Document the above changes. + * scripts/Dpkg/Source/Package/V3/quilt.pm (get_series_file): Use + get_current_vendor() to decide the name of the vendor-specific + series file that should be used. + 2008-06-19 Guillem Jover * lib/varbuf.c (varbufdupc): Store the old used size instead of the diff --git a/debian/changelog b/debian/changelog index 2a19d657..dd5d36a0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -39,6 +39,10 @@ dpkg (1.15.0) UNRELEASED; urgency=low * Modified Dpkg::BuildOptions to recognize and use spaces as separator in DEB_BUILD_OPTIONS (in order to conform with the Debian policy ruling estasblished in #430649). Closes: #486937 + * Add DEB_VENDOR environment variable in the build environment to be able to + change behaviour dynamically depending on the vendor of the current system + (or target system when the user overrides DEB_VENDOR by setting it himself). + Closes: #457371 [ Pierre Habouzit ] * Add a --query option to update-alternatives. Closes: #336091, #441904 diff --git a/man/dpkg-buildpackage.1 b/man/dpkg-buildpackage.1 index 422d7e98..96ecaa03 100644 --- a/man/dpkg-buildpackage.1 +++ b/man/dpkg-buildpackage.1 @@ -216,6 +216,12 @@ Show the usage message and exit. Show the version and exit. . .SH ENVIRONMENT +The variable \fBDEB_VENDOR\fR will be set to the name of the current vendor +if \fI/etc/dpkg/origins/default\fR exists and can be used to look up the vendor +name. If the variable already exists, and contains the name of an existing +vendor in \fI/etc/dpkg/origins\fR, it will be kept; otherwise the variable is +unset. +.P A set of environment variables for setting compiler and linker options are set to default values unless already set in the environment. Note that this mechanism was only introduced in dpkg-dev, version 1.14.17 and @@ -279,7 +285,7 @@ objects (if the linker is called directly, then .B -Wl and .B , -have to be stripped from these options. Default value: empty. +have to be stripped from these options). Default value: empty. .TP .B LDFLAGS_APPEND Optimization options appended to the compiler flags when linking code, diff --git a/scripts/Dpkg/Source/Package/V3/quilt.pm b/scripts/Dpkg/Source/Package/V3/quilt.pm index f97794a1..cddc6368 100644 --- a/scripts/Dpkg/Source/Package/V3/quilt.pm +++ b/scripts/Dpkg/Source/Package/V3/quilt.pm @@ -27,6 +27,7 @@ use Dpkg::Gettext; use Dpkg::ErrorHandling qw(error syserr warning usageerr subprocerr info); use Dpkg::Source::Patch; use Dpkg::IPC; +use Dpkg::Vendor qw(get_current_vendor); use POSIX; use File::Basename; @@ -61,9 +62,8 @@ sub get_autopatch_name { sub get_series_file { my ($self, $dir) = @_; my $pd = File::Spec->catdir($dir, "debian", "patches"); - # TODO: replace "debian" with the current distro name once we have a - # way to figure it out - foreach (File::Spec->catfile($pd, "debian.series"), + my $vendor = lc(get_current_vendor() || "debian"); + foreach (File::Spec->catfile($pd, "$vendor.series"), File::Spec->catfile($pd, "series")) { return $_ if -e $_; } diff --git a/scripts/Dpkg/Vendor.pm b/scripts/Dpkg/Vendor.pm new file mode 100644 index 00000000..77791b89 --- /dev/null +++ b/scripts/Dpkg/Vendor.pm @@ -0,0 +1,102 @@ +# Copyright 2008 Raphaël Hertzog + +# 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 +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +package Dpkg::Vendor; + +use strict; +use warnings; + +use Dpkg::ErrorHandling qw(syserr); +use Dpkg::Gettext; +use Dpkg::Cdata; + +use Exporter; +our @ISA = qw(Exporter); +our @EXPORT_OK = qw(get_vendor_info get_current_vendor get_vendor_file); + +=head1 NAME + +Dpkg::Vendor - get access to some vendor specific information + +=head1 DESCRIPTION + +The files in /etc/dpkg/origins/ can provide information about various +vendors who are providing Debian packages. Currently those files look like +this: + + Vendor: Debian + Vendor-URL: http://www.debian.org/ + Bugs: debbugs://bugs.debian.org + +The file should be named according to the vendor name. + +=head1 FUNCTIONS + +=over 4 + +=item $fields = Dpkg::Vendor::get_vendor_info($name) + +Returns a Dpkg::Fields object with the information parsed from the +corresponding vendor file in /etc/dpkg/origins/. If $name is omitted, +it will use /etc/dpkg/origins/default which is supposed to be a symlink +to the vendor of the currently installed operating system. Returns undef +if there's no file for the given vendor. + +=cut +sub get_vendor_info(;$) { + my $vendor = shift || "default"; + my $file = get_vendor_file($vendor); + return undef unless $file; + open(my $fh, "<", $file) || syserr(_g("cannot read %s"), $file); + my $fields = parsecdata($fh, $file); + close($fh); + return $fields; +} + +=item $name = Dpkg::Vendor::get_vendor_file($name) + +Check if there's a file for the given vendor and returns its +name. + +=cut +sub get_vendor_file(;$) { + my $vendor = shift || "default"; + my $file; + foreach my $name ($vendor, lc($vendor), ucfirst($vendor)) { + $file = "/etc/dpkg/origins/$name" if -e "/etc/dpkg/origins/$name"; + } + return $file; +} + +=item $name = Dpkg::Vendor::get_current_vendor() + +Returns the name of the current vendor. If DEB_VENDOR is set, it uses +that first, otherwise it falls back to parsing /etc/dpkg/origins/default. +If that file doesn't exist, it returns undef. + +=cut +sub get_current_vendor() { + my $f; + if ($ENV{'DEB_VENDOR'}) { + $f = get_vendor_info($ENV{'DEB_VENDOR'}); + return $f->{'Vendor'} if defined $f; + } + $f = get_vendor_info(); + return $f->{'Vendor'} if defined $f; + return undef; +} + +1; diff --git a/scripts/dpkg-buildpackage.pl b/scripts/dpkg-buildpackage.pl index 1b331401..93d72a18 100755 --- a/scripts/dpkg-buildpackage.pl +++ b/scripts/dpkg-buildpackage.pl @@ -15,6 +15,7 @@ use Dpkg::Compression; use Dpkg::Version qw(check_version); use Dpkg::Changelog qw(parse_changelog); use Dpkg::Arch qw(get_build_arch debarch_to_gnutriplet); +use Dpkg::Vendor qw(get_current_vendor); textdomain("dpkg-dev"); @@ -319,6 +320,13 @@ if ($targetgnusystem and "/usr/share/pkgconfig/"; } +my $vendor = get_current_vendor(); +if (defined $vendor) { + $ENV{'DEB_VENDOR'} = $vendor; +} else { + delete $ENV{'DEB_VENDOR'}; +} + my $arch; unless ($sourceonly) { $arch = mustsetvar($ENV{'DEB_HOST_ARCH'}, _g('host architecture')); -- 2.39.5