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

Bug#605012: lintian: Add check for missing build-arch and build-indep targets in debian/rules



Package: lintian
Version: 2.4.4
Severity: normal
Tags: patch

The attached patch adds a new tag
(debian-rules-missing-recommended-target) which checks for missing but
recommended targets in debian/rules; it's based upon the existing
debian-rules-missing-required-target check.  I've updated the testsuite
as well.  This is my first patch for lintian, so I may not have done
everything 100% correctly, particularly WRT the testsuite, but I think
it's good.

Why is this needed?  We've wanted to get more widespread usage of the
build-arch and build-indep targets for some time (over six years), but
have not to date succeeded very well at this (#218893, #604397, #398625
and its duplicates, #229357).  This is indended to push for adoption more
actively.

This isn't attempting to address the more contentious issues to enable
the use of these targets, such as control Build-Options flags, where
there is not universal consensus (this is the primary sticking point).
There is consensus on the need for having these targets, which this
does address.  These two aspects of the problem aren't directly
coupled, and adding the targets now is not an issue.  If you look at
the bug reports above, you'll see that work has been done to allow
reliable target detection in Makefiles, which would enable
dpkg-buildpackage to invoke build-arch and/or build-indep if present,
or else fall back to build, in which case the need for Build-Options
becomes moot.

We now have full support for build-arch and build-indep in cdbs and
patches for support in dh (#604563) which together give ~50% archive
coverage.  This change is to get more widespread coverage in the
remaining 50% of the archive, with the ultimate goal being 100%
coverage and making the targets required rather than recommended.


Thanks,
Roger

-- System Information:
Debian Release: squeeze/sid
  APT prefers unstable
  APT policy: (550, 'unstable'), (400, 'experimental')
Architecture: amd64 (x86_64)

Kernel: Linux 2.6.36-trunk-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages lintian depends on:
ii  binutils               2.20.1-15         The GNU assembler, linker and bina
ii  diffstat               1.53-1            produces graph of changes introduc
ii  dpkg-dev               1.15.8.6          Debian package development tools
ii  file                   5.04-5            Determines file type using "magic"
ii  gettext                0.18.1.1-3        GNU Internationalization utilities
ii  intltool-debian        0.35.0+20060710.1 Help i18n of RFC822 compliant conf
ii  libapt-pkg-perl        0.1.24+b1         Perl interface to libapt-pkg
ii  libclass-accessor-perl 0.34-1            Perl module that automatically gen
ii  libipc-run-perl        0.89-1            Perl module for running processes
ii  libparse-debianchangel 1.1.1-2.1         parse Debian changelogs and output
ii  libtimedate-perl       1.2000-1          collection of modules to manipulat
ii  liburi-perl            1.56-1            module to manipulate and access UR
ii  locales                2.11.2-7          Embedded GNU C Library: National L
ii  locales-all [locales]  2.11.2-7          Embedded GNU C Library: Precompile
ii  man-db                 2.5.7-6           on-line manual pager
ii  perl [libdigest-sha-pe 5.10.1-16         Larry Wall's Practical Extraction 

lintian recommends no packages.

Versions of packages lintian suggests:
pn  binutils-multiarch            <none>     (no description available)
ii  libtext-template-perl         1.45-1     Text::Template perl module
ii  man-db                        2.5.7-6    on-line manual pager

-- no debconf information
>From 17a32ac63fbc6a9c6e1c3ab9be043d6e6de6a92a Mon Sep 17 00:00:00 2001
From: Roger Leigh <rleigh@debian.org>
Date: Fri, 26 Nov 2010 09:54:28 +0000
Subject: [PATCH] Add check for missing build-arch and build-indep targets in debian/rules

Add new check (tag debian-rules-missing-recommended-target)
Update testsuite

Signed-off-by: Roger Leigh <rleigh@debian.org>
---
 checks/rules                                       |   13 ++++++++++++
 checks/rules.desc                                  |   21 ++++++++++++++++++++
 t/tests/debhelper-deprecated/debian/debian/rules   |    6 +++-
 .../debian/debian/rules                            |    6 +++-
 .../debhelper-dh-clean-k-ok/debian/debian/rules    |    6 +++-
 t/tests/debhelper-dh-depends/debian/debian/rules   |    5 +++-
 .../debian/debian/rules                            |    6 +++-
 t/tests/fields-quilt-debhelper/debian/debian/rules |   10 +++++---
 t/tests/generic-empty/desc                         |    1 +
 t/tests/generic-empty/tags                         |    2 +
 testset/binary/debian/rules                        |    6 +++-
 testset/debconf/debian/rules                       |   11 ++++++++-
 testset/debug/debian/rules                         |    9 ++++++-
 testset/etcfiles/debian/rules                      |    3 ++
 testset/fields/debian/rules                        |    8 +++++-
 testset/filenames/debian/rules                     |    9 ++++++-
 testset/foo++/debian/rules                         |    8 +++++-
 testset/libbaz/debian/rules                        |   10 ++++++--
 testset/maintainer-scripts/debian/rules            |    8 +++++-
 testset/relations/debian/rules                     |    8 +++++-
 testset/scripts/debian/rules                       |    9 ++++++-
 testset/tags.binary                                |    1 +
 testset/tags.etcfiles                              |    1 +
 23 files changed, 133 insertions(+), 34 deletions(-)

diff --git a/checks/rules b/checks/rules
index 358db41..126c8e2 100644
--- a/checks/rules
+++ b/checks/rules
@@ -88,6 +88,10 @@ my @RULE_CLEAN_DEPENDS =
 my %required = map { $_ => 1 }
     qw(build binary binary-arch binary-indep clean);
 
+# The following targets are recommended per Policy.
+my %recommended = map { $_ => 1 }
+    qw(build-arch build-indep);
+
 # Rules about required debhelper command ordering.  Each command is put into a
 # class and the tag is issued if they're called in the wrong order for the
 # classes.  Unknown commands won't trigger this flag.
@@ -208,6 +212,7 @@ while (<RULES>) {
         my @targets = split (' ', $1);
         for (@targets) {
             $seen{$_}++ if $required{$_};
+            $seen{$_}++ if $recommended{$_};
         }
     }
 
@@ -225,8 +230,12 @@ while (<RULES>) {
                 for my $required (keys %required) {
                     $seen{$required}++ if $required =~ m/$pattern/;
                 }
+                for my $recommended (keys %recommended) {
+                    $seen{$recommended}++ if $recommended =~ m/$pattern/;
+                }
             } else {
                 $seen{$target}++ if $required{$target};
+                $seen{$target}++ if $recommended{$target};
             }
             if (grep { $target =~ /$_/ } @arch_rules) {
                 push (@arch_rules, @depends);
@@ -292,6 +301,10 @@ unless ($includes) {
         tag "debian-rules-missing-required-target", $target
             unless $seen{$target};
     }
+    for my $target (sort keys %recommended) {
+        tag "debian-rules-missing-recommended-target", $target
+            unless $seen{$target};
+    }
 }
 
 # Make sure we have no content for binary-arch if we are arch-indep:
diff --git a/checks/rules.desc b/checks/rules.desc
index 7dd263f..809f8b0 100644
--- a/checks/rules.desc
+++ b/checks/rules.desc
@@ -35,6 +35,27 @@ Info: The <tt>debian/rules</tt> file for this package does not provide one
  binary-indep, and clean must be provided, even if they don't do anything
  for this package.
 
+Tag: debian-rules-missing-recommended-target
+Severity: normal
+Certainty: certain
+Ref: policy 4.9
+Info: The <tt>debian/rules</tt> file for this package does not provide
+ one of the recommended targets.  All of build-arch and build-indep
+ should be provided, even if they don't do anything for this package.
+ If this package does not currently split building of architecture
+ dependent and independent packages, the following rules may be added
+ to fall back to the binary target.
+ .
+ binary-arch: binary
+ binary-indep: binary
+ .
+ Note that the following form is recommended however:
+ .
+ binary: binary-arch binary-indep
+ .
+ These targets will be required by policy in the future, so should be
+ added to prevent future breakage.
+
 Tag: debian-rules-uses-pwd
 Severity: normal
 Certainty: certain
diff --git a/t/tests/debhelper-deprecated/debian/debian/rules b/t/tests/debhelper-deprecated/debian/debian/rules
index 7ec4692..f75cfb6 100755
--- a/t/tests/debhelper-deprecated/debian/debian/rules
+++ b/t/tests/debhelper-deprecated/debian/debian/rules
@@ -2,7 +2,9 @@
 
 pkg = $(shell dh_listpackages)
 
-build:
+build: build-indep build-arch
+build-arch:
+build-indep:
 
 clean:
 	dh_testdir
@@ -37,4 +39,4 @@ endif
 	dh_md5sums
 	dh_builddeb
 
-.PHONY: binary binary-arch binary-indep build clean
+.PHONY: build-arch build-indep build binary binary-arch binary-indep clean
diff --git a/t/tests/debhelper-dh-clean-k-deprecated/debian/debian/rules b/t/tests/debhelper-dh-clean-k-deprecated/debian/debian/rules
index 488e728..bd004e3 100755
--- a/t/tests/debhelper-dh-clean-k-deprecated/debian/debian/rules
+++ b/t/tests/debhelper-dh-clean-k-deprecated/debian/debian/rules
@@ -6,7 +6,9 @@
 
 pkg = $(shell dh_listpackages)
 
-build:
+build: build-arch build-indep
+build-arch:
+build-indep:
 
 clean:
 	dh_testdir
@@ -32,4 +34,4 @@ binary-indep:
 	dh_md5sums
 	dh_builddeb
 
-.PHONY: binary binary-arch binary-indep build clean
+.PHONY: build-arch build-indep build binary binary-arch binary-indep clean
diff --git a/t/tests/debhelper-dh-clean-k-ok/debian/debian/rules b/t/tests/debhelper-dh-clean-k-ok/debian/debian/rules
index 488e728..243e5c2 100755
--- a/t/tests/debhelper-dh-clean-k-ok/debian/debian/rules
+++ b/t/tests/debhelper-dh-clean-k-ok/debian/debian/rules
@@ -6,7 +6,9 @@
 
 pkg = $(shell dh_listpackages)
 
-build:
+build: build-indep build-arch
+build-arch:
+build-indep:
 
 clean:
 	dh_testdir
@@ -32,4 +34,4 @@ binary-indep:
 	dh_md5sums
 	dh_builddeb
 
-.PHONY: binary binary-arch binary-indep build clean
+.PHONY: build-arch build-indep build binary binary-arch binary-indep clean
diff --git a/t/tests/debhelper-dh-depends/debian/debian/rules b/t/tests/debhelper-dh-depends/debian/debian/rules
index 1c04f36..803501b 100755
--- a/t/tests/debhelper-dh-depends/debian/debian/rules
+++ b/t/tests/debhelper-dh-depends/debian/debian/rules
@@ -1,6 +1,9 @@
 #!/usr/bin/make -f
 
-build: build-stamp
+build: build-arch build-indep
+build-arch:
+build-indep: build-stamp
+
 build-stamp:
 	dh_testdir
 	dh_auto_configure
diff --git a/t/tests/debhelper-script-token-unneeded/debian/debian/rules b/t/tests/debhelper-script-token-unneeded/debian/debian/rules
index bbd9fb3..ee51749 100755
--- a/t/tests/debhelper-script-token-unneeded/debian/debian/rules
+++ b/t/tests/debhelper-script-token-unneeded/debian/debian/rules
@@ -6,7 +6,9 @@
 
 pkg = $(shell dh_listpackages)
 
-build:
+build: build-indep build-arch
+build-indep:
+build-arch:
 
 clean:
 	dh_testdir
@@ -31,4 +33,4 @@ binary-indep:
 	dh_md5sums
 	dh_builddeb
 
-.PHONY: binary binary-arch binary-indep build clean
+.PHONY: build-arch build-indep build binary binary-arch binary-indep clean
diff --git a/t/tests/fields-quilt-debhelper/debian/debian/rules b/t/tests/fields-quilt-debhelper/debian/debian/rules
index d893de8..da794bd 100755
--- a/t/tests/fields-quilt-debhelper/debian/debian/rules
+++ b/t/tests/fields-quilt-debhelper/debian/debian/rules
@@ -1,6 +1,8 @@
 #!/usr/bin/make -f
 
-build:
+build: build-arch build-indep
+build-arch:
+build-indep:
 	dh_quilt_patch
 
 clean:
@@ -17,8 +19,8 @@ install: build
 	dh_install
 
 binary: binary-indep binary-arch
-binary-arch: build install
-binary-indep: build install
+binary-arch: build-arch install
+binary-indep: build-indep install
 	dh_testdir
 	dh_testroot
 	dh_installchangelogs
@@ -31,4 +33,4 @@ binary-indep: build install
 	dh_md5sums
 	dh_builddeb
 
-.PHONY: build clean binary-indep binary-arch binary install
+.PHONY: build-arch build-indep build clean binary-indep binary-arch binary install
diff --git a/t/tests/generic-empty/desc b/t/tests/generic-empty/desc
index a994997..9d4aef9 100644
--- a/t/tests/generic-empty/desc
+++ b/t/tests/generic-empty/desc
@@ -8,6 +8,7 @@ Test-For:
  changed-by-address-missing
  changelog-should-mention-nmu
  debian-rules-missing-required-target
+ debian-rules-missing-recommended-target
  maintainer-address-missing
  maintainer-not-full-name
  no-copyright-file
diff --git a/t/tests/generic-empty/tags b/t/tests/generic-empty/tags
index d6742e1..2acd3a2 100644
--- a/t/tests/generic-empty/tags
+++ b/t/tests/generic-empty/tags
@@ -9,6 +9,8 @@ E: generic-empty_1.0_arch changes: bad-urgency-in-changes-file unknown
 E: generic-empty_1.0_arch changes: changed-by-address-malformed a <>
 E: generic-empty_1.0_arch changes: changed-by-address-missing a <>
 W: generic-empty source: changelog-should-mention-nmu
+W: generic-empty source: debian-rules-missing-recommended-target build-arch
+W: generic-empty source: debian-rules-missing-recommended-target build-indep
 W: generic-empty source: maintainer-not-full-name a
 W: generic-empty source: no-section-field-for-source
 W: generic-empty source: source-nmu-has-incorrect-version-number 1.0
diff --git a/testset/binary/debian/rules b/testset/binary/debian/rules
index be68ea0..08dd671 100755
--- a/testset/binary/debian/rules
+++ b/testset/binary/debian/rules
@@ -4,10 +4,12 @@ tmp=debian/tmp
 
 # This reference to $(PWD) should not cause an error but the one below
 # should.
-build:
+build-arch:
 	make
 	echo $(PWD)
 
+build: build-arch
+
 clean:
 	make -i clean
 	rm -f debian/files debian/substvars
@@ -88,4 +90,4 @@ binary-arch: build
 
 binary: binary-arch
 
-.PHONY: build binary-arch binary clean
+.PHONY: build-arch build binary-arch binary clean
diff --git a/testset/debconf/debian/rules b/testset/debconf/debian/rules
index 4cedfcd..65d283b 100755
--- a/testset/debconf/debian/rules
+++ b/testset/debconf/debian/rules
@@ -6,10 +6,17 @@ deb_dir		=	debian/debconf
 udeb_dir	=	debian/debconf-udeb
 build_dirs	=	$(deb_dir) $(udeb_dir)
 
-build:
+build-indep:
+# There are no architecture-independent files to be built
+# by this package.  If there were any they would be made
+# here.
+
+build-arch:
 	dh_testdir
 	touch build
 
+build: build-indep build-arch
+
 clean:
 	dh_testdir
 	dh_testroot
@@ -56,4 +63,4 @@ binary-arch:	build
 
 binary:		binary-indep binary-arch
 
-.PHONY: binary binary-arch binary-indep clean checkroot
+.PHONY: build-arch build-indep build binary binary-arch binary-indep clean checkroot
diff --git a/testset/debug/debian/rules b/testset/debug/debian/rules
index 26e777e..b4e68e2 100755
--- a/testset/debug/debian/rules
+++ b/testset/debug/debian/rules
@@ -4,7 +4,10 @@
 
 export DH_COMPAT := 5
 
-build: build-stamp
+build-indep:
+
+build-arch: build-stamp
+
 build-stamp:
 	dh_testdir
 	gcc -D_REENTRANT -fPIC -c libhello.c
@@ -13,6 +16,8 @@ build-stamp:
 	gcc -o hello hello.c -L. -lhello
 	touch build-stamp
 
+build: build-arch build-indep
+
 clean:
 	dh_testdir
 	dh_testroot
@@ -86,4 +91,4 @@ binary-arch: build-stamp install
 
 binary-indep:
 binary: binary-indep binary-arch
-.PHONY: binary binary-indep binary-arch build clean install
+.PHONY: build-arch build-indep build binary binary-indep binary-arch clean install
diff --git a/testset/etcfiles/debian/rules b/testset/etcfiles/debian/rules
index 60eb147..4434415 100755
--- a/testset/etcfiles/debian/rules
+++ b/testset/etcfiles/debian/rules
@@ -9,6 +9,9 @@ clean:
 	rm -rf debian/only-etcfiles
 
 build:
+build-arch:
+build-indep:
+build-indep:
 binary-indep:
 	install -d $(tmp)/etc
 	install -m 644 proper $(tmp)/etc
diff --git a/testset/fields/debian/rules b/testset/fields/debian/rules
index eb139f3..2d74d8b 100755
--- a/testset/fields/debian/rules
+++ b/testset/fields/debian/rules
@@ -2,7 +2,11 @@
 
 tmp=debian/tmp
 
-build:
+build-arch:
+
+build-indep:
+
+build: build-arch build-indep
 
 binary-arch:
 
@@ -26,4 +30,4 @@ binary: binary-arch binary-indep
 clean:
 	rm -rf debian/files $(tmp) debian/substvars
 
-.PHONY: build binary-arch binary-indep binary clean
+.PHONY: build-arch build-indep build binary-arch binary-indep binary clean
diff --git a/testset/filenames/debian/rules b/testset/filenames/debian/rules
index f77a857..3dacf6d 100755
--- a/testset/filenames/debian/rules
+++ b/testset/filenames/debian/rules
@@ -27,7 +27,12 @@ clean:
 	touch "files/'\\ "
 	touch filenames.c~
 
-build:
+build-arch:
+
+build-indep:
+
+build: build-arch build-indep
+
 
 binary-arch:
 
@@ -232,4 +237,4 @@ binary-indep:
 
 binary: binary-arch binary-indep
 
-.PHONY: build binary-arch binary-indep binary clean
+.PHONY: build-indep build-arch build binary-arch binary-indep binary clean
diff --git a/testset/foo++/debian/rules b/testset/foo++/debian/rules
index d769f80..b04bd36 100755
--- a/testset/foo++/debian/rules
+++ b/testset/foo++/debian/rules
@@ -3,7 +3,11 @@
 foo=foo++
 helper=foo++-helper
 
-build:
+build-arch:
+
+build-indep:
+
+build: build-arch build-indep
 
 binary-arch:
 
@@ -29,4 +33,4 @@ binary: binary-arch binary-indep
 
 clean:
 
-.PHONY: build binary-arch binary-indep binary clean
+.PHONY: build-arch build-indep build binary-arch binary-indep binary clean
diff --git a/testset/libbaz/debian/rules b/testset/libbaz/debian/rules
index 8ed2bb0..65cec1b 100755
--- a/testset/libbaz/debian/rules
+++ b/testset/libbaz/debian/rules
@@ -6,9 +6,13 @@ dev_tmp=debian/tmp-dev
 LIB=libbaz1
 DEV=libbaz1-dev
 
-build:
+build-arch:
 	$(MAKE)
 
+build-indep:
+
+build: build-arch build-indep
+
 clean:
 	$(MAKE) clean
 	dh_clean -plibbaz2 -plibbaz2-dev
@@ -57,7 +61,7 @@ binary-correct:
 	dh_builddeb -plibbaz2 -plibbaz2-dev -plibbaz2-dbg -pia32-libbaz2
 
 # and the incorrect one
-binary-arch: build binary-correct
+binary-arch: build-arch binary-correct
 	# first, the lib package
 	install -d $(lib_tmp)/usr/lib
 	# resp. no soname (check), wrong soname (check), and no-pic (check)
@@ -120,4 +124,4 @@ binary: binary-arch
 
 # The mention of binary-indep here should be sufficient to suppress the
 # warning that it's not present.
-.PHONY: build binary-arch binary-indep binary clean
+.PHONY: build-arch build-indep build binary-arch binary-indep binary clean
diff --git a/testset/maintainer-scripts/debian/rules b/testset/maintainer-scripts/debian/rules
index 98240ed..f1f4075 100755
--- a/testset/maintainer-scripts/debian/rules
+++ b/testset/maintainer-scripts/debian/rules
@@ -1,6 +1,10 @@
 #!/usr/bin/make -f
 
-build:
+build-arch:
+
+build-indep:
+
+build: build-arch build-indep
 
 binary-arch:
 
@@ -29,4 +33,4 @@ clean2:
 	dh_clean
 clean3:
 
-.PHONY: build binary-arch binary-indep binary clean
+.PHONY: build-arch build-indep build binary-arch binary-indep binary clean
diff --git a/testset/relations/debian/rules b/testset/relations/debian/rules
index 722be9b..76ef605 100755
--- a/testset/relations/debian/rules
+++ b/testset/relations/debian/rules
@@ -18,7 +18,11 @@
 # Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 # MA 02110-1301, USA.
 
-build:
+build-arch:
+
+build-indep:
+
+build: build-arch build-indep
 
 binary-arch:
 
@@ -45,4 +49,4 @@ clean::
 # Test requiring perl Build-Depends for manual perl invocations.
 	[ ! -f Build ] || $(PERL) Build distclean
 
-.PHONY: build binary-arch binary-indep binary clean
+.PHONY: build-arch build-indep build binary-arch binary-indep binary clean
diff --git a/testset/scripts/debian/rules b/testset/scripts/debian/rules
index 3a4ab8c..e90d227 100755
--- a/testset/scripts/debian/rules
+++ b/testset/scripts/debian/rules
@@ -2,7 +2,12 @@
 
 tmp=debian/tmp
 
-build:
+build-arch:
+	echo "Hi, in an arch: all package, I am a bug!"
+
+build-indep:
+
+build: build-arch build-indep
 
 binary-arch:
 	echo "Hi, in an arch: all package, I am a bug!"
@@ -99,4 +104,4 @@ binary: binary-arch binary-indep
 clean:
 	rm -rf debian/files $(tmp) debian/substvars
 
-.PHONY: build binary-arch binary-indep binary clean
+.PHONY: build-arch build-indep build binary-arch binary-indep binary clean
diff --git a/testset/tags.binary b/testset/tags.binary
index c206f69..41a9ff3 100644
--- a/testset/tags.binary
+++ b/testset/tags.binary
@@ -58,6 +58,7 @@ I: binary: capitalization-error-in-description debian Debian
 I: binary: desktop-entry-contains-encoding-key /usr/share/applications/goodbye.desktop:11 Encoding
 I: binary: desktop-entry-contains-encoding-key /usr/share/applications/hello.desktop:13 Encoding
 I: binary: no-md5sums-control-file
+W: binary source: debian-rules-missing-recommended-target build-indep
 W: binary source: ancient-standards-version 3.2.1 (current is 3.9.1)
 W: binary source: debian-rules-ignores-make-clean-error line 12
 W: binary source: debian-rules-uses-pwd line 9
diff --git a/testset/tags.etcfiles b/testset/tags.etcfiles
index 7875f92..49bfb0f 100644
--- a/testset/tags.etcfiles
+++ b/testset/tags.etcfiles
@@ -10,6 +10,7 @@ E: etcfiles: no-copyright-file
 E: etcfiles: non-etc-file-marked-as-conffile /var/lib/foo
 E: only-etcfiles: extended-description-is-empty
 I: etcfiles source: missing-debian-source-format
+W: etcfiles source: debian-rules-missing-recommended-target build-arch
 W: etcfiles source: ancient-standards-version 3.5.0 (current is 3.9.1)
 W: etcfiles: file-missing-in-md5sums etc/improper-link
 W: etcfiles: file-missing-in-md5sums usr/share/doc/etcfiles/changelog
-- 
1.7.2.3


Reply to: