[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

dpkg-checkbuilddeps ready for first impressions and future development



[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 <bossekr@debian.org>
+
+	* 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 <yoush@cs.msu.su>
 
 	* 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 <bossekr@debian.org>  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 <bossekr@debian.org>
+#
+#  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 = "";
+@new_argv = ();
+
+# 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: pgpYfkceFWp0e.pgp
Description: PGP signature


Reply to: