[I forgot to send this email to the list]

Hi Nikita,

here is my proposal for dpkg-checkbuilddeps implementation.

Some words on the implementation. Package names are converted
depending on their Section they belongs to. Sections libs and
libsdevel are converted by default. Also packages which Section
can not be determined are -arch-cross converted.
All other packages are kept als they are. You can override this
behaviour by extend the "crossdeps" configuration variable in
"cross-compile" configuration file. All packages listed in
"crossdeps" are converted too independing on their section.

Due to the early stage of implementation and missing feedback
dpkg-checkbuilddeps is disabled by default. Everybody who
intent to contribute or test the implementation have to set
"checkbuilddeps=1" within cross-compile configuration file.
The patch does not disturb the current implementaion!

This patch contain some changes on ARCH and introduces
DPKGCROSSARCH as new environment variable. This is
required because dpkg-checkbuilddeps is not called
wihtin a Makefile so MAKEFLAGS are not active.

I've also decieded to use DPKGCROSSARCH in the future to
determine if the dpkg-cross environment is running instead
of ARCH which is unset-eable (and should be!). ARCH is too
simple and worldwide used name ;)

--
Raphael Bossek

diff --exclude=CVS -Nru dpkg-cross.cvs/ChangeLog 
dpkg-cross-1.20.4.checkbuilddeps.1/ChangeLog
--- dpkg-cross.cvs/ChangeLog    2004-12-03 22:42:55.000000000 +0100
+++ dpkg-cross-1.20.4.checkbuilddeps.1/ChangeLog        2004-12-15 
10:59:00.000000000 +0100
@@ -1,3 +1,22 @@
+2004-12-14  Raphael Bossek <[EMAIL PROTECTED]>
+
+       * dpkg-cross, dpkg-cross.pl: moved rewrite_dependencies(),
+       rewrite_alternatives() and rewrite_item() to dpkg-cross.pl for reusage 
in
+       dpkg-checkbuilddeps. rewrite_item() rename only packages that are in
+       section libdevel or libs or are listed in "crossdeps" configuration
+       variable. Set DPKGCROSSARCH environment variable so dpkg-checkbuilddeps
+       know to run in dpkg-cross environment. Fixed issue where @keepdeps and
+       @removedeps are are not set as arrays. Introduced the "checkbuilddeps"
+       configuration variable which should be set to 1 if dpkg-checkbuilddeps
+       support is designated. ARCH is set but not used to determine if we are
+       wihtin a dpkg-cross envrionment. DPKGCROSSARCH was introduced to avoid
+       interferences with the "unset" feature and packages which uses ARCH for
+       its own purposes.
+       * dpkg-checkbuilddeps: support for Build-* information in debian/control
+       in sence of dpkg-cross and cross-build environments added.
+       * cross-compile.example: added "crossdeps" and "checkbuilddeps"
+       documentation.
+
 2004-12-03  Nikita V. Youshchenko <[EMAIL PROTECTED]>
 
        * dpkg-cross.pl: implemented 'unset' feature for configuration file.
diff --exclude=CVS -Nru dpkg-cross.cvs/cross-compile.example 
dpkg-cross-1.20.4.checkbuilddeps.1/cross-compile.example
--- dpkg-cross.cvs/cross-compile.example        2004-12-03 22:42:55.000000000 
+0100
+++ dpkg-cross-1.20.4.checkbuilddeps.1/cross-compile.example    2004-12-15 
10:43:10.000000000 +0100
@@ -31,6 +31,13 @@
 #  keepdeps   : comma-separated list of package names thet should be kept
 #               in depends/conflicts/etc fields as is, without adding
 #               -arch-cross.
+#  crossdeps  : comma-seperated list of package names that have to be
+#               extended with -arch-cross. This is required because only
+#               packages which belongs to sections libdevel and libs are
+#               renamed by default.
+#  checkbuilddeps : By default the Build-* dependencies are not validated
+#               by the dpkg-cross tool chain. You have to set checkbuilddeps
+#               to 1 if you intent to check Build-* dependencies.
 #
 # Usually, you need only set crossbase, or maybe also crossdir
 #
