1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
|
# rules -- lintian check script -*- perl -*-
# Copyright (C) 2006 Russ Allbery <rra@debian.org>
# Copyright (C) 2005 René van Bevern <rvb@pro-linux.de>
#
# 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.
package Lintian::rules;
use strict;
use Tags;
use Util;
# The following targets are required per Policy.
my %required = map { $_ => 1 }
qw(build binary binary-arch binary-indep clean);
sub run {
my $pkg = shift;
my $type = shift;
# Policy could be read as allowing debian/rules to be a symlink to some other
# file, and in a native Debian package it could be a symlink to a file that we
# didn't unpack. Warn if it's a symlink (dpkg-source does as well) and skip
# all the tests if we then can't read it.
if (-l "debfiles/rules") {
tag "debian-rules-is-symlink", "";
return 0 unless -f "debfiles/rules";
}
open(RULES, '< debfiles/rules') or fail("Failed opening rules: $!");
# Check for required #!/usr/bin/make -f opening line. Allow -r or -e; a
# strict reading of Policy doesn't allow either, but they seem harmless.
my $start = <RULES>;
tag "debian-rules-not-a-makefile", ""
unless $start =~ m%^\#!\s*/usr/bin/make\s+-[re]?f[re]?\s*$%;
# Scan debian/rules. We would really like to let make do this for us, but
# unfortunately there doesn't seem to be a way to get make to syntax-check and
# analyze a makefile without running at least $(shell) commands.
#
# We skip some of the rule analysis if debian/rules includes any other files,
# since to chase all includes we'd have to have all of its build dependencies
# installed.
my $includes = 0;
my %seen;
local $_;
while (<RULES>) {
$includes = 1 if /^ *[s-]?include\s+/;
# We're looking only for the required targets. Ignore everything else.
next unless /^([^:]+):/;
my @targets = split (' ', $1);
for (@targets) {
$seen{$_}++ if $required{$_};
}
}
close RULES;
# Make sure all the required rules were seen.
unless ($includes) {
for my $target (sort keys %required) {
tag "debian-rules-missing-required-target", $target
unless $seen{$target};
}
}
}
1;
# vim: syntax=perl ts=8 sw=4
|