diff --exclude=CVS -Nru dpkg-cross.cvs/debian/changelog 
dpkg-cross-1.20.4.checkbuilddeps.1/debian/changelog
--- dpkg-cross.cvs/debian/changelog     2004-12-03 22:42:55.000000000 +0100
+++ dpkg-cross-1.20.4.checkbuilddeps.1/debian/changelog 2004-12-15 
11:08:05.000000000 +0100
@@ -1,3 +1,9 @@
+dpkg-cross (1.20.4.checkbuilddeps.1) unstable; urgency=low
+
+  * Added support for dpkg-checkbuilddeps.
+
+ -- Raphael Bossek <[EMAIL PROTECTED]>  Sun, 12 Dec 2004 17:32:26 +0100
+
 dpkg-cross (1.20.4) unstable; urgency=low
 
   * Implemented 'unset' feature for configuration file (Closes: #246061).
diff --exclude=CVS -Nru dpkg-cross.cvs/debian/control 
dpkg-cross-1.20.4.checkbuilddeps.1/debian/control
--- dpkg-cross.cvs/debian/control       2004-10-29 23:13:19.000000000 +0200
+++ dpkg-cross-1.20.4.checkbuilddeps.1/debian/control   2004-12-14 
10:23:35.000000000 +0100
@@ -7,7 +7,7 @@
 
 Package: dpkg-cross
 Architecture: all
-Depends: dpkg-dev (>= 1.9.21), binutils, file
+Depends: dpkg-dev (>= 1.9.21), binutils, file, libapt-pkg-perl
 Suggests: binutils-multiarch, fakeroot
 Conflicts: pkg-config (<< 0.15.0)
 Description: Tools for cross compiling Debian packages
diff --exclude=CVS -Nru dpkg-cross.cvs/debian/postrm 
dpkg-cross-1.20.4.checkbuilddeps.1/debian/postrm
--- dpkg-cross.cvs/debian/postrm        2004-08-25 03:11:14.000000000 +0200
+++ dpkg-cross-1.20.4.checkbuilddeps.1/debian/postrm    2004-12-14 
10:43:07.000000000 +0100
@@ -27,6 +27,10 @@
         dpkg-divert --package dpkg-cross --remove --rename \
             --divert /usr/bin/dpkg-shlibdeps.orig \
             /usr/bin/dpkg-shlibdeps
+
+        dpkg-divert --package dpkg-cross --remove --rename \
+            --divert /usr/bin/dpkg-checkbuilddeps.orig \
+            /usr/bin/dpkg-checkbuilddeps
     ;;
 
     purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)
diff --exclude=CVS -Nru dpkg-cross.cvs/debian/preinst 
dpkg-cross-1.20.4.checkbuilddeps.1/debian/preinst
--- dpkg-cross.cvs/debian/preinst       2004-08-25 03:11:14.000000000 +0200
+++ dpkg-cross-1.20.4.checkbuilddeps.1/debian/preinst   2004-12-12 
17:35:12.000000000 +0100
@@ -22,6 +22,9 @@
 
         dpkg-divert --package dpkg-cross --add --rename \
             --divert /usr/bin/dpkg-shlibdeps.orig /usr/bin/dpkg-shlibdeps
+
+        dpkg-divert --package dpkg-cross --add --rename \
+            --divert /usr/bin/dpkg-checkbuilddeps.orig 
/usr/bin/dpkg-checkbuilddeps
     ;;
 
     abort-upgrade)
diff --exclude=CVS -Nru dpkg-cross.cvs/dpkg-buildpackage 
dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-buildpackage
--- dpkg-cross.cvs/dpkg-buildpackage    2004-11-15 22:22:38.000000000 +0100
+++ dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-buildpackage        2004-12-15 
12:06:19.427003727 +0100
@@ -114,6 +114,13 @@
                }
        }
        $ENV{'PATH'} = "$gccrossdir:" . $ENV{'PATH'};
+
+       if ($checkbuilddeps != 0) {
+               # Force dpkg-buildpackage.orig to use dpkg-checkbuilddeps by 
adding -D at
+               # the end of the command line parameters. It is important to 
set -D as
+               # last because other parameters override this setting, e.g. -a.
+               push (@ADD_ARGS, "-D");
+       }
 }
 
 # If exactly one .changes file for the current package exists in the parent
diff --exclude=CVS -Nru dpkg-cross.cvs/dpkg-checkbuilddeps 
dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-checkbuilddeps
--- dpkg-cross.cvs/dpkg-checkbuilddeps  1970-01-01 01:00:00.000000000 +0100
+++ dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-checkbuilddeps      2004-12-15 
12:07:17.785293612 +0100
@@ -0,0 +1,72 @@
+#!/usr/bin/perl
+#
+#  dpkg-checkbuilddeps - Support for dpkg-cross build packages
+#  Copyright (C) 2004  Raphael Bossek <[EMAIL PROTECTED]>
+#
+#  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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+#  $Id$
+
+require "dpkg-cross.pl";
+
+dpkgcross_application();
+
+read_config();
+setup();
+
+# Where to find the debian/control file. This can be changed by 
dpkg-checkbuilddeps
+# option.
+$debian_control_file = "debian/control";
+$tmp_control_file = "";
[EMAIL PROTECTED] = ();
+
+# We search the options for an alternative debian/control file.
+foreach $arg (@ARGV) {
+       if ($arg =~ /^-/) {
+               push (@new_argv, $arg);
+       }
+       else {
+               $debian_control_file = $arg;
+       }
+}
+
+# Recreate the $debian_control_file file with new package names.
+if (-f $debian_control_file) {
+       $tmp_control_file = `tempfile`;
+       open (OUTF, ">$tmp_control_file") || die "Cannot open $tmp_control_file 
for writting: $!\n";
+       open (INF, "<$debian_control_file") || die "Cannot open 
$debian_control_file for reading: $!\n";
+       while (<INF>) {
+               chomp;
+               if (/^(Build-\S+):\s+(.*)/) {
+                       print OUTF "$1: " . rewrite_dependencies ($2) . "\n";
+               }
+               else {
+                       print OUTF "$_\n";
+               }
+       }
+       close (INF);
+       close (OUTF);
+
+       $debian_control_file = $tmp_control_file;
+}
+push (@new_argv, $debian_control_file);
+
+$rv = system ("/usr/bin/dpkg-checkbuilddeps.orig", @new_argv) >> 8;
+
+if ($debian_control_file eq $tmp_control_file) {
+       unlink ($tmp_control_file);
+}
+
+exit $rv;
diff --exclude=CVS -Nru dpkg-cross.cvs/dpkg-cross 
dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-cross
--- dpkg-cross.cvs/dpkg-cross   2004-08-26 21:51:12.000000000 +0200
+++ dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-cross       2004-12-12 
17:09:03.000000000 +0100
@@ -850,37 +850,3 @@
        return $? == 0;
 }
 
-sub rewrite_dependencies {
-       my $str = shift;
-
-       @list = map( rewrite_alternatives($_), split( /\s*,\s*/, $str));
-       # remove empty elements
-       @list = map { $_ ? ( $_ ) : () } @list;
-       return join(", ", @list );
-}
-
-sub rewrite_alternatives {
-       my $str = shift;
-
-       @list = map( rewrite_item($_), split( /\s*\|\s*/, $str ));
-       # if any of the alternatives became empty (because of @removedeps),
-       # the complete dependency should be removed
-       my @list = ();
-       for my $item (split( /\s*\|\s*/, $str )) {
-               $item = rewrite_item($item);
-               return () if not $item;
-               push @list, $item
-       }
-       return join( " | ", @list );
-}
-
-sub rewrite_item {
-       my $str = shift;
-
-       $str =~ /^([^ (]+)/;
-       return () if grep { $_ eq $1 } @removedeps;
-       return $str if grep { $_ eq $1 } @keepdeps;
-       $str =~ s/^([^ (]+)/$1-$arch-cross/;
-       return $str;
-}
-
diff --exclude=CVS -Nru dpkg-cross.cvs/dpkg-cross.pl 
dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-cross.pl
--- dpkg-cross.cvs/dpkg-cross.pl        2004-12-03 22:42:55.000000000 +0100
+++ dpkg-cross-1.20.4.checkbuilddeps.1/dpkg-cross.pl    2004-12-15 
12:09:44.756134430 +0100
@@ -19,6 +19,10 @@
 #
 #  $Id: dpkg-cross.pl,v 1.20 2004/12/03 21:42:55 yoush-guest Exp $
 
+# Use the libapt-pkg-perl module for simply and detailed retival of package
+# informations. This information is used for package name conversion.
+use AptPkg::Cache;
+
 # Determine if the system wide or user defined cross-compile configuration
 # have to be read.
 $conffile = "/etc/dpkg/cross-compile";
@@ -31,7 +35,8 @@
 # List of variables which can be overriden by the cross-compile
 # definitions.
 @intern_vars = qw( crossbase crossprefix crossdir crossbin crosslib crosslib64 
crossinc
-               crossinfo maintainer default_arch removedeps keepdeps 
compilerpath );
+               crossinfo maintainer default_arch removedeps keepdeps 
compilerpath
+               crossdeps checkbuilddeps );
 # Avoid warnings about unused @intern_vars variables.
 foreach my $var_ ( @intern_vars ) {
        eval( "\$$var_ = ''" );
@@ -162,6 +167,11 @@
        
        $current_mode_ ||= "default";
        
+       # The dpkg-checkbuilddeps feature is disabled by default. You have to
+       # enable it by setting the configuration variable ``checkbuilddeps''
+       # to 1.
+       $checkbuilddeps = 0;
+       
        open (F, "<$conffile") || return;
        while (<F>) {
                chomp;
@@ -232,10 +242,9 @@
 #     Returns the current architecture.
 # return: Current architecture or empty if not set.
 sub get_architecture {
-       return $ENV{'ARCH'} || $arch || $default_arch;
+       return $ENV{'DPKGCROSSARCH'} || $arch || $default_arch;
 }
 
-
 
################################################################################
 # setup():
 #     Set global variables ``$arch'', ``$arch_cpu'', ``$arch_os'',
@@ -298,6 +307,12 @@
                        subst (\$pkgvars{$scope_}{$var_}, $var_, @vars_);
                }
        }
+
+       # For easier use we convert ``removedeps'', ``keepdeps'' and 
``crossdeps''
+       # to an array of package names.
+       @removedeps = split (/[\s,]+/, $removedeps);
+       @keepdeps = split (/[\s,]+/, $keepdeps);
+       @crossdeps = split (/[\s,]+/, $crossdeps);
 }
 
 
################################################################################
@@ -456,6 +471,9 @@
        
        # Put ``$arch'' into environment through MAKEFLAGS.
        $makeflags_{'ARCH'} = $arch;
+       # Save ``$arch'' also as environment for dpkg-cross applications which
+       # are not called via Makefile (e.g. dpkg-checkbuilddeps).
+       $ENV{'DPKGCROSSARCH'} = $arch;
        
        # Also set new `dpkg-architecture' environment veriables.
        chomp ($tmp_ = `dpkg-architecture -a$arch -qDEB_HOST_ARCH 2>/dev/null`);
@@ -540,7 +558,7 @@
 # return: none
 sub dpkgcross_application {
        exec "$0.orig", @ARGV
-               unless (($arch = $ENV{'ARCH'}) && $ENV{'MAKEFLAGS'} =~ /\bCC=/) 
||
+               unless (($arch = $ENV{'DPKGCROSSARCH'}) && $ENV{'MAKEFLAGS'} =~ 
/\bCC=/) ||
                $arch =~ /^hurd-/;
 }
 
@@ -601,4 +619,99 @@
        return $path
 }
 
+################################################################################
+# rewrite_dependencies():
+#     Convert package names for a cross-compiler environment in the same
+#     manner as dpkg-cross does. This function support packages divided by a
+#     , (comma).
+#     By default only packages belongs to section libdevel or libs are
+#     converted. The package names will also be converted if section can
+#     not be determined.
+# $1: Packages to rewrite in sence of dpkg-cross naming.
+# return: Converted package names.
+sub rewrite_dependencies {
+       my $str_ = shift;
+
+       my @list_ = map( rewrite_alternatives($_), split( /\s*,\s*/, $str_));
+       # remove empty elements
+       @list = map { $_ ? ( $_ ) : () } @list_;
+       return join(", ", @list_);
+}
+
+################################################################################
+# rewrite_alternatives():
+#     Convert package names for a cross-compiler environment in the same
+#     manner as dpkg-cross does. This function support packages divided
+#     by a | (vertical bar).
+#     By default only packages belongs to section libdevel or libs are
+#     converted. The package names will also be converted if section can
+#     not be determined.
+# $1: Packages to rewrite in sence of dpkg-cross naming.
+# return: Converted package names.
+sub rewrite_alternatives {
+       my $str_ = shift;
+
+       my @list_ = map( rewrite_item($_), split( /\s*\|\s*/, $str_ ));
+       # if any of the alternatives became empty (because of @removedeps),
+       # the complete dependency should be removed
+       my @list_ = ();
+       for my $item_ (split( /\s*\|\s*/, $str_ )) {
+               $item_ = rewrite_item($item_);
+               return () if not $item_;
+               push @list_, $item_;
+       }
+       return join( " | ", @list_ );
+}
+
+################################################################################
+# rewrite_alternatives():
+#     Convert package names for a cross-compiler environment in the same
+#     manner as dpkg-cross does.
+#     By default only packages belongs to section libdevel or libs are
+#     converted. The package names will also be converted if section can
+#     not be determined.
+# $1: Packages to rewrite in sence of dpkg-cross naming.
+# return: Converted package names.
+sub rewrite_item {
+       my $str_ = shift;
+
+       $str_ =~ /^([^ (]+)/;
+       return () if grep { $_ eq $1 } @removedeps;
+       return $str_ if grep { $_ eq $1 } @keepdeps;
+
+       my $section_ = "";
+       if ($checkbuilddeps != 0 and not grep { $_ eq $1 } @crossdeps) {
+               $section_ = determine_package_section ($1);
+       }
+       # Maybe package not available for host architecture or package
+       # db is not uptodate. We assume old behaviour if $section_ is empty.
+       if ($section_ eq "" or $section_ eq "libdevel" or $section_ eq "libs") {
+               $str_ =~ s/^([^ (]+)/$1-$arch-cross/;
+       }
+       return $str_;
+}
+
+################################################################################
+# determine_package_section():
+#     Determine section of a package based on the dpkg databse.
+# $1: Package to determine the section for.
+# return: Section name for the package or an empty string if the package could
+#         not be found.
+sub determine_package_section {
+       my $pkg_ = shift;
+       if (not $aptpkg_cache) {
+               $aptpkg_cache = AptPkg::Cache->new;
+       }
+       my $data_ = $aptpkg_cache->{$pkg_};
+       my $section_;
+
+       if ($data_) {
+               $section_ = $data_->{"Section"};
+       }
+       else {
+               $section_ = "";
+       }
+       return $section_;
+}
+
 1;
diff --exclude=CVS -Nru dpkg-cross.cvs/Makefile 
dpkg-cross-1.20.4.checkbuilddeps.1/Makefile
--- dpkg-cross.cvs/Makefile     2004-10-29 22:41:55.000000000 +0200
+++ dpkg-cross-1.20.4.checkbuilddeps.1/Makefile 2004-12-12 17:39:17.000000000 
+0100
@@ -18,7 +18,7 @@
 #
 #  $Id: Makefile,v 1.11 2004/10/29 20:41:55 yoush-guest Exp $
 
-SCRIPTS = dpkg-cross dpkg-buildpackage dpkg-shlibdeps gccross
+SCRIPTS = dpkg-cross dpkg-buildpackage dpkg-shlibdeps gccross 
dpkg-checkbuilddeps
 SHARESCRIPTS = strip
 CONFFILES = $(shell ls -1 cross-config.*) crosstools
 MAN1 = dpkg-cross.1 gccross.1

Attachment: pgp6z8w4k4ejW.pgp
Description: PGP signature

Reply via email to