Commit 6cc28377 authored by Leann Ogasawara's avatar Leann Ogasawara Committed by Tim Gardner

UBUNTU: [debian] Initial debian and ubuntu directories

Ignore: yes
Signed-off-by: default avatarTim Gardner <tim.gardner@canonical.com>
parent 2134d97a
UBUNTU: Bump ABI
Ignore: yes
#
# This template is used for commit messages that don't need to
# show up in debian/changelog. Administrative stuff like config
# updates, ABI bumps, etc. Setting 'Ignore: yes' prevents
# 'debian/rules insertchanges' from inserting this commit meesage
# as a changelog entry.
#
# Please give a one-line description of the config change followed
# by a detailed explanation if necessary
UBUNTU: [Config] XXXX
# BugLink: http://bugs.launchpad.net/bugs/<enter bug# here>
# Ignore: yes
# Other text below here.
# Ubuntu external driver commit.
#
# NOTE: This gets reformatted for README.Ubuntu-External-Drivers and
# debian/changelog.
#
# This is only needed when a driver is added, updated or removed. It is
# not needed when patches or fixes are applied to the driver. If the
# driver is being removed, add the line:
#
# Removing: yes
#
# to the commit, and you can remove all other tags (except UBUNTU:).
#
UBUNTU:
ExternalDriver:
Description:
Url:
Mask:
Version:
UBUNTU: build/modules: Add modules that have intentionally gone missing
Ignore: yes
UBUNTU: Start new release
Ignore: yes
# Ubuntu commit template.
#
# NOTE: This gets reformatted for debian/changelog
#
#
# SAUCE refers to the fact that this patch might not go upstream, but we need to
# carry it to successive releases. In most cases you DONOT want to use this
# template.
#
# An example of a SAUCE patch is the ACPI DSDT-in-initramfs patch which has been
# refused upstream, but still provides useful functionality to users with broken
# BIOSes.
#
#-------------------------------------------------------------------------
#
# The initial UBUNTU is a flag that this is an Ubuntu commit. It will be
# referenced to the Author in the debian/changelog entry.
#
# The text following is the short message that will be placed in the
# changelog. Extra text on the following lines will be ignored, but left
# in the git commit. Lines with # will be ignored in the commit.
#
# OriginalAuthor allows for alternate attribution.
#
# OriginalLocation allows for a URL or description of where the patch came
# from.
#
# BugLink is a URL to a Malone bug.
#
# Ignore: yes will keep this commit from showing up in the changelog.
#
UBUNTU: SAUCE:
<Why is this patch not going upstream?>
# OriginalAuthor:
# OriginalLocation:
# BugLink: http://bugs.launchpad.net/bugs/<enter bug# here>
# Ignore: yes
# Other text below here.
# Ubuntu commit template.
#
# NOTE: This gets reformatted for debian/changelog
#
# The initial UBUNTU is a flag that this is an Ubuntu commit. It will be
# referenced to the Author in the debian/changelog entry.
#
# The text following is the short message that will be placed in the
# changelog. Extra text on the following lines will be ignored, but left
# in the git commit. Lines with # will be ignored in the commit.
#
# OriginalAuthor allows for alternate attribution.
#
# OriginalLocation allows for a URL or description of where the patch came
# from.
#
# BugLink is a URL to a Malone bug.
#
# Ignore: yes will keep this commit from showing up in the changelog.
#
UBUNTU: [Upstream]
# OriginalAuthor:
# OriginalLocation:
# BugLink: http://bugs.launchpad.net/bugs/<enter bug# here>
# Ignore: yes
# Other text below here.
#!/usr/bin/perl
# -*- Mode: Cperl -*-
# debian.postinst ---
# Author : Manoj Srivastava ( srivasta@pilgrim.umass.edu )
# Created On : Sat Apr 27 05:42:43 1996
# Created On Node : melkor.pilgrim.umass.edu
# Last Modified By : Manoj Srivastava
# Last Modified On : Sat Aug 5 13:20:22 2006
# Last Machine Used: glaurung.internal.golden-gryphon.com
# Update Count : 45
# Status : Unknown, Use with caution!
# HISTORY :
# Description :
#
#
#
# arch-tag: 1c716174-2f0a-476d-a626-a1322e62503a
#
$|=1;
# Predefined values:
my $version = "=V";
my $kimage = "=K";
my $package_name = "linux-image-$version";
# Ignore all invocations uxcept when called on to configure.
exit 0 unless ($ARGV[0] && $ARGV[0] =~ /configure/);
#known variables
my $image_dest = "/";
my $realimageloc = "/boot/";
my $silent_modules = '';
my $modules_base = '/lib/modules';
my $CONF_LOC = '/etc/kernel-img.conf';
# remove multiple leading slashes; make sure there is at least one.
$realimageloc =~ s|^/*|/|o;
$realimageloc =~ s|/+|/|o;
chdir '/usr/src' or die "Could not chdir to /usr/src:$!";
if (-r "$CONF_LOC" && -f "$CONF_LOC" ) {
if (open(CONF, "$CONF_LOC")) {
while (<CONF>) {
chomp;
s/\#.*$//g;
next if /^\s*$/;
$header_postinst_hook = "$1" if /^\s*header_postinst_hook\s*=\s*(\S+)/ig;
}
close CONF;
}
}
sub exec_script {
my $type = shift;
my $script = shift;
print STDERR "Running $type hook script $script.\n";
system ("$script $version $realimageloc$kimage-$version") &&
print STDERR "User $type hook script [$script] ";
if ($?) {
if ($? == -1) {
print STDERR "failed to execute: $!\n";
}
elsif ($? & 127) {
printf STDERR "died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf STDERR "exited with value %d\n", $? >> 8;
}
exit $? >> 8;
}
}
sub run_hook {
my $type = shift;
my $script = shift;
if ($script =~ m,^/,) {
# Full path provided for the hook script
if (-x "$script") {
&exec_script($type,$script);
}
else {
die "The provided $type hook script [$script] could not be run.\n";
}
}
else {
# Look for it in a safe path
for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') {
if (-x "$path/$script") {
&exec_script($type, "$path/$script");
return 0;
}
}
# No luck
print STDERR "Could not find $type hook script [$script].\n";
die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n";
}
}
## Run user hook script here, if any
if (-x "$header_postinst_hook") {
&run_hook("postinst", $header_postinst_hook);
}
if (-d "/etc/kernel/header_postinst.d") {
print STDERR "Examining /etc/kernel/header_postinst.d.\n";
system ("run-parts --verbose --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version " .
"/etc/kernel/header_postinst.d") &&
die "Failed to process /etc/kernel/header_postinst.d";
}
if (-d "/etc/kernel/header_postinst.d/$version") {
print STDERR "Examining /etc/kernel/header_postinst.d/$version.\n";
system ("run-parts --verbose --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version " .
"/etc/kernel/header_postinst.d/$version") &&
die "Failed to process /etc/kernel/header_postinst.d/$version";
}
exit 0;
__END__
#! /usr/bin/perl
# OriginalAuthor : Manoj Srivastava ( srivasta@pilgrim.umass.edu )
#
# Customized for Ubuntu by: Ben Collins <bcollins@ubuntu.com>
#use strict; #for debugging
use Cwd 'abs_path';
$|=1;
# Predefined values:
my $version = "=V";
my $link_in_boot = ""; # Should be empty, mostly
my $no_symlink = ""; # Should be empty, mostly
my $reverse_symlink = ""; # Should be empty, mostly
my $do_symlink = "Yes"; # target machine defined
my $do_boot_enable = "Yes"; # target machine defined
my $do_bootfloppy = "Yes"; # target machine defined
my $do_bootloader = "Yes"; # target machine defined
my $move_image = ''; # target machine defined
my $kimage = "=K"; # Should be empty, mostly
my $loader = "=L"; # lilo, silo, quik, palo, vmelilo, nettrom, arcboot or delo
my $image_dir = "/boot"; # where the image is located
my $clobber_modules = ''; # target machine defined
my $relative_links = ""; # target machine defined
my $initrd = "YES"; # initrd kernel
my $do_initrd = ''; # Normally we do not
my $use_hard_links = ''; # hardlinks do not work across fs boundaries
my $postinst_hook = ''; #Normally we do not
my $postrm_hook = ''; #Normally we do not
my $preinst_hook = ''; #Normally we do not
my $prerm_hook = ''; #Normally we do not
my $minimal_swap = ''; # Do not swap symlinks
my $ignore_depmod_err = ''; # normally we do not
my $kernel_arch = "=B";
my $ramdisk = "/usr/sbin/update-initramfs"; # List of tools to create initial ram fs.
my $notifier = "/usr/share/update-notifier/notify-reboot-required";
my $package_name = "linux-image-$version";
my $explicit_do_loader = 'Yes';
my $Loader = "NoLOADER"; #
$Loader = "LILO" if $loader =~ /^lilo/io;
$Loader = "SILO" if $loader =~ /^silo/io;
$Loader = "QUIK" if $loader =~ /^quik/io;
$Loader = "yaboot" if $loader =~ /^yaboot/io;
$Loader = "PALO" if $loader =~ /^palo/io;
$Loader = "NETTROM" if $loader =~ /^nettrom/io;
$Loader = "VMELILO" if $loader =~ /^vmelilo/io;
$Loader = "ZIPL" if $loader =~ /^zipl/io;
$Loader = "ELILO" if $loader =~ /^elilo/io;
$Loader = "ARCBOOT" if $loader =~ /^arcboot/io;
$Loader = "DELO" if $loader =~ /^delo/io;
# This should not point to /tmp, because of security risks.
my $temp_file_name = "/var/log/$loader" . "_log.$$";
#known variables
my $image_dest = "/";
my $realimageloc = "/$image_dir/";
my $have_conffile = "";
my $silent_modules = '';
my $silent_loader = '';
my $warn_reboot = 'Yes'; # Warn that we are installing a version of
# the kernel we are running
my $modules_base = '/lib/modules';
my $CONF_LOC = '/etc/kernel-img.conf';
# Ignore all invocations except when called on to configure.
exit 0 unless $ARGV[0] =~ /configure/;
my $DEBUG = 0;
# Do some preliminary sanity checks here to ensure we actually have an
# valid image dir
chdir('/') or die "could not chdir to /:$!\n";
die "Internal Error: ($image_dir) is not a directory!\n"
unless -d $image_dir;
# remove multiple leading slashes; make sure there is at least one.
$realimageloc =~ s|^/*|/|o;
$realimageloc =~ s|/+|/|o;
die "Internal Error: ($realimageloc) is not a directory!\n"
unless -d $realimageloc;
if (-r "$CONF_LOC" && -f "$CONF_LOC" ) {
if (open(CONF, "$CONF_LOC")) {
while (<CONF>) {
chomp;
s/\#.*$//g;
next if /^\s*$/;
$do_symlink = "" if /^\s*do_symlinks\s*=\s*(no|false|0)\s*$/ig;
$no_symlink = "" if /^\s*no_symlinks\s*=\s*(no|false|0)\s*$/ig;
$reverse_symlink = "" if /^\s*reverse_symlink\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*image_in_boot\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*link_in_boot\s*=\s*(no|false|0)\s*$/ig;
$move_image = "" if /^\s*move_image\s*=\s*(no|false|0)\s*$/ig;
$clobber_modules = '' if /^\s*clobber_modules\s*=\s*(no|false|0)\s*$/ig;
$do_boot_enable = '' if /^\s*do_boot_enable\s*=\s*(no|false|0)\s*$/ig;
$do_bootfloppy = '' if /^\s*do_bootfloppy\s*=\s*(no|false|0)\s*$/ig;
$relative_links = '' if /^\s*relative_links \s*=\s*(no|false|0)\s*$/ig;
$do_bootloader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig;
$explicit_do_loader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig;
$do_initrd = '' if /^\s*do_initrd\s*=\s*(no|false|0)\s*$/ig;
$use_hard_links = '' if /^\s*use_hard_links\s*=\s*(no|false|0)\s*$/ig;
$silent_modules = '' if /^\s*silent_modules\s*=\s*(no|false|0)\s*$/ig;
$silent_loader = '' if /^\s*silent_loader\s*=\s*(no|false|0)\s*$/ig;
$warn_reboot = '' if /^\s*warn_reboot\s*=\s*(no|false|0)\s*$/ig;
$minimal_swap = '' if /^\s*minimal_swap\s*=\s*(no|false|0)\s*$/ig;
$ignore_depmod_err = '' if /^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig;
$do_symlink = "Yes" if /^\s*do_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$no_symlink = "Yes" if /^\s*no_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$reverse_symlink = "Yes" if /^\s*reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*image_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*link_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$move_image = "Yes" if /^\s*move_image\s*=\s*(yes|true|1)\s*$/ig;
$clobber_modules = "Yes" if /^\s*clobber_modules\s*=\s*(yes|true|1)\s*$/ig;
$do_boot_enable = "Yes" if /^\s*do_boot_enable\s*=\s*(yes|true|1)\s*$/ig;
$do_bootfloppy = "Yes" if /^\s*do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig;
$do_bootloader = "Yes" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
$explicit_do_loader = "YES" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
$relative_links = "Yes" if /^\s*relative_links\s*=\s*(yes|true|1)\s*$/ig;
$do_initrd = "Yes" if /^\s*do_initrd\s*=\s*(yes|true|1)\s*$/ig;
$use_hard_links = "Yes" if /^\s*use_hard_links\s*=\s*(yes|true|1)\s*$/ig;
$silent_modules = 'Yes' if /^\s*silent_modules\s*=\s*(yes|true|1)\s*$/ig;
$silent_loader = 'Yes' if /^\s*silent_loader\s*=\s*(yes|true|1)\s*$/ig;
$warn_reboot = 'Yes' if /^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/ig;
$minimal_swap = 'Yes' if /^\s*minimal_swap\s*=\s*(yes|true|1)\s*$/ig;
$ignore_depmod_err = 'Yes' if /^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig;
$image_dest = "$1" if /^\s*image_dest\s*=\s*(\S+)/ig;
$postinst_hook = "$1" if /^\s*postinst_hook\s*=\s*(\S+)/ig;
$postrm_hook = "$1" if /^\s*postrm_hook\s*=\s*(\S+)/ig;
$preinst_hook = "$1" if /^\s*preinst_hook\s*=\s*(\S+)/ig;
$prerm_hook = "$1" if /^\s*prerm_hook\s*=\s*(\S+)/ig;
$ramdisk = "$1" if /^\s*ramdisk\s*=\s*(.+)$/ig;
}
close CONF;
$have_conffile = "Yes";
}
}
# For some versions of kernel-package, we had this warning in the
# postinst, but the rules did not really interpolate the value in.
# Here is a sanity check.
my $pattern = "=" . "I";
$initrd=~ s/^$pattern$//;
if ($link_in_boot) {
$image_dest = "/$image_dir/"; # same as realimageloc
}
# Tack on at least one trainling /
$image_dest = "$image_dest/";
$image_dest =~ s|^/*|/|o;
$image_dest =~ s|/+$|/|o;
if (! -d "$image_dest") {
die "Expected Image Destination dir ($image_dest) to be a valid directory!\n";
}
# sanity
if (!($do_bootfloppy || $do_bootloader)) {
$do_boot_enable = '';
}
if ($do_symlink && $no_symlink) {
warn "Both do_symlinks and no_symlinks options enabled; disabling no_symlinks\n";
$no_symlink = 0;
}
# most of our work is done in $image_dest (nominally /)
chdir("$image_dest") or die "could not chdir to $image_dest:$!\n";
# Paranoid check to make sure that the correct value is put in there
if (! $kimage) { $kimage = "vmlinuz"; } # Hmm. empty
elsif ($kimage =~ m/^b?uImage$/o) { $kimage = "vmlinuz"; } # these produce vmlinuz
elsif ($kimage =~ m/^b?zImage$/o) { $kimage = "vmlinuz"; } # these produce vmlinuz
elsif ($kimage =~ m/^[iI]mage$/o) { my $nop = $kimage; }
elsif ($kimage =~ m/^vmlinux$/o) { my $nop = $kimage; }
else { $kimage = "vmlinuz"; } # Default
$ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch;
die "Internal Error: Could not find image (" . $realimageloc
. "$kimage-$version)\n" unless -e $realimageloc
. "$kimage-$version";
# search for the boot loader in the path
my $loader_exec;
($loader_exec = $loader) =~ s|.*/||;
my ($loaderloc) = grep -x, map "$_/$loader_exec",
map { length($_) ? $_ : "." } split /:/, $ENV{PATH};
######################################################################
######################################################################
########### Test whether a relative symlinkwould be OK #######
######################################################################
######################################################################
sub test_relative {
my %params = @_;
my $cwd;
die "Internal Error: Missing Required paramater 'Old Dir' "
unless $params{'Old Dir'};
die "Internal Error: Missing Required paramater New Dir' "
unless $params{'New Dir'};
die "Internal Error: No such dir $params{'Old Dir'} "
unless -d $params{'Old Dir'};
die "Internal Error: No such dir $params{'New Dir'} "
unless -d $params{'New Dir'};
warn "Test relative: testing $params{'Old Dir'} -> $params{'New Dir'}"
if $DEBUG;
chomp($cwd = `pwd`);
chdir ($params{'New Dir'}) or die "Could not chdir to $params{'New Dir'}:$!";
my $ok = 0;
$params{'Old Dir'} =~ s|^/*||o;
if (-d $params{'Old Dir'} ) {
if (defined $params{'Test File'}) {
if (-e $params{'Old Dir'} . $params{'Test File'}) {
$ok = 1;
}
} else {
$ok = 1; # well, backward compatibility
}
}
chdir ($cwd) or die "Could not chdir to $params{'New Dir'}:$!";
return $ok;
}
######################################################################
######################################################################
############
######################################################################
######################################################################
# sub CanonicalizePath {
# my $path = join '/', @_;
# my @work = split '/', $path;
# my @out;
# my $is_absolute;
# if (@work && $work[0] eq "") {
# $is_absolute = 1; shift @work;
# }
# while (@work) {
# my $seg = shift @work;
# if ($seg eq "." || $seg eq "") {
# }
# elsif ($seg eq "..") {
# if (@out && $out[-1] ne "..") {
# pop @out;
# }
# else {
# # Leading "..", or "../..", etc.
# push @out, $seg;
# }
# }
# else {
# push @out, $seg;
# }
# }
# unshift @out, "" if $is_absolute;
# return join('/', @out);
# }
######################################################################
######################################################################
############
######################################################################
######################################################################
sub spath {
my %params = @_;
die "Missing Required paramater 'Old'" unless $params{'Old'};
die "Missing Required paramater 'New'" unless $params{'New'};
my @olddir = split '/', `readlink -q -m $params{'Old'}`;
my @newdir = split '/', `readlink -q -m $params{'New'}`;
my @outdir = @olddir;
my $out = '';
my $i;
for ($i = 0; $i <= $#olddir && $i <= $#newdir; $i++) {
$out++ if ($olddir[$i] ne $newdir[$i]);
shift @outdir unless $out;
unshift @outdir, ".." if $out;
}
if ($#newdir > $#olddir) {
for ($i=0; $i < $#newdir; $i++) {
unshift @outdir, "..";
}
}
return join ('/', @outdir);
}
######################################################################
######################################################################
############
######################################################################
######################################################################
# This routine actually moves the kernel image
# From: $realimageloc/$kimage-$version (/boot/vmlinuz-2.6.12)
# To: $image_dest/$kimage-$version (/vmlinuz-2.6.12)
# Note that the image is moved to a versioned destination, but ordinary
# symlinks we create otherwise are not normally versioned
sub really_move_image {
my $src_dir = $_[0];
my $target = $_[1];
my $dest_dir = $_[2];
warn "Really move image: src_dir=$src_dir, target=$target,\n destdir=$dest_dir"
if $DEBUG;
if (-e "$target") {
# we should be in dir $dest_dir == $image_dest /, normally
rename("$target", "$target.$$") ||
die "failed to move " . $dest_dir . "$target:$!";
warn "mv $target $target.$$" if $DEBUG;
}
warn "mv -f $src_dir$target $target" if $DEBUG;
my $ret = system("mv -f " . $src_dir . "$target " .
" $target");
if ($ret) {
die("Failed to move " . $src_dir . "$target to "
. $dest_dir . "$target");
}
# Ok, now we may clobber the previous .old files
if (-e "$target.$$") {
rename("$target.$$", "$target.old") ||
die "failed to move " . $dest_dir . "$target:$!";
warn "mv $target.$$ $target " if $DEBUG;
}
}
# Normally called after really_move_image; and only called if we asked for
# reversed link this routine reverses the symbolic link that is notmally
# created. Since the real kernel image has been moved over to
# $image_dest/$kimage-$version. So, this routine links
# From: $image_dest/$kimage-$version (/vmlinuz-2.6.12)
# To: $realimageloc/$kimage-$version (/boot/vmlinuz-2.6.12)
sub really_reverse_link {
my $src_dir = $_[0];
my $link_name = $_[1];
my $dest_dir = $_[2];
warn "Really reverse link: src_dir=$src_dir, link name=$link_name\n" .
"\tdestdir=$dest_dir" if $DEBUG;
my $Old = $dest_dir;
if (test_relative ('Old Dir' => $Old, 'New Dir' => $src_dir,
'Test File' => "$link_name")) {
$Old =~ s|^/*||o;
}
# Special case is they are in the same dir
my $rel_path = spath('Old' => "$Old", 'New' => "$src_dir" );
$Old ="" if $rel_path =~ m/^\s*$/o;
if ($use_hard_links =~ m/YES/i) {
link($Old . "$link_name", $src_dir . "$link_name") ||
die("Failed to link " . $dest_dir . "$link_name to " . $src_dir .
"$link_name:$!");
warn "ln " . $Old . "$link_name " . $src_dir . "$link_name" if $DEBUG;
}
else {
symlink($Old . "$link_name", $src_dir . "$link_name") ||
die("Failed to symbolic-link " . $dest_dir . "$link_name to " . $src_dir
. "$link_name:$!");
warn "ln -s " . $Old . "$link_name " . $src_dir . "$link_name" if $DEBUG;
}
}
# This routine is invoked if there is a symbolic link in place
# in $image_dest/$kimage -- so a symlink exists in the destination.
# What we are trying to determine is if we need to move the symbolic link over
# to the the .old location
sub move_p {
my $kimage = $_[0]; # Name of the symbolic link
my $image_dest = $_[1]; # The directory the links goes into
my $image_name = $_[2];
my $src_dir = $_[3];
my $force_move = 0;
warn "Move?: kimage=$kimage, image_dest=$image_dest, \n" .
"\timage_name=$image_name, src_dir=$src_dir" if $DEBUG;
if ($no_symlink || $reverse_symlink) {
# we do not want links, yet we have a symbolic link here!
warn "found a symbolic link in " . $image_dest . "$kimage \n" .
"even though no_symlink is defined\n" if $no_symlink;
warn "found a symbolic link in " . $image_dest . "$kimage \n" .
"even though reverse_symlink is defined\n" if $reverse_symlink;
# make sure we change this state of affairs
$force_move = 1;
return $force_move;
}
warn "DEBUG: OK. We found symlink, and we should have a symlink here.\n"
if $DEBUG;
my $vmlinuz_target = readlink "$kimage";
my $real_target = '';
my $target = `readlink -q -m "${realimageloc}${kimage-$version}"`;
$real_target = abs_path($vmlinuz_target) if defined($vmlinuz_target);
if (!defined($vmlinuz_target) || ! -f "$real_target") {
# what, a dangling symlink?
warn "The link " . $image_dest . "$kimage is a dangling link" .
"to $real_target\n";
$force_move = 1;
return $force_move;
}
warn "DEBUG: The link $kimage points to ($vmlinuz_target)\n" if $DEBUG;
warn "DEBUG: ($vmlinuz_target) is really ($real_target)\n" if $DEBUG;
my $cwd;
chomp ($cwd=`pwd`);
if ($vmlinuz_target !~ m|^/|o) {
$vmlinuz_target = $cwd . "/" . $vmlinuz_target;
$vmlinuz_target =~ s|/+|/|o;
}
$vmlinuz_target = `readlink -q -m $vmlinuz_target`;
if ("$vmlinuz_target" ne "$target") {
warn "DEBUG: We need to handle this.\n" if $DEBUG;
if ($minimal_swap) {
warn "DEBUG: Minimal swap.\n" if $DEBUG;
if (-l "$kimage.old") {
warn "DEBUG: There is an old link at $kimage.old\n" if $DEBUG;
my $old_target = readlink "$kimage.old";
my $real_old_target = '';
$real_old_target=abs_path($old_target) if defined ($old_target);
if ($real_old_target && -f "$real_old_target") {
if ($old_target !~ m|^/|o) {
$old_target = $cwd . "/" . $old_target;
$old_target =~ s|/+|/|o;
}
$old_target = `readlink -q -m $old_target`;
if ("$old_target" ne "$target") {
$force_move = 1;
warn "DEBUG: Old link ($old_target) does not point to us ($target)\n"
if $DEBUG;
}
else { # The .old points to the current
warn "$kimage.old --> $target -- doing nothing";
$force_move = 0;
}
}
else {
warn "DEBUG: Well, the old link does not exist -- so we move\n"
if $DEBUG;
$force_move = 1;
}
}
else {
warn "DEBUG: No .old link -- OK to move\n"
if $DEBUG;
$force_move = 1;
}
}
else {
warn "DEBUG: ok, minimal swap is no-- so we move.\n"
if $DEBUG;
$force_move = 1;
}
}
else { # already have proper link
warn "$kimage($vmlinuz_target) points to $target ($real_target) -- doing nothing";
$force_move = 0;
}
return $force_move;
}
# This routine moves the symbolic link around (/vmlinuz -> /vmlinuz.old)
# It pays attention to whether we should the fact whether we should be using
# hard links or not.
sub really_move_link {
my $kimage = $_[0]; # Name of the symbolic link
my $image_dest = $_[1]; # The directory the links goes into
my $image_name = $_[2];
my $src_dir = $_[3];
warn "really_move_link: kimage=$kimage, image_dest=$image_dest\n" .
"\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
# don't clobber $kimage.old quite yet
rename("$kimage", "$kimage.$$") ||
die "failed to move " . $image_dest . "$kimage:$!";
warn "mv $kimage $kimage.$$" if $DEBUG;
my $Old = $src_dir;
my $cwd;
chomp($cwd=`pwd`);
if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd,
'Test File' => "$image_name")) {
$Old =~ s|^/*||o;
}
# Special case is they are in the same dir
my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" );
$Old ="" if $rel_path =~ m/^\s*$/o;
if ($use_hard_links =~ m/YES/i) {
warn "ln ${Old}${image_name} $kimage" if $DEBUG;
if (! link("${Old}${image_name}", "$kimage")) {
rename("$kimage.$$", "$kimage");
die("Failed to link ${Old}${image_name} to " .
"${image_dest}${kimage}:$!");
}
}
else {
warn "ln -s ${Old}${image_name} $kimage" if $DEBUG;
if (! symlink("${Old}${image_name}", "$kimage")) {
rename("$kimage.$$", "$kimage");
die("Failed to symbolic-link ${Old}${image_name} to " .
"${image_dest}${kimage}:$!");
}
}
# Ok, now we may clobber the previous .old file
if (-l "$kimage.old" || ! -e "$kimage.old" ) {
rename("$kimage.$$", "$kimage.old");
warn "mv $kimage.$$ $kimage.old" if $DEBUG;
}
else {
warn "$kimage.old is not a symlink, not clobbering\n";
warn "rm $kimage.$$";
unlink "$kimage.$$" if $DEBUG;
}
}
# This routine handles a request to do symlinks, but there is no
# symlink file already there. Either we are supposed to use copy, or we are
# installing on a pristine system, or the user does not want symbolic links at
# all. We use a configuration file to tell the last two cases apart, creating
# a config file if needed.
sub handle_missing_link {
my $kimage = $_[0]; # Name of the symbolic link
my $image_dest = $_[1]; # The directory the links goes into
my $image_name = $_[2];
my $src_dir = $_[3];
warn "handle_missing_link: kimage=$kimage, image_dest=$image_dest\n" .
"\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
if ($no_symlink) {
warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
my $ret = system("cp -a --backup=t " . $realimageloc .
"$image_name " . " $kimage");
if ($ret) {
die("Failed to copy " . $realimageloc . "$image_name to "
. $image_dest . "$kimage");
}
}
elsif ($reverse_symlink) {
warn "mv -f $realimageloc$image_name $kimage" if $DEBUG;
my $ret = system("mv -f " . $realimageloc . "$image_name "
. "$kimage");
if ($ret) {
die("Failed to move " . $realimageloc . "$image_name to "
. $image_dest . "$kimage");
}
}
else {
if (! $have_conffile) {
my $ret;
my $answer='';
$do_symlink = "Yes";
if (open(CONF, ">$CONF_LOC")) {
print CONF "# Kernel Image management overrides\n";
print CONF "# See kernel-img.conf(5) for details\n";
if ($loader =~ /palo/i) {
print CONF "link_in_boot = Yes\n";
print CONF "do_symlinks = Yes\n";
print CONF "relative_links = Yes\n";
print CONF "do_bootloader = No\n";
} else {
print CONF "do_symlinks = $do_symlink\n";
}
close CONF;
}
$have_conffile = "Yes";
}
}
if (! $no_symlink && $do_symlink =~ /Yes/i) {
my $Old = $realimageloc;
my $New = $image_dest;
my $Name = "$image_name";
my $Link_Dest = "$kimage";
if ($reverse_symlink) {
$Old = $image_dest;
$New = $realimageloc;
$Name = "$kimage";
$Link_Dest = $realimageloc . "$image_name";
}
if (test_relative ('Old Dir' => $Old,
'New Dir' => $New,
'Test File' => $Name)) {
$Old =~ s|^/*||o;
}
# Special case is they are in the same dir
my $rel_path = spath('Old' => "$Old", 'New' => "$New" );
$Old ="" if $rel_path =~ m/^\s*$/o;
symlink($Old . "$Name", "$Link_Dest") ||
die("Failed to symbolic-link ${Old}$Name to $Link_Dest:$!");
warn "ln -s ${Old}$Name $Link_Dest" if $DEBUG;
}
}
# This routine handles the rest of the cases, where the user has requested
# non-traditional handling, like using cp, or reverse symlinks, or hard links.
sub handle_non_symlinks {
my $kimage = $_[0]; # Name of the symbolic link
my $image_dest = $_[1]; # The directory the links goes into
my $image_name = $_[2];
my $src_dir = $_[3];
warn "handle_non_link: kimage=$kimage, image_dest=$image_dest\n" .
"\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
# Save the current image. We do this in all four cases
rename("$kimage", "$kimage.$$") ||
die "failed to move " . $image_dest . "$kimage:$!";
warn "mv $kimage $kimage.$$" if $DEBUG;
##,####
# case One
#`####
if ($no_symlink) {
# Maybe /$image_dest is on a dos system?
warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
my $ret = system("cp -a --backup=t " . $realimageloc
. "$image_name " . "$kimage");
if ($ret) {
if (-e "$kimage.$$") {
rename("$kimage.$$", "$kimage");
warn "mv $kimage.$$ $kimage" if $DEBUG;
}
die("Failed to copy " . $realimageloc . "$image_name to "
. $image_dest . "$kimage");
}
}
##,####
# case Two
#`####
elsif ($reverse_symlink) { # Maybe /$image_dest is on a dos system?
warn "mv -f $realimageloc$image_name $kimage" if $DEBUG;
my $ret = system("mv -f " . $realimageloc . "$image_name "
. $image_dest . "$kimage");
if ($ret) {
if (-e "$kimage.$$") {
rename("$kimage.$$", "$kimage");
warn "mv $kimage.$$ $kimage" if $DEBUG;
}
die("Failed to move " . $realimageloc . "$image_name to "
. $image_dest . "$kimage");
}
my $Old = $image_dest;
if (test_relative ('Old Dir' => $Old, 'New Dir' => $realimageloc,
'Test File' => "$kimage")) {
$Old =~ s|^/*||o;
}
# Special case is they are in the same dir
my $rel_path = spath('Old' => "$Old", 'New' => "$realimageloc" );
$Old ="" if $rel_path =~ m/^\s*$/o;
if ($use_hard_links =~ m/YES/i) {
warn "ln " . $Old . "$kimage " . $realimageloc . "$image_name" if $DEBUG;
if (! link($Old . "$kimage", $realimageloc . "$image_name")) {
warn "Could not link " . $image_dest .
"$kimage to $image_name :$!";
}
}
else {
warn "ln -s " . $Old . "$kimage " . $realimageloc . "$image_name" if $DEBUG;
if (! symlink($Old . "$kimage", $realimageloc . "$image_name")) {
warn "Could not symlink " . $image_dest .
"$kimage to $image_name :$!";
}
}
}
##,####
# case Three
#`####
elsif ($use_hard_links =~ m/YES/i ) {
# Ok then. this ought to be a hard link, and hence fair game
# don't clobber $kimage.old quite yet
my $Old = $realimageloc;
my $cwd;
chomp($cwd=`pwd`);
if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd,
'Test File' => "$image_name")) {
$Old =~ s|^/*||o;
}
# Special case is they are in the same dir
my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" );
$Old ="" if $rel_path =~ m/^\s*$/o;
warn "ln " . $Old . "$image_name " . "$kimage" if $DEBUG;
if (! link($Old . "$image_name", "$kimage")) {
warn "mv $kimage.$$ $kimage" if $DEBUG;
rename("$kimage.$$", "$kimage");
die("Failed to link " . $realimageloc . "$image_name to "
. $image_dest . "$kimage");
}
}
##,####
# case Four
#`####
else {
# We just use cp
warn "cp -a --backup=t $realimageloc$image_name $kimage" if $DEBUG;
my $ret = system("cp -a --backup=t " . $realimageloc
. "$image_name " . "$kimage");
if ($ret) {
if (-e "$kimage.$$") {
warn "mv $kimage.$$ $kimage" if $DEBUG;
rename("$kimage.$$", "$kimage");
}
die("Failed to copy " . $realimageloc . "$image_name to "
. $image_dest . "$kimage");
}
}
# Ok, now we may clobber the previous .old file
warn "mv $kimage.$$ $kimage.old if -e $kimage.$$" if $DEBUG;
rename("$kimage.$$", "$kimage.old") if -e "$kimage.$$";
}
# This routine is responsible for setting up the symbolic links
# So, the actual kernel image lives in
# $realimageloc/$image_name (/boot/vmlinuz-2.6.12).
# This routine creates symbolic links in $image_dest/$kimage (/vmlinuz)
sub image_magic {
my $kimage = $_[0]; # Name of the symbolic link
my $image_dest = $_[1]; # The directory the links goes into
my $image_name = "$kimage-$version";
my $src_dir = $realimageloc;
warn "image_magic: kimage=$kimage, image_dest=$image_dest\n" .
"\t image_name=$image_name, src_dir=$src_dir" if $DEBUG;
# Well, in any case, if the destination (the symlink we are trying
# to create) is a directory, we should do nothing, except throw a
# diagnostic.
if (-d "$kimage" ) {
die ("Hmm. $kimage is a directory, which I did not expect. I am\n" .
"trying to create a symbolic link with that name linked to \n" .
"$image_dest . Since a directory exists here, my assumptions \n" .
"are way off, and I am aborting.\n" );
exit (3);
}
if ($move_image) { # Maybe $image_dest is in on dos, or something?
# source dir, link name, dest dir
really_move_image( $realimageloc, $image_name, $image_dest);
really_reverse_link($realimageloc, $image_name, $image_dest)
if $reverse_symlink;
return;
}
if (-l "$kimage") { # There is a symbolic link
warn "DEBUG: There is a symlink for $kimage\n" if $DEBUG;
my $force_move = move_p($kimage, $image_dest, $image_name, $src_dir);
if ($force_move) {
really_move_link($kimage, $image_dest, $image_name, $src_dir);
}
}
elsif (! -e "$kimage") {
# Hmm. Pristine system? How can that be? Installing from scratch?
# Or maybe the user does not want a symbolic link here.
# Possibly they do not want a link here. (we should be in /
# here[$image_dest, really]
handle_missing_link($kimage, $image_dest, $image_name, $src_dir);
}
elsif (-e "$kimage" ) {
# OK, $kimage exists -- but is not a link
handle_non_symlinks($kimage, $image_dest, $image_name, $src_dir);
}
}
######################################################################
######################################################################
######################################################################
######################################################################
# We may not have any modules installed
if ( -d "$modules_base/$version" ) {
print STDERR "Running depmod.\n";
my $ret = system("depmod -a $version");
if ($ret) {
print STDERR "Failed to run depmod\n";
exit(1);
}
}
sub find_initrd_tool {
my $hostversion = shift;
my $version = shift;
print STDERR "Finding valid ramdisk creators.\n";
my @ramdisks =
grep {
my $args =
"$_ " .
"--supported-host-version=$hostversion " .
"--supported-target-version=$version " .
"1>/dev/null 2>&1"
;
system($args) == 0;
}
split (/[:,\s]+/, $ramdisk);
}
# The initrd symlink should probably be in the same dir that the
# symlinks are in
if ($initrd) {
my $success = 0;
# Update-initramfs is called slightly different than mkinitrd and
# mkinitramfs. XXX It should really be made compatible with this stuff
# some how.
my $upgrading = 1;
if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
$upgrading = 0;
}
my $ret = system("$ramdisk " . ($upgrading ? "-u" : "-c") . " -k " . $version . " >&2");
$success = 1 unless $ret;
die "Failed to create initrd image.\n" unless $success;
if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
image_magic("initrd.img", $image_dest);
}
else {
if (! -e "initrd.img") {
handle_missing_link("initrd.img", $image_dest, "initrd.img-$version",
$realimageloc);
}
else {
print STDERR
"Not updating initrd symbolic links since we are being updated/reinstalled \n";
print STDERR
"($ARGV[1] was configured last, according to dpkg)\n";
}
}
if ($initrd && -l "initrd" ) {
unlink "initrd";
}
if ($initrd && -l "$image_dir/initrd" && ! $link_in_boot) {
unlink "$image_dir/initrd";
}
}
else { # Not making an initrd emage
if (-l "initrd.img") {
# Ooh, last image was an initrd image? in any case, we should move it.
my $target = readlink "initrd.img";
my $real_target = '';
$real_target = abs_path($target) if defined ($target);
if (!defined($target) || ! -f "$real_target") {
# Eh. dangling link. can safely be removed.
unlink("initrd.img");
} else {
if (-l "initrd.img.old" || ! -e "initrd.img.old" ) {
rename("initrd.img", "initrd.img.old");
} else {
warn "initrd.img.old is not a symlink, not clobbering\n";
unlink("initrd.img");
}
}
}
}
# Warn of a reboot
if (-x $notifier) {
system($notifier);
}
# Let programs know not to hibernate if the kernel that would be used for
# resume-from-hibernate is likely to differ from the currently running kernel.
system("mountpoint -q /var/run");
if ($? eq 0) {
system("touch /var/run/do-not-hibernate");
}
# Only change the symlinks if we are not being upgraded
if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m/<unknown>/og) {
image_magic($kimage, $image_dest);
}
else {
if (! -e "$kimage") {
handle_missing_link($kimage, $image_dest, "$kimage-$version",
$realimageloc);
}
else {
print STDERR
"Not updating image symbolic links since we are being updated/reinstalled \n";
print STDERR
"($ARGV[1] was configured last, according to dpkg)\n";
}
}
# We used to have System.* files in /
if (-e "/System.map" || -e "/System.old") {
unlink '/System.map' if -e '/System.map';
unlink '/System.old' if -e '/System.old';
}
# creating some info about kernel and initrd
if ($DEBUG) {
my $ksize=sprintf("%.0f",(stat($realimageloc .
"$kimage-$version"))[7]/1024)."kB";
my $initrdsize='';
if ($initrd) {
$initrdsize=sprintf("%.0f",(stat($realimageloc .
"initrd.img-$version"))[7]/1024)."kB";
}
print STDERR <<"EOMSG";
A new kernel image has been installed at $realimageloc$kimage-$version
(Size: $ksize)
Symbolic links, unless otherwise specified, can be found in $image_dest
EOMSG
;
if ($initrd) {
print STDERR <<"EOMSGA";
Initial rootdisk image: ${realimageloc}initrd.img-$version (Size: $initrdsize)
EOMSGA
;
}
}
# set the env var stem
$ENV{'STEM'} = "linux";
sub exec_script {
my $type = shift;
my $script = shift;
print STDERR "Running $type hook script $script.\n";
system ("$script $version $realimageloc$kimage-$version") &&
print STDERR "User $type hook script [$script] ";
if ($?) {
if ($? == -1) {
print STDERR "failed to execute: $!\n";
}
elsif ($? & 127) {
printf STDERR "died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf STDERR "exited with value %d\n", $? >> 8;
}
exit $? >> 8;
}
}
sub run_hook {
my $type = shift;
my $script = shift;
if ($script =~ m,^/,) {
# Full path provided for the hook script
if (-x "$script") {
&exec_script($type,$script);
}
else {
die "The provided $type hook script [$script] could not be run.\n";
}
}
else {
# Look for it in a safe path
for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') {
if (-x "$path/$script") {
&exec_script($type, "$path/$script");
return 0;
}
}
# No luck
print STDERR "Could not find $type hook script [$script].\n";
die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n";
}
}
my $options;
for (@ARGV) {
s,','\\'',g;
$options .= " '$_'";
}
$ENV{'DEB_MAINT_PARAMS'}="$options";
## Run user hook script here, if any
if ($postinst_hook) {
&run_hook("postinst", $postinst_hook);
}
if (-d "/etc/kernel/postinst.d") {
print STDERR "Examining /etc/kernel/postinst.d.\n";
system ("run-parts --verbose --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version " .
"/etc/kernel/postinst.d") &&
die "Failed to process /etc/kernel/postinst.d";
}
if (-d "/etc/kernel/postinst.d/$version") {
print STDERR "Examining /etc/kernel/postinst.d/$version.\n";
system ("run-parts --verbose --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version " .
"/etc/kernel/postinst.d/$version") &&
die "Failed to process /etc/kernel/postinst.d/$version";
}
LOADER: {
last unless $do_boot_enable; # Exit if explicitly asked to
last if $loader =~ /silo/i; # SILO does not have to be executed.
last if $loader =~ /yaboot/i; # yaboot does not have to be executed.
last if $loader =~ /milo/i; # MILO does not have to be executed.
last if $loader =~ /nettrom/i; # NETTROM does not have to be executed.
last if $loader =~ /arcboot/i; # ARCBOOT does not have to be executed.
last if $loader =~ /delo/i; # DELO does not have to be executed.
last if $loader =~ /quik/i; # maintainer asked quik invocation to be ignored
last unless $loaderloc;
last unless -x $loaderloc;
last unless $do_bootloader;
if (-T "/etc/$loader.conf") {
# Trust and use the existing lilo.conf.
print STDERR "You already have a $Loader configuration in /etc/$loader.conf\n";
my $ret = &run_lilo();
exit $ret if $ret;
}
}
sub run_lilo (){
my $ret;
# Try and figure out if the user really wants lilo to be run --
# since the default is to run the boot laoder, which is ! grub -- but
# the user may be using grub now, and not changed the default.
# So, if the user has explicitly asked for the loader to be run, or
# if there is no postinst hook, or if there is no grub installed --
# we are OK. Or else, we ask.
if ($explicit_do_loader || (! ($postinst_hook && -x '/usr/sbin/grub'))) {
print STDERR "Running boot loader as requested\n";
} else {
print STDERR "Ok, not running $loader\n";
}
if ($loader =~ /^lilo/io or $loader =~ /vmelilo/io) {
print STDERR "Testing $loader.conf ... \n";
unlink $temp_file_name; # security
$ret = system("$loaderloc -t >$temp_file_name 2>&1");
if ($ret) {
print STDERR "Boot loader test failed\n";
return $ret;
}
unlink "$temp_file_name";
print STDERR "Testing successful.\n";
print STDERR "Installing the ";
print STDERR "partition " if $loader =~ /^lilo/io;
print STDERR "boot sector... \n";
}
print STDERR "Running $loaderloc ... \n";
if ($loader =~ /^elilo/io) {
$ret = system("$loaderloc 2>&1 | tee $temp_file_name");
} else {
$ret = system("$loaderloc >$temp_file_name 2>&1");
}
if ($ret) {
print STDERR "Boot loader failed to run\n";
return $ret;
}
unlink $temp_file_name;
print STDERR "Installation successful.\n";
return 0;
}
exit 0;
__END__
#! /usr/bin/perl
# -*- Mode: Cperl -*-
# image.postrm ---
# Author : Manoj Srivastava ( srivasta@glaurung.green-gryphon.com )
# Created On : Sat May 15 11:05:13 1999
# Created On Node : glaurung.green-gryphon.com
# Last Modified By : Manoj Srivastava
# Last Modified On : Wed Sep 13 11:26:19 2006
# Last Machine Used: glaurung.internal.golden-gryphon.com
# Update Count : 57
# Status : Unknown, Use with caution!
# HISTORY :
# Description :
#
# $Id: image.postrm,v 1.31 2003/10/07 16:24:20 srivasta Exp $
#
#
#use strict; #for debugging
use Cwd 'abs_path';
$|=1;
# Predefined values:
my $version = "=V";
my $link_in_boot = ""; # Should be empty, mostly
my $no_symlink = ""; # Should be empty, mostly
my $reverse_symlink = ""; # Should be empty, mostly
my $do_symlink = "Yes"; # target machine defined
my $do_boot_enable = "Yes"; # target machine defined
my $do_bootfloppy = "Yes"; # target machine defined
my $do_bootloader = "Yes"; # target machine defined
my $move_image = ''; # target machine defined
my $kimage = "=K"; # Should be empty, mostly
my $loader = "=L"; # lilo, silo, quik, palo, vmelilo, or nettrom
my $image_dir = "/boot"; # where the image is located
my $clobber_modules = ''; # target machine defined
my $initrd = "YES"; # initrd kernel
my $do_initrd = ''; # Normally, we don't
my $warn_initrd = 'YES'; # Normally we do
my $use_hard_links = ''; # hardlinks do not work across fs boundaries
my $postinst_hook = ''; #Normally we do not
my $postrm_hook = ''; #Normally we do not
my $preinst_hook = ''; #Normally we do not
my $prerm_hook = ''; #Normally we do not
my $minimal_swap = ''; # Do not swap symlinks
my $ignore_depmod_err = ''; # normally we do not
my $relink_build_link = 'YES'; # There is no harm in checking the link
my $force_build_link = ''; # we shall not create a dangling link
my $kernel_arch = "=B";
my $ramdisk = "/usr/sbin/update-initramfs";
my $package_name = "linux-image-$version";
my $Loader = "NoLOADER"; #
$Loader = "LILO" if $loader =~ /^lilo/io;
$Loader = "SILO" if $loader =~ /^silo/io;
$Loader = "QUIK" if $loader =~ /^quik/io;
$Loader = "yaboot" if $loader =~ /^yaboot/io;
$Loader = "PALO" if $loader =~ /^palo/io;
$Loader = "NETTROM" if $loader =~ /^nettrom/io;
$Loader = "VMELILO" if $loader =~ /^vmelilo/io;
$Loader = "ZIPL" if $loader =~ /^zipl/io;
$Loader = "ELILO" if $loader =~ /^elilo/io;
# This should not point to /tmp, because of security risks.
my $temp_file_name = "/var/log/$loader" . "_log.$$";
#known variables
my @boilerplate = ();
my @silotemplate = ();
my @quiktemplate = ();
my @palotemplate = ();
my @vmelilotemplate = ();
my $bootdevice = '';
my $rootdevice = '';
my $rootdisk = '';
my $rootpartition = '';
my $image_dest = "/";
my $realimageloc = "/$image_dir/";
my $have_conffile = "";
my $CONF_LOC = '/etc/kernel-img.conf';
my $relative_links = '';
my $silent_modules = '';
my $silent_loader = '';
my $warn_reboot = 'Yes'; # Warn that we are installing a version of
# the kernel we are running
chdir('/') or die "could not chdir to /:$!\n";
# remove multiple leading slashes; make sure there is at least one.
$realimageloc =~ s|^/*|/|o;
$realimageloc =~ s|/+|/|o;
if (-r "$CONF_LOC" && -f "$CONF_LOC" ) {
if (open(CONF, "$CONF_LOC")) {
while (<CONF>) {
chomp;
s/\#.*$//g;
next if /^\s*$/;
$do_symlink = "" if /^\s*do_symlinks\s*=\s*(no|false|0)\s*$/ig;
$no_symlink = "" if /^\s*no_symlinks\s*=\s*(no|false|0)\s*$/ig;
$reverse_symlink = "" if /^\s*reverse_symlinks\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*image_in_boot\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*link_in_boot\s*=\s*(no|false|0)\s*$/ig;
$move_image = "" if /^\s*move_image\s*=\s*(no|false|0)\s*$/ig;
$clobber_modules = '' if /^\s*clobber_modules\s*=\s*(no|false|0)\s*$/ig;
$do_boot_enable = '' if /^\s*do_boot_enable\s*=\s*(no|false|0)\s*$/ig;
$do_bootfloppy = '' if /^\s*do_bootfloppy\s*=\s*(no|false|0)\s*$/ig;
$relative_links = '' if /^\s*relative_links \s*=\s*(no|false|0)\s*$/ig;
$do_bootloader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig;
$do_initrd = '' if /^\s*do_initrd\s*=\s*(no|false|0)\s*$/ig;
$warn_initrd = '' if /^\s*warn_initrd\s*=\s*(no|false|0)\s*$/ig;
$use_hard_links = '' if /^\s*use_hard_links\s*=\s*(no|false|0)\s*$/ig;
$silent_modules = '' if /^\s*silent_modules\s*=\s*(no|false|0)\s*$/ig;
$silent_loader = '' if /^\s*silent_loader\s*=\s*(no|false|0)\s*$/ig;
$warn_reboot = '' if /^\s*warn_reboot\s*=\s*(no|false|0)\s*$/ig;
$minimal_swap = '' if /^\s*minimal_swap\s*=\s*(no|false|0)\s*$/ig;
$ignore_depmod_err = '' if /^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig;
$relink_build_link = '' if /^\s*relink_build_link\s*=\s*(no|false|0)\s*$/ig;
$force_build_link = '' if /^\s*force_build_link\s*=\s*(no|false|0)\s*$/ig;
$do_symlink = "Yes" if /^\s*do_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$no_symlink = "Yes" if /^\s*no_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$reverse_symlink = "Yes" if /^\s*reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*image_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*link_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$move_image = "Yes" if /^\s*move_image\s*=\s*(yes|true|1)\s*$/ig;
$clobber_modules = "Yes" if /^\s*clobber_modules\s*=\s*(yes|true|1)\s*$/ig;
$do_boot_enable = "Yes" if /^\s*do_boot_enable\s*=\s*(yes|true|1)\s*$/ig;
$do_bootfloppy = "Yes" if /^\s*do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig;
$do_bootloader = "Yes" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
$relative_links = "Yes" if /^\s*relative_links\s*=\s*(yes|true|1)\s*$/ig;
$do_initrd = "Yes" if /^\s*do_initrd\s*=\s*(yes|true|1)\s*$/ig;
$warn_initrd = "Yes" if /^\s*warn_initrd\s*=\s*(yes|true|1)\s*$/ig;
$use_hard_links = "Yes" if /^\s*use_hard_links\s*=\s*(yes|true|1)\s*$/ig;
$silent_modules = 'Yes' if /^\s*silent_modules\s*=\s*(yes|true|1)\s*$/ig;
$silent_loader = 'Yes' if /^\s*silent_loader\s*=\s*(yes|true|1)\s*$/ig;
$warn_reboot = 'Yes' if /^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/ig;
$minimal_swap = 'Yes' if /^\s*minimal_swap\s*=\s*(yes|true|1)\s*$/ig;
$ignore_depmod_err = 'Yes' if /^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig;
$relink_build_link = 'Yes' if /^\s*relink_build_link\s*=\s*(yes|true|1)\s*$/ig;
$force_build_link = 'Yes' if /^\s*force_build_link\s*=\s*(yes|true|1)\s*$/ig;
$image_dest = "$1" if /^\s*image_dest\s*=\s*(\S+)/ig;
$postinst_hook = "$1" if /^\s*postinst_hook\s*=\s*(\S+)/ig;
$postrm_hook = "$1" if /^\s*postrm_hook\s*=\s*(\S+)/ig;
$preinst_hook = "$1" if /^\s*preinst_hook\s*=\s*(\S+)/ig;
$prerm_hook = "$1" if /^\s*prerm_hook\s*=\s*(\S+)/ig;
$ramdisk = "$1" if /^\s*ramdisk\s*=\s*(.+)$/ig;
}
close CONF;
$have_conffile = "Yes";
}
}
if ($link_in_boot) {
$image_dest = "/$image_dir/";
$image_dest =~ s|^/*|/|o;
}
$image_dest = "$image_dest/";
$image_dest =~ s|/+$|/|o;
# The destdir may be gone by now.
if (-d "$image_dest") {
chdir("$image_dest") or die "could not chdir to $image_dest:$!\n";
}
# Paranoid check to make sure that the correct value is put in there
if (! $kimage) {$kimage = "vmlinuz"} # Hmm. empty
elsif ($kimage =~ m/^b?uImage$/o) {$kimage = "vmlinuz"} # these produce vmlinuz
elsif ($kimage =~ m/^b?zImage$/o) {$kimage = "vmlinuz"} # these produce vmlinuz
elsif ($kimage =~ m/^[iI]mage$/o) { my $nop = $kimage;}
elsif ($kimage =~ m/^vmlinux$/o) { my $nop = $kimage;}
else {$kimage = "vmlinuz"} # default
$ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch;
######################################################################
######################################################################
############
######################################################################
######################################################################
sub remove_sym_link {
my $bad_image = $_[0];
warn "Removing symbolic link $bad_image \n";
if ($loader =~ /lilo/i)
{
warn "Unless you used the optional flag in lilo, \n";
}
warn " you may need to re-run your boot loader" . ($loader ? "[$loader]":"")
. "\n";
# Remove the dangling link
unlink "$bad_image";
}
######################################################################
######################################################################
############
######################################################################
######################################################################
sub CanonicalizePath {
my $path = join '/', @_;
my @work = split '/', $path;
my @out;
my $is_absolute;
if (@work && $work[0] eq "") { $is_absolute = 1; shift @work; }
while (@work) {
my $seg = shift @work;
if ($seg eq "." || $seg eq "") {
} elsif ($seg eq "..") {
if (@out && $out[-1] ne "..") {
pop @out;
} else {
# Leading "..", or "../..", etc.
push @out, $seg;
}
} else {
push @out, $seg;
}
}
unshift @out, "" if $is_absolute;
return join('/', @out);
}
######################################################################
######################################################################
############
######################################################################
######################################################################
# This removes dangling symlinks. What do we do about hard links? Surely a
# something with the nane $image_dest . "$kimage" ought not to be left behind?
sub image_magic {
my $kimage = $_[0];
my $image_dest = $_[1];
if (-l "$kimage") {
# There is a symbolic link
my $force_move = 0;
my $vmlinuz_target = readlink "$kimage";
my $real_target = '';
$real_target = abs_path($vmlinuz_target) if defined ($vmlinuz_target);
if (!defined($vmlinuz_target) || ! -f "$real_target") {
# what, a dangling symlink?
warn "The link " . $image_dest . "$kimage is a damaged link\n";
# Remove the dangling link
&remove_sym_link("$kimage");
}
else {
my $canonical_target = CanonicalizePath("$vmlinuz_target");
if (! -e $canonical_target) {
warn "The link " . $image_dest . "$kimage is a dangling link\n";
&remove_sym_link("$kimage");
}
}
}
}
# set the env var stem
$ENV{'STEM'} = "linux";
sub exec_script {
my $type = shift;
my $script = shift;
print STDERR "Running $type hook script $script.\n";
system ("$script $version $realimageloc$kimage-$version") &&
print STDERR "User $type hook script [$script] ";
if ($?) {
if ($? == -1) {
print STDERR "failed to execute: $!\n";
}
elsif ($? & 127) {
printf STDERR "died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf STDERR "exited with value %d\n", $? >> 8;
}
}
}
sub run_hook {
my $type = shift;
my $script = shift;
if ($script =~ m,^/,) {
# Full path provided for the hook script
if (-x "$script") {
&exec_script($type,$script);
}
else {
warn "The provided $type hook script [$script] could not be run.\n";
}
}
else {
# Look for it in a safe path
for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') {
if (-x "$path/$script") {
&exec_script($type, "$path/$script");
return 0;
}
}
# No luck
print STDERR "Could not find $type hook script [$script].\n";
warn "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n";
}
}
my $options;
for (@ARGV) {
s,','\\'',g;
$options .= " '$_'";
}
$ENV{'DEB_MAINT_PARAMS'}="$options";
## Run user hook script here, if any
if ($postrm_hook) {
&run_hook("postrm", $postrm_hook);
}
if (-d "/etc/kernel/postrm.d") {
warn "Examining /etc/kernel/postrm.d .\n";
system ("run-parts --verbose --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version " .
"/etc/kernel/postrm.d") &&
die "Failed to process /etc/kernel/postrm.d";
}
if (-d "/etc/kernel/postrm.d/$version") {
warn "Examining /etc/kernel/postrm.d/$version .\n";
system ("run-parts --verbose --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version " .
"/etc/kernel/postrm.d/$version") &&
die "Failed to process /etc/kernel/postrm.d/$version";
}
# check and remove damaged and dangling symlinks
if ($ARGV[0] !~ /upgrade/) {
system("$ramdisk -d -k " . $version . " > /dev/null 2>&1");
if (-f $realimageloc . "initrd.img-$version.bak") {
unlink $realimageloc . "initrd.img-$version.bak";
}
image_magic($kimage, $image_dest);
image_magic($kimage . ".old", $image_dest);
image_magic("initrd.img", $image_dest) if $initrd;
image_magic("initrd.img.old", $image_dest) if $initrd;
}
exit 0;
__END__
#! /usr/bin/perl
# -*- Mode: Cperl -*-
# image.preinst ---
# Author : Manoj Srivastava ( srivasta@tiamat.datasync.com )
# Created On : Sun Jun 14 03:38:02 1998
# Created On Node : tiamat.datasync.com
# Last Modified By : Manoj Srivastava
# Last Modified On : Sun Sep 24 14:04:42 2006
# Last Machine Used: glaurung.internal.golden-gryphon.com
# Update Count : 99
# Status : Unknown, Use with caution!
# HISTORY :
# Description :
#
#
#
#use strict; #for debugging
use Debconf::Client::ConfModule qw(:all);
version('2.0');
my $capb=capb("backup");
$|=1;
# Predefined values:
my $version = "=V";
my $link_in_boot = ""; # Should be empty, mostly
my $no_symlink = ""; # Should be empty, mostly
my $reverse_symlink = ""; # Should be empty, mostly
my $do_symlink = "Yes"; # target machine defined
my $do_boot_enable = "Yes"; # target machine defined
my $do_bootfloppy = "Yes"; # target machine defined
my $do_bootloader = "Yes"; # target machine defined
my $move_image = ''; # target machine defined
my $kimage = "=K"; # Should be empty, mostly
my $loader = "=L"; # lilo, silo, quik, palo, vmelilo, nettrom
# or elilo
my $image_dir = "/boot"; # where the image is located
my $initrd = "YES"; # initrd kernel
my $use_hard_links = ''; # hardlinks do not wirk across fs boundaries
my $postinst_hook = ''; #Normally we do not
my $postrm_hook = ''; #Normally we do not
my $preinst_hook = ''; #Normally we do not
my $prerm_hook = ''; #Normally we do not
my $minimal_swap = ''; # Do not swap symlinks
my $ignore_depmod_err = ''; # normally we do not
my $relink_src_link = 'YES'; # There is no harm in checking the link
my $relink_build_link = 'YES'; # There is no harm in checking the link
my $force_build_link = ''; # There is no harm in checking the link
my $kernel_arch = "=B";
my $ramdisk = "/usr/sbin/update-initramfs"; # List of tools to create initial ram fs.
my $package_name = "linux-image-$version";
my $Loader = "NoLOADER"; #
$Loader = "LILO" if $loader =~ /^lilo/io;
$Loader = "SILO" if $loader =~ /^silo/io;
$Loader = "QUIK" if $loader =~ /^quik/io;
$Loader = "yaboot" if $loader =~ /^yaboot/io;
$Loader = "PALO" if $loader =~ /^palo/io;
$Loader = "NETTROM" if $loader =~ /^nettrom/io;
$Loader = "VMELILO" if $loader =~ /^vmelilo/io;
$Loader = "ZIPL" if $loader =~ /^zipl/io;
$Loader = "ELILO" if $loader =~ /^elilo/io;
#known variables
my @boilerplate = ();
my @silotemplate = ();
my @quiktemplate = ();
my @palotemplate = ();
my @vmelilotemplate = ();
my $bootdevice = '';
my $rootdevice = '';
my $rootdisk = '';
my $rootpartition = '';
my $image_dest = "/";
my $realimageloc = "/$image_dir/";
my $have_conffile = "";
my $CONF_LOC = '/etc/kernel-img.conf';
my $relative_links = '';
my $silent_loader = '';
my $warn_reboot = ''; # Warn that we are installing a version of
# the kernel we are running
my $modules_base = '/lib/modules';
die "Pre inst Internal error. Aborting." unless $version;
exit 0 if $ARGV[0] =~ /abort-upgrade/;
exit 1 unless $ARGV[0] =~ /(install|upgrade)/;
$arch = `uname -i`;
if ($arch =~ m/86/) {
system ("grep -q ' pae ' /proc/cpuinfo");
if ($?) {
print STDERR "This kernel does not support a non-PAE CPU.\n";
exit 1;
}
}
# remove multiple leading slashes; make sure there is at least one.
$realimageloc =~ s|^/*|/|o;
$realimageloc =~ s|/+|/|o;
if (-r "$CONF_LOC" && -f "$CONF_LOC" ) {
if (open(CONF, "$CONF_LOC")) {
while (<CONF>) {
chomp;
s/\#.*$//g;
next if /^\s*$/;
$do_symlink = "" if /^\s*do_symlinks\s*=\s*(no|false|0)\s*$/ig;
$no_symlink = "" if /^\s*no_symlinks\s*=\s*(no|false|0)\s*$/ig;
$reverse_symlink = "" if /^\s*reverse_symlinks\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*image_in_boot\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*link_in_boot\s*=\s*(no|false|0)\s*$/ig;
$move_image = "" if /^\s*move_image\s*=\s*(no|false|0)\s*$/ig;
$do_boot_enable = '' if /^\s*do_boot_enable\s*=\s*(no|false|0)\s*$/ig;
$do_bootfloppy = '' if /^\s*do_bootfloppy\s*=\s*(no|false|0)\s*$/ig;
$do_bootloader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig;
$relative_links = '' if /^\s*relative_links \s*=\s*(no|false|0)\s*$/ig;
$use_hard_links = '' if /^\s*use_hard_links\s*=\s*(no|false|0)\s*$/ig;
$silent_loader = '' if /^\s*silent_loader\s*=\s*(no|false|0)\s*$/ig;
$warn_reboot = '' if /^\s*warn_reboot\s*=\s*(no|false|0)\s*$/ig;
$minimal_swap = '' if /^\s*minimal_swap\s*=\s*(no|false|0)\s*$/ig;
$ignore_depmod_err = '' if /^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig;
$relink_src_link = '' if /^\s*relink_src_link\s*=\s*(no|false|0)\s*$/ig;
$relink_build_link = '' if /^\s*relink_build_link\s*=\s*(no|false|0)\s*$/ig;
$force_build_link = '' if /^\s*force_build_link\s*=\s*(no|false|0)\s*$/ig;
$do_symlink = "Yes" if /^\s*do_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$no_symlink = "Yes" if /^\s*no_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$reverse_symlink = "Yes" if /^\s*reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*image_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*link_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$move_image = "Yes" if /^\s*move_image\s*=\s*(yes|true|1)\s*$/ig;
$do_boot_enable = "Yes" if /^\s*do_boot_enable\s*=\s*(yes|true|1)\s*$/ig;
$do_bootfloppy = "Yes" if /^\s*do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig;
$do_bootloader = "Yes" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
$relative_links = "Yes" if /^\s*relative_links\s*=\s*(yes|true|1)\s*$/ig;
$use_hard_links = "Yes" if /^\s*use_hard_links\s*=\s*(yes|true|1)\s*$/ig;
$silent_loader = 'Yes' if /^\s*silent_loader\s*=\s*(yes|true|1)\s*$/ig;
$warn_reboot = 'Yes' if /^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/ig;
$minimal_swap = 'Yes' if /^\s*minimal_swap\s*=\s*(yes|true|1)\s*$/ig;
$ignore_depmod_err = 'Yes' if /^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig;
$relink_src_link = 'Yes' if /^\s*relink_src_link\s*=\s*(yes|true|1)\s*$/ig;
$relink_build_link = 'Yes' if /^\s*relink_build_link\s*=\s*(yes|true|1)\s*$/ig;
$force_build_link = 'Yes' if /^\s*force_build_link\s*=\s*(yes|true|1)\s*$/ig;
$image_dest = "$1" if /^\s*image_dest\s*=\s*(\S+)/ig;
$postinst_hook = "$1" if /^\s*postinst_hook\s*=\s*(\S+)/ig;
$postrm_hook = "$1" if /^\s*postrm_hook\s*=\s*(\S+)/ig;
$preinst_hook = "$1" if /^\s*preinst_hook\s*=\s*(\S+)/ig;
$prerm_hook = "$1" if /^\s*prerm_hook\s*=\s*(\S+)/ig;
$ramdisk = "$1" if /^\s*ramdisk\s*=\s*(.+)$/ig;
}
close CONF;
$have_conffile = "Yes";
$have_conffile = "Yes"; # stop perl complaining
}
}
$ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch;
# About to upgrade this package from version $2 TO THIS VERSION.
# "prerm upgrade" has already been called for the old version of
# this package.
sub find_initrd_tool {
my $hostversion = shift;
my $version = shift;
my @ramdisks =
grep {
my $args =
"$_ " .
"--supported-host-version=$hostversion " .
"--supported-target-version=$version " .
"1>/dev/null 2>&1"
;
system($args) == 0;
}
split (/[:,\s]+/, $ramdisk);
}
sub check {
my $version = shift;
my $lib_modules="$modules_base/$version";
my $message = '';
if (-d "$lib_modules") {
opendir(DIR, $lib_modules) || die "can’t opendir $lib_modules: $!";
my @children = readdir(DIR);
if ($#children > 1) {
my @dirs = grep { -d "$lib_modules/$_" } @children;
if ($#dirs > 1) { # we have subdirs
my $dir_message='';
for my $dir (@dirs) {
if ($dir =~/kernel$/) {
$dir_message="An older install was detected.\n";
}
else {
$dir_message="Module sub-directories were detected.\n"
unless $dir_message;
}
}
$message += $dir_message if $dir_message;
}
my @links = grep { -l "$lib_modules/$_" } @children;
if ($#links > -1) {
my $links_message = '';
for my $link (@links) {
next if ($link =~ /^build$/);
next if ($link =~ /^source$/);
$links_message = "Symbolic links were detected in $modules_base/$version.\n";
}
$message += $links_message if $links_message;
}
my @files = grep { -f "$lib_modules/$_" } @children;
$message += "Additional files also exist in $modules_base/$version.\n"
if ($#files > -1);
}
}
else { $message .= "$lib_modules does not exist. ";}
return $message;
}
if (-d "$modules_base/$version") {
my $errors=check($version);
warn "Info:\n$errors\n" if $errors;
}
# set the env var stem
$ENV{'STEM'} = "linux";
sub exec_script {
my $type = shift;
my $script = shift;
print STDERR "Running $type hook script $script.\n";
system ("$script $version $realimageloc$kimage-$version") &&
print STDERR "User $type hook script [$script] ";
if ($?) {
if ($? == -1) {
print STDERR "failed to execute: $!\n";
}
elsif ($? & 127) {
printf STDERR "died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf STDERR "exited with value %d\n", $? >> 8;
}
exit $? >> 8;
}
}
sub run_hook {
my $type = shift;
my $script = shift;
if ($script =~ m,^/,) {
# Full path provided for the hook script
if (-x "$script") {
&exec_script($type,$script);
}
else {
die "The provided $type hook script [$script] could not be run.\n";
}
}
else {
# Look for it in a safe path
for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') {
if (-x "$path/$script") {
&exec_script($type, "$path/$script");
return 0;
}
}
# No luck
print STDERR "Could not find $type hook script [$script].\n";
die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n";
}
}
my $options;
for (@ARGV) {
s,','\\'',g;
$options .= " '$_'";
}
$ENV{'DEB_MAINT_PARAMS'}="$options";
## Run user hook script here, if any
if (-x "$preinst_hook") {
&run_hook("preinst", $preinst_hook);
}
if (-d "/etc/kernel/preinst.d") {
print STDERR "Examining /etc/kernel/preinst.d/\n";
system ("run-parts --verbose --exit-on-error --arg=$version" .
" --arg=$realimageloc$kimage-$version" .
" /etc/kernel/preinst.d") &&
die "Failed to process /etc/kernel/preinst.d";
}
if (-d "/etc/kernel/preinst.d/$version") {
print STDERR "Examining /etc/kernel/preinst.d/$version.\n";
system ("run-parts --verbose --exit-on-error --arg=$version" .
" --arg=$realimageloc$kimage-$version" .
" /etc/kernel/preinst.d/$version") &&
die "Failed to process /etc/kernel/preinst.d/$version";
}
print STDERR "Done.\n";
exit 0;
__END__
#! /usr/bin/perl
# -*- Mode: Perl -*-
# image.prerm ---
# Author : root ( root@melkor.pilgrim.umass.edu )
# Created On : Fri May 17 03:28:59 1996
# Created On Node : melkor.pilgrim.umass.edu
# Last Modified By : Manoj Srivastava
# Last Modified On : Sat Aug 5 13:14:17 2006
# Last Machine Used: glaurung.internal.golden-gryphon.com
# Update Count : 85
# Status : Unknown, Use with caution!
# HISTORY :
# Description :
#
#
# $Id: image.prerm,v 1.22 2003/10/07 16:24:20 srivasta Exp $
#
#
#use strict;
$|=1;
# Predefined values:
my $version = "=V";
my $link_in_boot = ""; # Should be empty, mostly
my $no_symlink = ""; # Should be empty, mostly
my $reverse_symlink = ""; # Should be empty, mostly
my $do_symlinks = "Yes"; # target machine defined
my $do_boot_enable = "Yes"; # target machine defined
my $do_bootfloppy = "Yes"; # target machine defined
my $do_bootloader = "Yes"; # target machine defined
my $move_image = ''; # target machine defined
my $kimage = "=K"; # Should be empty, mostly
my $loader = "=L"; # lilo, silo, quik, palo, vmelilo, or nettrom
my $image_dir = "/boot"; # where the image is located
my $clobber_modules = ''; # target machine defined
my $initrd = "YES"; # initrd kernel
my $use_hard_links = ''; # hardlinks do not wirk across fs boundaries
my $postinst_hook = ''; #Normally we do not
my $postrm_hook = ''; #Normally we do not
my $preinst_hook = ''; #Normally we do not
my $prerm_hook = ''; #Normally we do not
my $minimal_swap = ''; # Do not swap symlinks
my $ignore_depmod_err = ''; # normally we do not
my $relink_build_link = 'YES'; # There is no harm in checking the link
my $force_build_link = ''; # There is no harm in checking the link
my $kernel_arch = "=B";
my $ramdisk = "/usr/sbin/update-initramfs";
my $package_name = "linux-image-$version";
my $Loader = "NoLOADER"; #
$Loader = "LILO" if $loader =~ /^lilo/io;
$Loader = "SILO" if $loader =~ /^silo/io;
$Loader = "QUIK" if $loader =~ /^quik/io;
$Loader = "yaboot" if $loader =~ /^yaboot/io;
$Loader = "PALO" if $loader =~ /^palo/io;
$Loader = "NETTROM" if $loader =~ /^nettrom/io;
$Loader = "VMELILO" if $loader =~ /^vmelilo/io;
$Loader = "ZIPL" if $loader =~ /^zipl/io;
$Loader = "ELILO" if $loader =~ /^elilo/io;
# This should not point to /tmp, because of security risks.
my $temp_file_name = "/var/log/$loader" . "_log.$$";
#known variables
my $image_dest = "/";
my $realimageloc = "/$image_dir/";
my $have_conffile = "";
my $CONF_LOC = '/etc/kernel-img.conf';
my $relative_links = '';
my $silent_loader = '';
my $warn_reboot = 'Yes'; # Warn that we are installing a version of
# the kernel we are running
# remove multiple leading slashes; make sure there is at least one.
$realimageloc =~ s|^/*|/|o;
$realimageloc =~ s|/+|/|o;
my $DEBUG = 0;
# Variables used
my $image='';
my $ret=0;
my $seen='';
my $answer='';
my $running = '';
my $WouldInvalidate = 0;
if ($ARGV[0] && ($ARGV[0] =~ /remove/ || $ARGV[0] =~ /upgrade/)) {
if (-l "/usr/doc/linux-image-$version") {
unlink "/usr/doc/linux-image-$version";
}
}
# Ignore all invocations uxcept when called on to remove
exit 0 unless ($ARGV[0] && $ARGV[0] =~ /remove/) ;
# Paranoid check to make sure that the correct value is put in there
if (! $kimage) { $kimage = "vmlinuz";} # Hmm. empty
elsif ($kimage =~ m/^b?uImage$/o) { $kimage = "vmlinuz";} # these produce vmlinuz
elsif ($kimage =~ m/^b?zImage$/o) { $kimage = "vmlinuz";} # these produce vmlinuz
elsif ($kimage =~ m/^[iI]mage$/o) { my $nop = $kimage; }
elsif ($kimage =~ m/^vmlinux$/o) { my $nop = $kimage; }
else { $kimage = "vmlinuz";} # Default
if (-r "$CONF_LOC" && -f "$CONF_LOC" ) {
if (open(CONF, "$CONF_LOC")) {
while (<CONF>) {
chomp;
s/\#.*$//g;
next if /^\s*$/;
$do_symlink = "" if /^\s*do_symlinks\s*=\s*(no|false|0)\s*$/ig;
$no_symlink = "" if /^\s*no_symlinks\s*=\s*(no|false|0)\s*$/ig;
$reverse_symlink = "" if /^\s*reverse_symlinks\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*image_in_boot\s*=\s*(no|false|0)\s*$/ig;
$link_in_boot = "" if /^\s*link_in_boot\s*=\s*(no|false|0)\s*$/ig;
$move_image = "" if /^\s*move_image\s*=\s*(no|false|0)\s*$/ig;
$clobber_modules = '' if /^\s*clobber_modules\s*=\s*(no|false|0)\s*$/ig;
$do_boot_enable = '' if /^\s*do_boot_enable\s*=\s*(no|false|0)\s*$/ig;
$do_bootfloppy = '' if /^\s*do_bootfloppy\s*=\s*(no|false|0)\s*$/ig;
$relative_links = '' if /^\s*relative_links \s*=\s*(no|false|0)\s*$/ig;
$do_bootloader = '' if /^\s*do_bootloader\s*=\s*(no|false|0)\s*$/ig;
$do_initrd = '' if /^\s*do_initrd\s*=\s*(no|false|0)\s*$/ig;
$use_hard_links = '' if /^\s*use_hard_links\s*=\s*(no|false|0)\s*$/ig;
$silent_loader = '' if /^\s*silent_loader\s*=\s*(no|false|0)\s*$/ig;
$warn_reboot = '' if /^\s*warn_reboot\s*=\s*(no|false|0)\s*$/ig;
$minimal_swap = '' if /^\s*minimal_swap\s*=\s*(no|false|0)\s*$/ig;
$ignore_depmod_err = '' if /^\s*ignore_depmod_err\s*=\s*(no|false|0)\s*$/ig;
$relink_build_link = '' if /^\s*relink_build_link\s*=\s*(no|false|0)\s*$/ig;
$force_build_link = '' if /^\s*force_build_link\s*=\s*(no|false|0)\s*$/ig;
$do_symlink = "Yes" if /^\s*do_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$no_symlink = "Yes" if /^\s*no_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$reverse_symlink = "Yes" if /^\s*reverse_symlinks\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*image_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$link_in_boot = "Yes" if /^\s*link_in_boot\s*=\s*(yes|true|1)\s*$/ig;
$move_image = "Yes" if /^\s*move_image\s*=\s*(yes|true|1)\s*$/ig;
$clobber_modules = "Yes" if /^\s*clobber_modules\s*=\s*(yes|true|1)\s*$/ig;
$do_boot_enable = "Yes" if /^\s*do_boot_enable\s*=\s*(yes|true|1)\s*$/ig;
$do_bootfloppy = "Yes" if /^\s*do_bootfloppy\s*=\s*(yes|true|1)\s*$/ig;
$do_bootloader = "Yes" if /^\s*do_bootloader\s*=\s*(yes|true|1)\s*$/ig;
$relative_links = "Yes" if /^\s*relative_links\s*=\s*(yes|true|1)\s*$/ig;
$do_initrd = "Yes" if /^\s*do_initrd\s*=\s*(yes|true|1)\s*$/ig;
$use_hard_links = "Yes" if /^\s*use_hard_links\s*=\s*(yes|true|1)\s*$/ig;
$silent_loader = 'Yes' if /^\s*silent_loader\s*=\s*(yes|true|1)\s*$/ig;
$warn_reboot = 'Yes' if /^\s*warn_reboot\s*=\s*(yes|true|1)\s*$/ig;
$minimal_swap = 'Yes' if /^\s*minimal_swap\s*=\s*(yes|true|1)\s*$/ig;
$ignore_depmod_err = 'Yes' if /^\s*ignore_depmod_err\s*=\s*(yes|true|1)\s*$/ig;
$relink_build_link = 'Yes' if /^\s*relink_build_link\s*=\s*(yes|true|1)\s*$/ig;
$force_build_link = 'Yes' if /^\s*force_build_link\s*=\s*(yes|true|1)\s*$/ig;
$image_dest = "$1" if /^\s*image_dest\s*=\s*(\S+)/ig;
$postinst_hook = "$1" if /^\s*postinst_hook\s*=\s*(\S+)/ig;
$postrm_hook = "$1" if /^\s*postrm_hook\s*=\s*(\S+)/ig;
$preinst_hook = "$1" if /^\s*preinst_hook\s*=\s*(\S+)/ig;
$prerm_hook = "$1" if /^\s*prerm_hook\s*=\s*(\S+)/ig;
$ramdisk = "$1" if /^\s*ramdisk\s*=\s*(.+)$/ig;
}
close CONF;
$have_conffile = "Yes";
}
}
$ENV{KERNEL_ARCH}=$kernel_arch if $kernel_arch;
#check to see if we are trying to remove a running kernel
# if so we abort right now.
chop($running=`uname -r`);
if ($running eq $version) {
print STDERR "WARN: Proceeding with removing running kernel image.\n";
}
#Now, they have an alternate kernel which they are currently running
# This is just us being nice to lilo users.
chdir("/") or die "could not chdir to /:$!\n";
if (-f "/etc/$loader.conf") { #I know, could be a link, but ..
open (LILO, "/etc/$loader.conf") || &success(); # this is not critical
while (<LILO>) {
chop;
s/\#.*//; # nix the comments
next unless /^\s*image\s*=\s(\S+)/o;
$image = $1;
if ($image && -e $image) {
while (defined($image) && -l $image) {
$image = readlink ($image);
}
if (defined($image) && -e $image) {
$WouldInvalidate |= $image =~ /$kimage-$version/;
}
else {
&success(); # invalid $loader.conf file
}
}
else {
&success(); # invalid $loader.conf file
}
}
close (LILO);
if ($WouldInvalidate) {
print STFERR "WARN: Proceeding with removing running kernel image.\n";
&success();
}
}
# set the env var stem
$ENV{'STEM'} = "linux";
sub exec_script {
my $type = shift;
my $script = shift;
print STDERR "Running $type hook script $script.\n";
system ("$script $version $realimageloc$kimage-$version") &&
print STDERR "User $type hook script [$script] ";
if ($?) {
if ($? == -1) {
print STDERR "failed to execute: $!\n";
}
elsif ($? & 127) {
printf STDERR "died with signal %d, %s coredump\n",
($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
printf STDERR "exited with value %d\n", $? >> 8;
}
exit $? >> 8;
}
}
sub run_hook {
my $type = shift;
my $script = shift;
if ($script =~ m,^/,) {
# Full path provided for the hook script
if (-x "$script") {
&exec_script($type,$script);
}
else {
die "The provided $type hook script [$script] could not be run.\n";
}
}
else {
# Look for it in a safe path
for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') {
if (-x "$path/$script") {
&exec_script($type, "$path/$script");
return 0;
}
}
# No luck
print STDERR "Could not find $type hook script [$script].\n";
die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n";
}
}
my $options;
for (@ARGV) {
s,','\\'',g;
$options .= " '$_'";
}
$ENV{'DEB_MAINT_PARAMS'}="$options";
## Run user hook script here, if any
if (-x "$prerm_hook") {
&run_hook("prerm", $prerm_hook);
}
if (-d "/etc/kernel/prerm.d") {
print STDERR "Examining /etc/kernel/prerm.d.\n";
system ("run-parts --verbose --exit-on-error --arg=$version " .
"--arg=$realimageloc$kimage-$version /etc/kernel/prerm.d") &&
die "Failed to process /etc/kernel/prerm.d";
}
if (-d "/etc/kernel/prerm.d/$version") {
print STDERR "Examining /etc/kernel/prerm.d/$version.\n";
system ("run-parts --verbose --exit-on-error --arg=$version" .
" --arg=$realimageloc$kimage-$version " .
"/etc/kernel/prerm.d/$version") &&
die "Failed to process /etc/kernel/prerm.d/$version";
}
sub success () {
# NOTE: need to keep this list in sync with rules.d/2-binary-arch.mk
my %files_to_keep = (
'modules.builtin' => 1,
'modules.order' => 1,
);
my $short;
for my $file (</lib/modules/$version/modules.*>) {
$short = $file; $short =~ s,.*/,,;
if (!defined $files_to_keep{$short}) {
unlink "$file";
}
}
exit 0;
}
&success();
exit 0;
__END__
DEBIAN=debian.master
This README describes the reason for, and the use of, module
inclusion lists.
The original Hardy release had the notion of sub-flavours,
e.g., a flavour that was constructed as a subset of an existing flavour.
For example, the virtual flavour was extracted from the server flavour using
a subset of the server flavour modules. However, there were some difficult
mainteneance issues with regard to packaging, make rules, and scripts. This
re-implementation of the sub-flavours philosophy is hopefully simpler,
and retrofitable to all releases.
A module inclusion list looks at the problem of of constructing a package
from the perspective of what modules do we _want_ in the package, as opposed
to what modules we _don't_ want. As the kernel matures, more and more devices are added
which makes the problem of configuration maintenance a real pain in the ass.
If we took the approach of disabling all of the config options that we don't want,
then the differences between flavours will quickly become quite large, making
it difficult to quickly compare the individual flavour configs. Each time a
new config option is added then we also have to make a decision about disabling in
order to continue to keep the minimal number of modules.
A module inclusion list is applied on a per-flavour basis. For example,
debian.<BRANCH>/control.d/${flavour}.inclusion-list. For example, the
config for virtual is very close to server and generic, but the inclusion list
causes the virtual package to be constructed with _only_ the modules described
in the inclusion list.
The inclusion list format is a simple bash regular expression list of files. For example,
arch/*/{crypto,kernel,oprofile}
drivers/acpi/*
drivers/ata/ahci.ko
These 3 regular expression forms are suitable for expansion by bash and as inputs to 'find'.
See debian/scripts/module-inclusion for details.
There are 2 log files created as a side effect of the application of the module
inclusion list; $(flavour).inclusion-list.log and $(flavour).depmod.log.
$(flavour).inclusion-list.log : This log is created while the inclusion list
modules are being copied. If any are missing, then those warnings go in this log.
While its not considered a fatal error, you should endevour to correct your inclusion
list such that there are no missing modules.
$(flavour).depmod.log : The log is created as a result of running depmod on the
resulting set of modules. If there are missing symbols then you'll find that information
here. Again, you should modify your inclusion list such that there are no missing
symbols.
Tim Gardner <tim.gardner@canonical.com>
June 2, 2010
#!/usr/bin/make -f
#
# $(DEBIAN)/rules for Ubuntu linux
#
# Use this however you want, just give credit where credit is due.
#
# Copyright (c) 2007 Ben Collins <bcollins@ubuntu.com>
#
DEBIAN=$(shell awk -F= '($$1 == "DEBIAN") { print $$2 }' <debian/debian.env)
# dpkg-buildpackage passes options that are incomptatible
# with the kernel build.
unexport CFLAGS
unexport LDFLAGS
export LC_ALL=C
export SHELL=/bin/bash -e
# Where do we find the common configuration.
export DROOT=debian
# Common variables for all architectures
include $(DROOT)/rules.d/0-common-vars.mk
# Pull in some arch specific stuff
-include $(DEBIAN)/rules.d/$(arch).mk
# Maintainer targets
include $(DROOT)/rules.d/1-maintainer.mk
# Stages
ifeq ($(DEB_STAGE),stage1)
do_tools=false
do_doc_package=false
do_source_package=false
do_flavour_image_package=false
do_flavour_header_package=false
endif
# Debian Build System targets
binary: binary-indep binary-arch
build: build-arch build-indep
clean: debian/control
dh_testdir
dh_testroot
dh_clean
# d-i stuff
rm -rf $(DEBIAN)/d-i-$(arch)
# normal build junk
rm -rf $(DEBIAN)/abi/$(release)-$(revision)
rm -rf $(builddir)
rm -f $(stampdir)/stamp-*
rm -rf $(DEBIAN)/linux-*
# This gets rid of the d-i packages in control
cp -f $(DEBIAN)/control.stub $(DEBIAN)/control
cp $(DEBIAN)/changelog debian/changelog
# Install the copyright information.
cp $(DEBIAN)/copyright debian/copyright
distclean: clean
rm -rf $(DEBIAN)/control $(DEBIAN)/control.stub \
$(DEBIAN)/d-i/kernel-versions debian/changelog \
debian/control debian/control.stub debian/copyright
# Builds the image, arch headers and debug packages
include $(DROOT)/rules.d/2-binary-arch.mk
# Rules for building the udebs ($(DEBIAN)-installer)
include $(DROOT)/rules.d/5-udebs.mk
# Builds the source, doc and linux-headers indep packages
include $(DROOT)/rules.d/3-binary-indep.mk
# Various checks to be performed on builds
include $(DROOT)/rules.d/4-checks.mk
# Misc stuff
.PHONY: $(DEBIAN)/control.stub
$(DEBIAN)/control.stub: $(DEBIAN)/d-i/kernel-versions.in \
$(DROOT)/scripts/control-create \
$(DEBIAN)/control.stub.in \
$(DEBIAN)/changelog \
$(wildcard $(DEBIAN)/control.d/* $(DEBIAN)/sub-flavours/*.vars)
for i in $(DEBIAN)/d-i/kernel-versions.in $(DEBIAN)/control.stub.in; do \
new=`echo $$i | sed 's/\.in$$//'`; \
cat $$i | sed -e 's/PKGVER/$(release)/g' \
-e 's/ABINUM/$(abinum)/g' \
-e 's/SRCPKGNAME/$(src_pkg_name)/g' \
-e 's/=HUMAN=/$(human_arch)/g' \
> $$new; \
done
flavours="$(wildcard $(DEBIAN)/control.d/vars.* $(DEBIAN)/sub-flavours/*.vars)";\
for i in $$flavours; do \
$(SHELL) $(DROOT)/scripts/control-create $$i | \
sed -e 's/PKGVER/$(release)/g' \
-e 's/ABINUM/$(abinum)/g' \
-e 's/SRCPKGNAME/$(src_pkg_name)/g' \
-e 's/=HUMAN=/$(human_arch)/g' \
>> $(DEBIAN)/control.stub; \
done
cp $(DEBIAN)/control.stub $(DEBIAN)/control
.PHONY: debian/control
debian/control: $(DEBIAN)/control.stub
rm -rf $(builddir)/modules $(builddir)/firmware \
$(builddir)/kernel-versions $(builddir)/package-list \
$(builddir)/$(DEBIAN)
mkdir -p $(builddir)/modules/$(arch)/
cp $(DEBIAN)/d-i/modules/* $(builddir)/modules/$(arch)/
mkdir -p $(builddir)/firmware/$(arch)/
cp $(DEBIAN)/d-i/firmware/* $(builddir)/firmware/$(arch)/
cp $(DEBIAN)/d-i/package-list $(DEBIAN)/d-i/kernel-versions $(builddir)/
touch $(builddir)/modules/$(arch)/kernel-image
# kernel-wedge needs to poke around in $(DEBIAN)/
ln -nsf $(CURDIR)/debian $(builddir)/debian
# Some files may need to differ between architectures
if [ -d $(DEBIAN)/d-i/modules-$(arch) ]; then \
cp $(DEBIAN)/d-i/modules-$(arch)/* \
$(builddir)/modules/$(arch)/; \
fi
if [ -d $(DEBIAN)/d-i/firmware-$(arch) ]; then \
cp $(DEBIAN)/d-i/firmware-$(arch)/* \
$(builddir)/firmware/$(arch)/; \
fi
# Remove unwanted stuff for this architecture
if [ -r "$(DEBIAN)/d-i/exclude-modules.$(arch)" ]; then \
(cat $(DEBIAN)/d-i/exclude-modules.$(arch); \
ls $(builddir)/modules/$(arch)/) | sort | uniq -d | \
(cd $(builddir)/modules/$(arch)/; xargs rm -f); \
fi
if [ -r "$(DEBIAN)/d-i/exclude-firmware.$(arch)" ]; then \
(cat $(DEBIAN)/d-i/exclude-firmware.$(arch); \
ls $(builddir)/firmware/$(arch)/) | sort | uniq -d | \
(cd $(builddir)/firmware/$(arch)/; xargs rm -f); \
fi
# Per flavour module lists
flavour_modules=`ls $(DEBIAN)/d-i/modules.$(arch)-* 2>/dev/null` \
|| true; \
if [ "$$flavour_modules" != "" ]; then \
for flav in $$flavour_modules; do \
name=`echo $$flav | sed 's/.*\/modules.$(arch)-//'`; \
mkdir $(builddir)/modules/$(arch)-$$name; \
(cd $(builddir)/modules/; tar cf - `cat ../$$flav`) | \
(cd $(builddir)/modules/$(arch)-$$name/; tar xf -); \
touch $(builddir)/modules/$(arch)-$$name/kernel-image; \
done; \
fi
flavour_firmware=`ls $(DEBIAN)/d-i/firmware.$(arch)-* 2>/dev/null` \
|| true; \
if [ "$$flavour_firmware" != "" ]; then \
for flav in $$flavour_firmware; do \
name=`echo $$flav | sed 's/.*\/firmware.$(arch)-//'`; \
mkdir $(builddir)/firmware/$(arch)-$$name; \
(cd $(builddir)/firmware/; tar cf - `cat ../$$flav`) | \
(cd $(builddir)/firmware/$(arch)-$$name/; tar xf -);\
touch $(builddir)/firmware/$(arch)-$$name/kernel-image; \
done; \
fi
# Some files may need to differ between flavours
flavour_module_dirs=`ls -d $(DEBIAN)/d-i/modules-$(arch)-* 2>/dev/null`\
|| true; \
if [ "$$flavour_module_dirs" ]; then \
for flav in $$flavour_module_dirs; do \
name=`echo $$flav | sed 's/.*\/modules-$(arch)-//'`; \
[ -d $(builddir)/modules/$(arch)-$$name ] || \
cp -a $(builddir)/modules/$(arch) \
modules/$(arch)-$$name; \
cp $$flav/* $(builddir)/modules/$(arch)-$$name/; \
done; \
fi
flavour_firmware_dirs=`ls -d $(DEBIAN)/d-i/firmware-$(arch)-* 2>/dev/null`\
|| true; \
if [ "$$flavour_firmware_dirs" ]; then \
for flav in $$flavour_firmware_dirs; do \
name=`echo $$flav | sed 's/.*\/firmware-$(arch)-//'`; \
[ -d $(builddir)/firmware/$(arch)-$$name ] || \
cp -a $(builddir)/firmware/$(arch) \
firmware/$(arch)-$$name; \
cp $$flav/* $(builddir)/firmware/$(arch)-$$name/; \
done; \
fi
# Remove unwanted stuff for each flavour
flavour_exclude=`ls $(DEBIAN)/d-i/exclude-modules.$(arch)-* 2>/dev/null`\
|| true; \
if [ "$$flavour_exclude" ]; then \
for flav in $$flavour_exclude; do \
name=`echo $$flav | sed 's/.*\/exclude-modules.$(arch)-//'`;\
[ -d $(builddir)/modules/$(arch)-$$name ] || \
cp -a $(builddir)/modules/$(arch) \
$(builddir)/modules/$(arch)-$$name; \
(cat $$flav; \
ls $(builddir)/modules/$(arch)-$$name) | \
sort | uniq -d | \
(cd $(builddir)/modules/$(arch)-$$name/; \
xargs rm -f); \
done; \
fi
flavour_exclude=`ls $(DEBIAN)/d-i/exclude-firmware.$(arch)-* 2>/dev/null`\
|| true; \
if [ "$$flavour_exclude" ]; then \
for flav in $$flavour_exclude; do \
name=`echo $$flav | sed 's/.*\/exclude-firmware.$(arch)-//'`;\
[ -d $(builddir)/firmware/$(arch)-$$name ] || \
cp -a $(builddir)/firmware/$(arch) \
$(builddir)/firmware/$(arch)-$$name; \
(cat $$flav; \
ls $(builddir)/firmware/$(arch)-$$name) | \
sort | uniq -d | \
(cd $(builddir)/firmware/$(arch)-$$name/; \
xargs rm -f); \
done; \
fi
if [ ! -d $(builddir)/modules/$(build_arch) ]; then \
mkdir -p $(builddir)/modules/$(build_arch); \
cp $(builddir)/modules/$(arch)/* \
$(builddir)/modules/$(build_arch); \
fi
if [ ! -d $(builddir)/firmware/$(build_arch) ]; then \
mkdir -p $(builddir)/firmware/$(build_arch); \
cp $(builddir)/firmware/$(arch)/* \
$(builddir)/firmware/$(build_arch); \
fi
cp $(DEBIAN)/control.stub debian/control.stub
cd $(builddir) && kernel-wedge gen-control > $(CURDIR)/debian/control
#
# The source package name will be the first token from $(DEBIAN)/changelog
#
src_pkg_name=$(shell sed -n '1s/^\(.*\) (.*).*$$/\1/p' $(DEBIAN)/changelog)
# Get some version info
series := oneiric
release := $(shell sed -n '1s/^$(src_pkg_name).*(\(.*\)-.*).*$$/\1/p' $(DEBIAN)/changelog)
revisions := $(shell sed -n 's/^$(src_pkg_name)\ .*($(release)-\(.*\)).*$$/\1/p' $(DEBIAN)/changelog | tac)
revision ?= $(word $(words $(revisions)),$(revisions))
prev_revisions := $(filter-out $(revision),0.0 $(revisions))
prev_revision := $(word $(words $(prev_revisions)),$(prev_revisions))
family=ubuntu
# This is an internally used mechanism for the daily kernel builds. It
# creates packages whose ABI is suffixed with a minimal representation of
# the current git HEAD sha. If .git/HEAD is not present, then it uses the
# uuidgen program,
#
# AUTOBUILD can also be used by anyone wanting to build a custom kernel
# image, or rebuild the entire set of Ubuntu packages using custom patches
# or configs.
AUTOBUILD=
#
# This is a way to support some external variables. A good example is
# a local setup for ccache and distcc See LOCAL_ENV_CC and
# LOCAL_ENV_DISTCC_HOSTS in the definition of kmake.
# For example:
# LOCAL_ENV_CC="ccache distcc"
# LOCAL_ENV_DISTCC_HOSTS="localhost 10.0.2.5 10.0.2.221"
#
-include $(CURDIR)/../.$(series)-env
ifneq ($(AUTOBUILD),)
skipabi = true
skipmodule = true
skipdbg = true
gitver=$(shell if test -f .git/HEAD; then cat .git/HEAD; else uuidgen; fi)
gitverpre=$(shell echo $(gitver) | cut -b -3)
gitverpost=$(shell echo $(gitver) | cut -b 38-40)
abi_suffix = -$(gitverpre)$(gitverpost)
endif
ifneq ($(NOKERNLOG),)
ubuntu_log_opts += --no-kern-log
endif
ifneq ($(PRINTSHAS),)
ubuntu_log_opts += --print-shas
endif
# Get the kernels own extra version to be added to the release signature.
raw_kernelversion=$(shell make kernelversion)
#
# full_build -- are we doing a full buildd style build
#
ifeq ($(wildcard /CurrentlyBuilding),)
full_build?=false
else
full_build?=true
endif
#
# The debug packages are ginormous, so you probably want to skip
# building them (as a developer).
#
ifeq ($(full_build),false)
skipdbg=true
endif
abinum := $(shell echo $(revision) | sed -e 's/\..*//')$(abi_suffix)
prev_abinum := $(shell echo $(prev_revision) | sed -e 's/\..*//')$(abi_suffix)
abi_release := $(release)-$(abinum)
uploadnum := $(shell echo $(revision) | sed -e 's/.*\.//')
ifneq ($(full_build),false)
uploadnum := $(uploadnum)-Ubuntu
endif
# XXX: linux-libc-dev got bumped to -803.N inadvertantly by a ti-omap4 upload
# shift our version higher for this package only. Ensure this only
# occurs for the v2.6.35 kernel so that we do not propogate this into
# any other series.
raw_uploadnum := $(shell echo $(revision) | sed -e 's/.*\.//')
libc_dev_version :=
ifeq ($(DEBIAN),debian.master)
ifeq ($(release),2.6.35)
libc_dev_version := -v$(release)-$(shell expr "$(abinum)" + 1000).$(raw_uploadnum)
endif
endif
DEB_HOST_MULTIARCH = $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
DEB_HOST_GNU_TYPE = $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DEB_BUILD_GNU_TYPE = $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
DEB_HOST_ARCH = $(shell dpkg-architecture -qDEB_HOST_ARCH)
DEB_BUILD_ARCH = $(shell dpkg-architecture -qDEB_BUILD_ARCH)
#
# Detect invocations of the form 'fakeroot debian/rules binary arch=armel'
# within an x86'en schroot. This only gets you part of the way since the
# packaging phase fails, but you can at least compile the kernel quickly.
#
arch := $(DEB_HOST_ARCH)
ifneq ($(arch),$(DEB_HOST_ARCH))
CROSS_COMPILE ?= $(shell dpkg-architecture -a$(arch) -qDEB_HOST_GNU_TYPE -f 2>/dev/null)-
endif
#
# Detect invocations of the form 'dpkg-buildpackage -B -aarmel' within
# an x86'en schroot. This is the only way to build all of the packages
# (except for tools).
#
ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
CROSS_COMPILE ?= $(DEB_HOST_GNU_TYPE)-
endif
abidir := $(CURDIR)/$(DEBIAN)/abi/$(release)-$(revision)/$(arch)
prev_abidir := $(CURDIR)/$(DEBIAN)/abi/$(release)-$(prev_revision)/$(arch)
commonconfdir := $(CURDIR)/$(DEBIAN)/config
archconfdir := $(CURDIR)/$(DEBIAN)/config/$(arch)
sharedconfdir := $(CURDIR)/debian.master/config
builddir := $(CURDIR)/debian/build
stampdir := $(CURDIR)/debian/stamps
#
# The binary package name always starts with linux-image-$KVER-$ABI.$UPLOAD_NUM. There
# are places that you'll find linux-image hard coded, but I guess thats OK since the
# assumption that the binary package always starts with linux-image will never change.
#
bin_pkg_name=linux-image-$(abi_release)
extra_pkg_name=linux-image-extra-$(abi_release)
hdrs_pkg_name=linux-headers-$(abi_release)
#
# The generation of content in the doc package depends on both 'AUTOBUILD=' and
# 'do_doc_package_content=true'. There are usually build errors during the development
# cycle, so its OK to leave 'do_doc_package_content=false' until those build
# failures get sorted out. Finally, the doc package doesn't really need to be built
# for developer testing (its kind of slow), so only do it if on a buildd.
do_doc_package=true
do_doc_package_content=true
ifeq ($(full_build),false)
do_doc_package_content=false
endif
doc_pkg_name=$(src_pkg_name)-doc
#
# Similarly with the linux-source package, you need not build it as a developer. Its
# somewhat I/O intensive and utterly useless.
#
do_source_package=true
do_source_package_content=true
ifeq ($(full_build),false)
do_source_package_content=false
endif
# linux-libc-dev may not be needed, default to building it.
do_libc_dev_package=true
# common headers normally is built as an indep package, but may be arch
do_common_headers_indep=true
# add a 'full source' mode
do_full_source=false
# build tools
ifneq ($(wildcard $(CURDIR)/tools),)
ifeq ($(do_tools),)
ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
do_tools=false
endif
endif
do_tools?=true
else
do_tools?=false
endif
tools_pkg_name=$(src_pkg_name)-tools-$(abi_release)
tools_common_pkg_name=$(src_pkg_name)-tools-common
# The general flavour specific image package.
do_flavour_image_package=true
# The general flavour specific header package.
do_flavour_header_package=true
# Support parallel=<n> in DEB_BUILD_OPTIONS (see #209008)
#
# These 2 environment variables set the -j value of the kernel build. For example,
# CONCURRENCY_LEVEL=16 fakeroot $(DEBIAN)/rules binary-debs
# or
# DEB_BUILD_OPTIONS=parallel=16 fakeroot $(DEBIAN)/rules binary-debs
#
# The default is to use the number of CPUs.
#
COMMA=,
DEB_BUILD_OPTIONS_PARA = $(subst parallel=,,$(filter parallel=%,$(subst $(COMMA), ,$(DEB_BUILD_OPTIONS))))
ifneq (,$(DEB_BUILD_OPTIONS_PARA))
CONCURRENCY_LEVEL := $(DEB_BUILD_OPTIONS_PARA)
endif
ifeq ($(CONCURRENCY_LEVEL),)
# Check the environment
CONCURRENCY_LEVEL := $(shell echo $$CONCURRENCY_LEVEL)
# No? Then build with the number of CPUs on the host.
ifeq ($(CONCURRENCY_LEVEL),)
CONCURRENCY_LEVEL := $(shell expr `getconf _NPROCESSORS_ONLN` \* 1)
endif
# Oh hell, give 'em one
ifeq ($(CONCURRENCY_LEVEL),)
CONCURRENCY_LEVEL := 1
endif
endif
conc_level = -j$(CONCURRENCY_LEVEL)
# target_flavour is filled in for each step
kmake = make ARCH=$(build_arch) \
CROSS_COMPILE=$(CROSS_COMPILE) \
KERNELVERSION=$(abi_release)-$(target_flavour) \
CONFIG_DEBUG_SECTION_MISMATCH=y \
KBUILD_BUILD_VERSION="$(uploadnum)" \
LOCALVERSION= localver-extra=
ifneq ($(LOCAL_ENV_CC),)
kmake += CC=$(LOCAL_ENV_CC) DISTCC_HOSTS=$(LOCAL_ENV_DISTCC_HOSTS)
endif
# Locking is required in parallel builds to prevent loss of contents
# of the debian/files.
lockme_file = $(CURDIR)/debian/.LOCK
lockme_cmd = flock -w 60
lockme = $(lockme_cmd) $(lockme_file)
# The following targets are for the maintainer only! do not run if you don't
# know what they do.
.PHONY: printenv updateconfigs printchanges insertchanges startnewrelease diffupstream help updateportsconfigs editportsconfigs
help:
@echo "These are the targets in addition to the normal $(DEBIAN) ones:"
@echo
@echo " printenv : Print some variables used in the build"
@echo
@echo " updateconfigs : Update core arch configs"
@echo
@echo " editconfigs : Update core arch configs interractively"
@echo " genconfigs : Generate core arch configs in CONFIGS/*"
@echo
@echo " updateportsconfigs : Update ports arch configs"
@echo
@echo " editportsconfigs : Update ports arch configs interactivly"
@echo " genportconfigs : Generate ports arch configs in CONFIGS/*"
@echo
@echo " printchanges : Print the current changelog entries (from git)"
@echo
@echo " insertchanges : Insert current changelog entries (from git)"
@echo
@echo " startnewrelease : Start a new changelog set"
@echo
@echo " diffupstream : Diff stock kernel code against upstream (git)"
@echo
@echo " help : If you are kernel hacking, you need the professional"
@echo " version of this"
@echo
@echo "Environment variables:"
@echo
@echo " NOKERNLOG : Do not add upstream kernel commits to changelog"
@echo " CONCURRENCY_LEVEL=X"
@echo " : Use -jX for kernel compile"
@echo " PRINTSHAS : Include SHAs for commits in changelog"
printdebian:
@echo "$(DEBIAN)"
updateconfigs defaultconfigs editconfigs genconfigs dumpconfigs:
dh_testdir;
$(SHELL) $(DROOT)/scripts/misc/kernelconfig $@
rm -rf build
updateportsconfigs defaultportsconfigs editportsconfigs genportsconfigs askconfigs:
dh_testdir;
$(SHELL) $(DROOT)/scripts/misc/kernelconfig $@ ports
rm -rf build
printenv:
dh_testdir
@echo "src package name = $(src_pkg_name)"
@echo "release = $(release)"
@echo "revisions = $(revisions)"
@echo "revision = $(revision)"
@echo "uploadnum = $(uploadnum)"
@echo "prev_revisions = $(prev_revisions)"
@echo "prev_revision = $(prev_revision)"
@echo "abinum = $(abinum)"
@echo "gitver = $(gitver)"
@echo "flavours = $(flavours)"
@echo "skipabi = $(skipabi)"
@echo "skipmodule = $(skipmodule)"
@echo "skipdbg = $(skipdbg)"
@echo "ubuntu_log_opts = $(ubuntu_log_opts)"
@echo "CONCURRENCY_LEVEL = $(CONCURRENCY_LEVEL)"
@echo "bin package name = $(bin_pkg_name)"
@echo "hdr package name = $(hdrs_pkg_name)"
@echo "doc package name = $(doc_pkg_name)"
@echo "do_doc_package = $(do_doc_package)"
@echo "do_doc_package_content = $(do_doc_package_content)"
@echo "do_source_package = $(do_source_package)"
@echo "do_source_package_content = $(do_source_package_content)"
@echo "do_libc_dev_package = $(do_libc_dev_package)"
@echo "do_flavour_image_package = $(do_flavour_image_package)"
@echo "do_flavour_header_package = $(do_flavour_header_package)"
@echo "do_common_headers_indep = $(do_common_headers_indep)"
@echo "do_full_source = $(do_full_source)"
@echo "do_tools = $(do_tools)"
@echo "full_build = $(full_build)"
@echo "libc_dev_version = $(libc_dev_version)"
@echo "DEB_HOST_GNU_TYPE = $(DEB_HOST_GNU_TYPE)"
@echo "DEB_BUILD_GNU_TYPE = $(DEB_BUILD_GNU_TYPE)"
@echo "DEB_HOST_ARCH = $(DEB_HOST_ARCH)"
@echo "DEB_BUILD_ARCH = $(DEB_BUILD_ARCH)"
@echo "arch = $(arch)"
@echo "kmake = $(kmake)"
prev_release="$(release)-$(prev_revision)"
printchanges:
@baseCommit=$$(git log --pretty=format:'%H %s' | \
awk '/UBUNTU: '".*Ubuntu-$(prev_release)"'$$/ { print $$1; exit }'); \
git log "$$baseCommit"..HEAD | \
perl -w -f $(DROOT)/scripts/misc/git-ubuntu-log $(ubuntu_log_opts)
insertchanges:
@perl -w -f $(DROOT)/scripts/misc/insert-changes.pl $(DROOT) $(DEBIAN)
diffupstream:
@git diff-tree -p refs/remotes/linux-2.6/master..HEAD $(shell ls | grep -vE '^(ubuntu|$(DEBIAN)|\.git.*)')
startnewrelease:
dh_testdir
@nextminor=$(shell expr `echo $(revision) | awk -F. '{print $$2}'` + 1); \
now="$(shell date -R)"; \
echo "Creating new changelog set for $(abi_release).$$nextminor..."; \
echo -e "$(src_pkg_name) ($(abi_release).$$nextminor) UNRELEASED; urgency=low\n" > $(DEBIAN)/changelog.new; \
echo " CHANGELOG: Do not edit directly. Autogenerated at release." >> \
$(DEBIAN)/changelog.new; \
echo " CHANGELOG: Use the printchanges target to see the curent changes." \
>> $(DEBIAN)/changelog.new; \
echo " CHANGELOG: Use the insertchanges target to create the final log." \
>> $(DEBIAN)/changelog.new; \
echo -e "\n -- $$DEBFULLNAME <$$DEBEMAIL> $$now\n" >> \
$(DEBIAN)/changelog.new ; \
cat $(DEBIAN)/changelog >> $(DEBIAN)/changelog.new; \
mv $(DEBIAN)/changelog.new $(DEBIAN)/changelog
# We don't want make removing intermediary stamps
.SECONDARY :
# Prepare the out-of-tree build directory
ifeq ($(do_full_source),true)
build_cd = cd $(builddir)/build-$*; #
build_O =
else
build_cd =
build_O = O=$(builddir)/build-$*
endif
$(stampdir)/stamp-prepare-%: config-prepare-check-%
@echo Debug: $@
@touch $@
$(stampdir)/stamp-prepare-tree-%: target_flavour = $*
$(stampdir)/stamp-prepare-tree-%: $(commonconfdir)/config.common.$(family) $(archconfdir)/config.common.$(arch) $(archconfdir)/config.flavour.%
@echo Debug: $@
install -d $(builddir)/build-$*
touch $(builddir)/build-$*/ubuntu-build
[ "$(do_full_source)" != 'true' ] && true || \
rsync -a --exclude debian --exclude debian.master --exclude $(DEBIAN) * $(builddir)/build-$*
cat $^ | sed -e 's/.*CONFIG_VERSION_SIGNATURE.*/CONFIG_VERSION_SIGNATURE="Ubuntu $(release)-$(revision)-$* $(raw_kernelversion)"/' > $(builddir)/build-$*/.config
find $(builddir)/build-$* -name "*.ko" | xargs rm -f
$(build_cd) $(kmake) $(build_O) -j1 silentoldconfig prepare scripts
touch $@
# Used by developers as a shortcut to prepare a tree for compilation.
prepare-%: $(stampdir)/stamp-prepare-%
@echo Debug: $@
# Used by developers to allow efficient pre-building without fakeroot.
build-%: $(stampdir)/stamp-build-%
@echo Debug: $@
# Do the actual build, including image and modules
$(stampdir)/stamp-build-%: target_flavour = $*
$(stampdir)/stamp-build-%: dtb_target = $(notdir $(dtb_file_$*))
$(stampdir)/stamp-build-%: $(stampdir)/stamp-prepare-%
@echo Debug: $@
$(build_cd) $(kmake) $(build_O) $(conc_level) $(build_image) modules $(dtb_target)
@touch $@
# Install the finished build
install-%: pkgdir = $(CURDIR)/debian/$(bin_pkg_name)-$*
install-%: pkgdir_ex = $(CURDIR)/debian/$(extra_pkg_name)-$*
install-%: bindoc = $(pkgdir)/usr/share/doc/$(bin_pkg_name)-$*
install-%: dbgpkgdir = $(CURDIR)/debian/$(bin_pkg_name)-$*-dbgsym
install-%: basepkg = $(hdrs_pkg_name)
install-%: hdrdir = $(CURDIR)/debian/$(basepkg)-$*/usr/src/$(basepkg)-$*
install-%: target_flavour = $*
install-%: dtb_file=$(dtb_file_$*)
install-%: dtb_target=$(notdir $(dtb_file_$*))
install-%: checks-%
@echo Debug: $@
dh_testdir
dh_testroot
dh_clean -k -p$(bin_pkg_name)-$*
dh_clean -k -p$(hdrs_pkg_name)-$*
dh_clean -k -p$(dbg_pkg_name)-$*
# The main image
# compress_file logic required because not all architectures
# generate a zImage automatically out of the box
ifeq ($(compress_file),)
install -m600 -D $(builddir)/build-$*/$(kernel_file) \
$(pkgdir)/boot/$(install_file)-$(abi_release)-$*
else
install -d $(pkgdir)/boot
gzip -c9v $(builddir)/build-$*/$(kernel_file) > \
$(pkgdir)/boot/$(install_file)-$(abi_release)-$*
chmod 600 $(pkgdir)/boot/$(install_file)-$(abi_release)-$*
endif
install -m644 $(builddir)/build-$*/.config \
$(pkgdir)/boot/config-$(abi_release)-$*
install -m644 $(abidir)/$* \
$(pkgdir)/boot/abi-$(abi_release)-$*
install -m600 $(builddir)/build-$*/System.map \
$(pkgdir)/boot/System.map-$(abi_release)-$*
if [ "$(dtb_target)" ]; then \
install -d $(pkgdir)/lib/firmware/$(abi_release)-$*/device-tree; \
install -m644 $(builddir)/build-$*/$(dtb_file) \
$(pkgdir)/lib/firmware/$(abi_release)-$*/device-tree/$(dtb_target); \
fi
ifeq ($(no_dumpfile),)
makedumpfile -g $(pkgdir)/boot/vmcoreinfo-$(abi_release)-$* \
-x $(builddir)/build-$*/vmlinux
chmod 0600 $(pkgdir)/boot/vmcoreinfo-$(abi_release)-$*
endif
$(build_cd) $(kmake) $(build_O) $(conc_level) modules_install \
INSTALL_MOD_STRIP=1 INSTALL_MOD_PATH=$(pkgdir)/ \
INSTALL_FW_PATH=$(pkgdir)/lib/firmware/$(abi_release)-$*
#
# Remove all modules not in the inclusion list.
#
if [ -f $(DEBIAN)/control.d/$(target_flavour).inclusion-list ] ; then \
mkdir -p $(pkgdir_ex)/lib/modules/$(abi_release)-$*; \
mv $(pkgdir)/lib/modules/$(abi_release)-$*/kernel \
$(pkgdir_ex)/lib/modules/$(abi_release)-$*/kernel; \
$(SHELL) $(DROOT)/scripts/module-inclusion --master \
$(pkgdir_ex)/lib/modules/$(abi_release)-$*/kernel \
$(pkgdir)/lib/modules/$(abi_release)-$*/kernel \
$(DEBIAN)/control.d/$(target_flavour).inclusion-list 2>&1 | \
tee $(target_flavour).inclusion-list.log; \
/sbin/depmod -b $(pkgdir) -ea -F $(pkgdir)/boot/System.map-$(abi_release)-$* \
$(abi_release)-$* 2>&1 |tee $(target_flavour).depmod.log; \
fi
ifeq ($(no_dumpfile),)
makedumpfile -g $(pkgdir)/boot/vmcoreinfo-$(abi_release)-$* \
-x $(builddir)/build-$*/vmlinux
chmod 0600 $(pkgdir)/boot/vmcoreinfo-$(abi_release)-$*
endif
rm -f $(pkgdir)/lib/modules/$(abi_release)-$*/build
rm -f $(pkgdir)/lib/modules/$(abi_release)-$*/source
# Some initramfs-tools specific modules
install -d $(pkgdir)/lib/modules/$(abi_release)-$*/initrd
if [ -f $(pkgdir)/lib/modules/$(abi_release)-$*/kernel/drivers/video/vesafb.ko ]; then\
ln -f $(pkgdir)/lib/modules/$(abi_release)-$*/kernel/drivers/video/vesafb.ko \
$(pkgdir)/lib/modules/$(abi_release)-$*/initrd/; \
fi
# Now the image scripts
install -d $(pkgdir)/DEBIAN
for script in postinst postrm preinst prerm; do \
sed -e 's/=V/$(abi_release)-$*/g' -e 's/=K/$(install_file)/g' \
-e 's/=L/$(loader)/g' -e 's@=B@$(build_arch)@g' \
$(DROOT)/control-scripts/$$script > $(pkgdir)/DEBIAN/$$script; \
chmod 755 $(pkgdir)/DEBIAN/$$script; \
done
# Install the postinit/postrm scripts in the extras package.
if [ -f $(DEBIAN)/control.d/$(target_flavour).inclusion-list ] ; then \
install -d $(pkgdir_ex)/DEBIAN; \
for script in postinst postrm ; do \
sed -e 's/=V/$(abi_release)-$*/g' -e 's/=K/$(install_file)/g' \
-e 's/=L/$(loader)/g' -e 's@=B@$(build_arch)@g' \
debian/control-scripts/$$script > $(pkgdir_ex)/DEBIAN/$$script; \
chmod 755 $(pkgdir_ex)/DEBIAN/$$script; \
done; \
fi
# Install the full changelog.
ifeq ($(do_doc_package),true)
install -d $(bindoc)
cat $(DEBIAN)/changelog $(DEBIAN)/changelog.historical | \
gzip -9 >$(bindoc)/changelog.Debian.old.gz
chmod 644 $(bindoc)/changelog.Debian.old.gz
endif
ifneq ($(skipsub),true)
for sub in $($(*)_sub); do \
if ! (TO=$$sub FROM=$* ABI_RELEASE=$(abi_release) $(SHELL) \
$(DROOT)/scripts/sub-flavour); then exit 1; fi; \
/sbin/depmod -b debian/$(bin_pkg_name)-$$sub \
-ea -F debian/$(bin_pkg_name)-$$sub/boot/System.map-$(abi_release)-$* \
$(abi_release)-$*; \
install -d debian/$(bin_pkg_name)-$$sub/DEBIAN; \
for script in postinst postrm preinst prerm; do \
sed -e 's/=V/$(abi_release)-$*/g' \
-e 's/=K/$(install_file)/g' \
-e 's/=L/$(loader)/g' \
-e 's@=B@$(build_arch)@g' \
$(DROOT)/control-scripts/$$script > \
debian/$(bin_pkg_name)-$$sub/DEBIAN/$$script;\
chmod 755 debian/$(bin_pkg_name)-$$sub/DEBIAN/$$script;\
done; \
done
endif
ifneq ($(skipdbg),true)
# Debug image is simple
install -m644 -D $(builddir)/build-$*/vmlinux \
$(dbgpkgdir)/usr/lib/debug/boot/vmlinux-$(abi_release)-$*
$(build_cd) $(kmake) $(build_O) modules_install \
INSTALL_MOD_PATH=$(dbgpkgdir)/usr/lib/debug
# Add .gnu_debuglink sections to each stripped .ko
# pointing to unstripped verson
find $(pkgdir) -name '*.ko' | sed 's|$(pkgdir)||'| while read module ; do \
if [[ -f "$(dbgpkgdir)/usr/lib/debug/$$module" ]] ; then \
$(CROSS_COMPILE)objcopy \
--add-gnu-debuglink=$(dbgpkgdir)/usr/lib/debug/$$module \
$(pkgdir)/$$module; \
fi; \
done
rm -f $(dbgpkgdir)/usr/lib/debug/lib/modules/$(abi_release)-$*/build
rm -f $(dbgpkgdir)/usr/lib/debug/lib/modules/$(abi_release)-$*/source
rm -f $(dbgpkgdir)/usr/lib/debug/lib/modules/$(abi_release)-$*/modules.*
rm -fr $(dbgpkgdir)/usr/lib/debug/lib/firmware
endif
# The flavour specific headers image
# TODO: Would be nice if we didn't have to dupe the original builddir
install -d -m755 $(hdrdir)
cat $(builddir)/build-$*/.config | \
sed -e 's/.*CONFIG_DEBUG_INFO=.*/# CONFIG_DEBUG_INFO is not set/g' > \
$(hdrdir)/.config
chmod 644 $(hdrdir)/.config
$(kmake) O=$(hdrdir) -j1 silentoldconfig prepare scripts
# We'll symlink this stuff
rm -f $(hdrdir)/Makefile
rm -rf $(hdrdir)/include2
# Copy over the compilation version.
cp "$(builddir)/build-$*/include/generated/compile.h" \
"$(hdrdir)/include/generated/compile.h"
# powerpc seems to need some .o files for external module linking. Add them in.
ifeq ($(arch),powerpc)
mkdir -p $(hdrdir)/arch/powerpc/lib
cp $(builddir)/build-$*/arch/powerpc/lib/*.o $(hdrdir)/arch/powerpc/lib
endif
# Script to symlink everything up
$(SHELL) $(DROOT)/scripts/link-headers "$(hdrdir)" "$(basepkg)" "$*"
# The build symlink
install -d debian/$(basepkg)-$*/lib/modules/$(abi_release)-$*
ln -s /usr/src/$(basepkg)-$* \
debian/$(basepkg)-$*/lib/modules/$(abi_release)-$*/build
# And finally the symvers
install -m644 $(builddir)/build-$*/Module.symvers \
$(hdrdir)/Module.symvers
# Now the header scripts
install -d $(CURDIR)/debian/$(basepkg)-$*/DEBIAN
for script in postinst; do \
sed -e 's/=V/$(abi_release)-$*/g' -e 's/=K/$(install_file)/g' \
$(DROOT)/control-scripts/headers-$$script > \
$(CURDIR)/debian/$(basepkg)-$*/DEBIAN/$$script; \
chmod 755 $(CURDIR)/debian/$(basepkg)-$*/DEBIAN/$$script; \
done
# At the end of the package prep, call the tests
DPKG_ARCH="$(arch)" KERN_ARCH="$(build_arch)" FLAVOUR="$*" \
VERSION="$(abi_release)" REVISION="$(revision)" \
PREV_REVISION="$(prev_revision)" ABI_NUM="$(abinum)" \
PREV_ABI_NUM="$(prev_abinum)" BUILD_DIR="$(builddir)/build-$*" \
INSTALL_DIR="$(pkgdir)" SOURCE_DIR="$(CURDIR)" \
run-parts -v $(DROOT)/tests
#
# Remove files which are generated at installation by postinst,
# except for modules.order and modules.builtin
#
# NOTE: need to keep this list in sync with postrm
#
mkdir $(pkgdir)/lib/modules/$(abi_release)-$*/_
mv $(pkgdir)/lib/modules/$(abi_release)-$*/modules.order \
$(pkgdir)/lib/modules/$(abi_release)-$*/_
if [ -f $(pkgdir)/lib/modules/$(abi_release)-$*/modules.builtin ] ; then \
mv $(pkgdir)/lib/modules/$(abi_release)-$*/modules.builtin \
$(pkgdir)/lib/modules/$(abi_release)-$*/_; \
fi
rm -f $(pkgdir)/lib/modules/$(abi_release)-$*/modules.*
mv $(pkgdir)/lib/modules/$(abi_release)-$*/_/* \
$(pkgdir)/lib/modules/$(abi_release)-$*
rmdir $(pkgdir)/lib/modules/$(abi_release)-$*/_
headers_tmp := $(CURDIR)/debian/tmp-headers
headers_dir := $(CURDIR)/debian/linux-libc-dev
hmake := $(MAKE) -C $(CURDIR) O=$(headers_tmp) \
KERNELVERSION=$(abi_release) INSTALL_HDR_PATH=$(headers_tmp)/install \
SHELL="$(SHELL)" ARCH=$(header_arch)
install-arch-headers:
@echo Debug: $@
dh_testdir
dh_testroot
dh_clean -k -plinux-libc-dev
rm -rf $(headers_tmp)
install -d $(headers_tmp) $(headers_dir)/usr/include/
$(hmake) $(defconfig)
mv $(headers_tmp)/.config $(headers_tmp)/.config.old
sed -e 's/^# \(CONFIG_MODVERSIONS\) is not set$$/\1=y/' \
-e 's/.*CONFIG_LOCALVERSION_AUTO.*/# CONFIG_LOCALVERSION_AUTO is not set/' \
$(headers_tmp)/.config.old > $(headers_tmp)/.config
$(hmake) silentoldconfig
$(hmake) $(conc_level) headers_install
( cd $(headers_tmp)/install/include/ && \
find . -name '.' -o -name '.*' -prune -o -print | \
cpio -pvd --preserve-modification-time \
$(headers_dir)/usr/include/ )
mkdir $(headers_dir)/usr/include/$(DEB_HOST_MULTIARCH)
mv $(headers_dir)/usr/include/asm $(headers_dir)/usr/include/$(DEB_HOST_MULTIARCH)/
rm -rf $(headers_tmp)
binary-arch-headers: install-arch-headers
@echo Debug: $@
dh_testdir
dh_testroot
ifeq ($(do_libc_dev_package),true)
ifneq ($(DEBIAN),debian.master)
echo "non-master branch building linux-libc-dev, aborting"
exit 1
endif
dh_installchangelogs -plinux-libc-dev
dh_installdocs -plinux-libc-dev
dh_compress -plinux-libc-dev
dh_fixperms -plinux-libc-dev
dh_installdeb -plinux-libc-dev
$(lockme) dh_gencontrol -plinux-libc-dev -- $(libc_dev_version)
dh_md5sums -plinux-libc-dev
dh_builddeb -plinux-libc-dev
endif
binary-%: pkgimg = $(bin_pkg_name)-$*
binary-%: pkgimg_ex = $(extra_pkg_name)-$*
binary-%: pkghdr = $(hdrs_pkg_name)-$*
binary-%: dbgpkg = $(bin_pkg_name)-$*-dbgsym
binary-%: dbgpkgdir = $(CURDIR)/debian/$(bin_pkg_name)-$*-dbgsym
binary-%: target_flavour = $*
binary-%: install-%
@echo Debug: $@
dh_testdir
dh_testroot
dh_installchangelogs -p$(pkgimg)
dh_installdocs -p$(pkgimg)
dh_compress -p$(pkgimg)
dh_fixperms -p$(pkgimg) -X/boot/
dh_installdeb -p$(pkgimg)
dh_shlibdeps -p$(pkgimg)
$(lockme) dh_gencontrol -p$(pkgimg)
dh_md5sums -p$(pkgimg)
dh_builddeb -p$(pkgimg) -- -Zbzip2 -z9
if [ -f $(DEBIAN)/control.d/$(target_flavour).inclusion-list ] ; then \
dh_installchangelogs -p$(pkgimg_ex); \
dh_installdocs -p$(pkgimg_ex); \
dh_compress -p$(pkgimg_ex); \
dh_fixperms -p$(pkgimg_ex) -X/boot/; \
dh_installdeb -p$(pkgimg_ex); \
dh_shlibdeps -p$(pkgimg_ex); \
$(lockme) dh_gencontrol -p$(pkgimg_ex); \
dh_md5sums -p$(pkgimg_ex); \
dh_builddeb -p$(pkgimg_ex) -- -Zbzip2 -z9; \
fi
dh_installchangelogs -p$(pkghdr)
dh_installdocs -p$(pkghdr)
dh_compress -p$(pkghdr)
dh_fixperms -p$(pkghdr)
dh_shlibdeps -p$(pkghdr)
dh_installdeb -p$(pkghdr)
$(lockme) dh_gencontrol -p$(pkghdr)
dh_md5sums -p$(pkghdr)
dh_builddeb -p$(pkghdr)
ifneq ($(skipsub),true)
@set -e; for sub in $($(*)_sub); do \
pkg=$(bin_pkg_name)-$$sub; \
dh_installchangelogs -p$$pkg; \
dh_installdocs -p$$pkg; \
dh_compress -p$$pkg; \
dh_fixperms -p$$pkg -X/boot/; \
dh_shlibdeps -p$$pkg; \
dh_installdeb -p$$pkg; \
$(lockme) dh_gencontrol -p$$pkg; \
dh_md5sums -p$$pkg; \
dh_builddeb -p$$pkg; \
done
endif
ifneq ($(skipdbg),true)
dh_installchangelogs -p$(dbgpkg)
dh_installdocs -p$(dbgpkg)
dh_compress -p$(dbgpkg)
dh_fixperms -p$(dbgpkg)
dh_installdeb -p$(dbgpkg)
$(lockme) dh_gencontrol -p$(dbgpkg)
dh_md5sums -p$(dbgpkg)
dh_builddeb -p$(dbgpkg)
# Hokay...here's where we do a little twiddling...
# Renaming the debug package prevents it from getting into
# the primary archive, and therefore prevents this very large
# package from being mirrored. It is instead, through some
# archive admin hackery, copied to http://ddebs.ubuntu.com.
#
mv ../$(dbgpkg)_$(release)-$(revision)_$(arch).deb \
../$(dbgpkg)_$(release)-$(revision)_$(arch).ddeb
set -e; \
( \
$(lockme_cmd) 9 || exit 1; \
if grep -qs '^Build-Debug-Symbols: yes$$' /CurrentlyBuilding; then \
sed -i '/^$(dbgpkg)_/s/\.deb /.ddeb /' debian/files; \
else \
grep -v '^$(dbgpkg)_.*$$' debian/files > debian/files.new; \
mv debian/files.new debian/files; \
fi; \
) 9>$(lockme_file)
# Now, the package wont get into the archive, but it will get put
# into the debug system.
endif
ifneq ($(full_build),false)
# Clean out this flavours build directory.
rm -rf $(builddir)/build-$*
# Clean out the debugging package source directory.
rm -rf $(dbgpkgdir)
endif
#
# per-architecture packages
#
builddirpa = $(builddir)/tools-perarch
$(stampdir)/stamp-prepare-perarch:
@echo Debug: $@
ifeq ($(do_tools),true)
rm -rf $(builddirpa)
install -d $(builddirpa)
for i in *; do ln -s $(CURDIR)/$$i $(builddirpa); done
rm $(builddirpa)/tools
rsync -a tools/ $(builddirpa)/tools/
endif
touch $@
$(stampdir)/stamp-build-perarch: $(stampdir)/stamp-prepare-perarch
@echo Debug: $@
ifeq ($(do_tools),true)
cd $(builddirpa)/tools/perf && \
make HAVE_CPLUS_DEMANGLE=1 CROSS_COMPILE=$(CROSS_COMPILE)
if [ "$(arch)" = "amd64" ] || [ "$(arch)" = "i386" ]; then \
cd $(builddirpa)/tools/power/x86/x86_energy_perf_policy && make CROSS_COMPILE=$(CROSS_COMPILE); \
cd $(builddirpa)/tools/power/x86/turbostat && make CROSS_COMPILE=$(CROSS_COMPILE); \
if [ "$(do_hyperv)" = "true" ]; then \
cd $(builddirpa)/tools/hv && make CROSS_COMPILE=$(CROSS_COMPILE); \
fi; \
fi
endif
@touch $@
install-perarch: toolspkgdir = $(CURDIR)/debian/$(tools_pkg_name)
install-perarch: $(stampdir)/stamp-build-perarch
@echo Debug: $@
# Add the tools.
ifeq ($(do_tools),true)
install -d $(toolspkgdir)/usr/bin
install -s -m755 $(builddirpa)/tools/perf/perf \
$(toolspkgdir)/usr/bin/perf_$(abi_release)
if [ "$(arch)" = "amd64" ] || [ "$(arch)" = "i386" ]; then \
install -s -m755 $(builddirpa)/tools/power/x86/x86_energy_perf_policy/x86_energy_perf_policy \
$(toolspkgdir)/usr/bin/x86_energy_perf_policy_$(abi_release); \
install -s -m755 $(builddirpa)/tools/power/x86/turbostat/turbostat \
$(toolspkgdir)/usr/bin/turbostat_$(abi_release); \
if [ "$(do_hyperv)" = "true" ]; then \
install -d $(toolspkgdir)/usr/sbin; \
install -s -m755 $(builddirpa)/tools/hv/hv_kvp_daemon \
$(toolspkgdir)/usr/sbin/hv_kvp_daemon_$(abi_release); \
fi; \
fi
endif
binary-perarch: toolspkg = $(tools_pkg_name)
binary-perarch: install-perarch
@echo Debug: $@
ifeq ($(do_tools),true)
dh_installchangelogs -p$(toolspkg)
dh_installdocs -p$(toolspkg)
dh_compress -p$(toolspkg)
dh_fixperms -p$(toolspkg)
dh_shlibdeps -p$(toolspkg)
dh_installdeb -p$(toolspkg)
$(lockme) dh_gencontrol -p$(toolspkg)
dh_md5sums -p$(toolspkg)
dh_builddeb -p$(toolspkg)
endif
binary-debs: binary-perarch $(addprefix binary-,$(flavours))
@echo Debug: $@
build-arch-deps-$(do_flavour_image_package) += $(addprefix $(stampdir)/stamp-build-,$(flavours))
build-arch: $(build-arch-deps-true)
@echo Debug: $@
ifeq ($(AUTOBUILD),)
binary-arch-deps-$(do_flavour_image_package) += binary-udebs
else
binary-arch-deps-$(do_flavour_image_package) = binary-debs
endif
binary-arch-deps-$(do_libc_dev_package) += binary-arch-headers
ifneq ($(do_common_headers_indep),true)
binary-arch-deps-$(do_flavour_header_package) += binary-headers
endif
binary-arch: $(binary-arch-deps-true)
@echo Debug: $@
build-indep:
@echo Debug: $@
docpkg = $(doc_pkg_name)
docdir = $(CURDIR)/debian/$(docpkg)/usr/share/doc/$(docpkg)
install-doc: install-headers
@echo Debug: $@
ifeq ($(do_doc_package),true)
dh_testdir
dh_testroot
dh_clean -k -p$(docpkg)
install -d $(docdir)
ifeq ($(do_doc_package_content),true)
# First the html docs. We skip these for autobuilds
if [ -z "$(AUTOBUILD)" ]; then \
install -d $(docdir)/$(doc_pkg_name)-tmp; \
$(kmake) O=$(docdir)/$(doc_pkg_name)-tmp htmldocs; \
mv $(docdir)/$(doc_pkg_name)-tmp/Documentation/DocBook \
$(docdir)/html; \
rm -rf $(docdir)/$(doc_pkg_name)-tmp; \
fi
endif
# Copy the rest
cp -a Documentation/* $(docdir)
rm -rf $(docdir)/DocBook
find $(docdir) -name .gitignore | xargs rm -f
endif
indep_hdrpkg = $(hdrs_pkg_name)
indep_hdrdir = $(CURDIR)/debian/$(indep_hdrpkg)/usr/src/$(indep_hdrpkg)
install-headers:
@echo Debug: $@
ifeq ($(do_flavour_header_package),true)
dh_testdir
dh_testroot
dh_clean -k -p$(indep_hdrpkg)
install -d $(indep_hdrdir)
find . -path './debian' -prune -o -path './$(DEBIAN)' -prune \
-o -path './include/*' -prune \
-o -path './scripts/*' -prune -o -type f \
\( -name 'Makefile*' -o -name 'Kconfig*' -o -name 'Kbuild*' -o \
-name '*.sh' -o -name '*.pl' -o -name '*.lds' \) \
-print | cpio -pd --preserve-modification-time $(indep_hdrdir)
cp -a drivers/media/dvb/dvb-core/*.h $(indep_hdrdir)/drivers/media/dvb/dvb-core
cp -a drivers/media/video/*.h $(indep_hdrdir)/drivers/media/video
cp -a drivers/media/dvb/frontends/*.h $(indep_hdrdir)/drivers/media/dvb/frontends
cp -a scripts include $(indep_hdrdir)
(find arch -name include -type d -print | \
xargs -n1 -i: find : -type f) | \
cpio -pd --preserve-modification-time $(indep_hdrdir)
endif
srcpkg = $(src_pkg_name)-source-$(release)
srcdir = $(CURDIR)/debian/$(srcpkg)/usr/src/$(srcpkg)
balldir = $(CURDIR)/debian/$(srcpkg)/usr/src/$(srcpkg)/$(srcpkg)
install-source: install-doc
@echo Debug: $@
ifeq ($(do_source_package),true)
dh_testdir
dh_testroot
dh_clean -k -p$(srcpkg)
install -d $(srcdir)
ifeq ($(do_source_package_content),true)
find . -path './debian' -prune -o -path './$(DEBIAN)' -prune -o \
-path './.*' -prune -o -print | \
cpio -pd --preserve-modification-time $(balldir)
(cd $(srcdir); tar cf - $(srcpkg)) | bzip2 -9c > \
$(srcdir)/$(srcpkg).tar.bz2
rm -rf $(balldir)
find './debian' './$(DEBIAN)' \
-path './debian/linux-*' -prune -o \
-path './debian/$(src_pkg_name)-*' -prune -o \
-path './debian/build' -prune -o \
-path './debian/files' -prune -o \
-path './debian/stamps' -prune -o \
-path './debian/tmp' -prune -o \
-print | \
cpio -pd --preserve-modification-time $(srcdir)
ln -s $(srcpkg)/$(srcpkg).tar.bz2 $(srcdir)/..
endif
endif
install-tools: toolspkg = $(tools_common_pkg_name)
install-tools: toolsbin = $(CURDIR)/debian/$(toolspkg)/usr/bin
install-tools: toolssbin = $(CURDIR)/debian/$(toolspkg)/usr/sbin
install-tools: toolsman = $(CURDIR)/debian/$(toolspkg)/usr/share/man
install-tools: install-source $(stampdir)/stamp-build-perarch
@echo Debug: $@
ifeq ($(do_tools),true)
dh_testdir
dh_testroot
dh_clean -k -p$(toolspkg)
install -d $(toolsbin)
install -d $(toolsman)/man1
install -m755 debian/tools/perf $(toolsbin)/perf
if [ "$(arch)" = "amd64" ] || [ "$(arch)" = "i386" ]; then \
install -m755 debian/tools/x86_energy_perf_policy $(toolsbin)/x86_energy_perf_policy; \
install -m755 debian/tools/turbostat $(toolsbin)/turbostat; \
if [ "$(do_hyperv)" = "true" ]; then \
install -d $(toolssbin) ; \
install -m755 debian/tools/generic $(toolssbin)/hv_kvp_daemon; \
fi; \
fi
rm -rf $(builddir)/tools
install -d $(builddir)/tools
for i in *; do ln -s $(CURDIR)/$$i $(builddir)/tools/; done
rm $(builddir)/tools/tools
rsync -a tools/ $(builddir)/tools/tools/
cd $(builddir)/tools/tools/perf && make man
install -m644 $(builddir)/tools/tools/perf/Documentation/*.1 \
$(toolsman)/man1
if [ "$(arch)" = "amd64" ] || [ "$(arch)" = "i386" ]; then \
install -d $(toolsman)/man8; \
install -m644 $(CURDIR)/tools/power/x86/x86_energy_perf_policy/*.8 $(toolsman)/man8; \
install -m644 $(CURDIR)/tools/power/x86/turbostat/*.8 $(toolsman)/man8; \
if [ "$(do_hyperv)" = "true" ]; then \
install -m644 $(CURDIR)/tools/hv/*.8 $(toolsman)/man8; \
fi; \
fi
endif
install-indep: install-tools
@echo Debug: $@
# This is just to make it easy to call manually. Normally done in
# binary-indep target during builds.
binary-headers: install-headers
@echo Debug: $@
dh_testdir
dh_testroot
dh_installchangelogs -p$(indep_hdrpkg)
dh_installdocs -p$(indep_hdrpkg)
dh_compress -p$(indep_hdrpkg)
dh_fixperms -p$(indep_hdrpkg)
dh_installdeb -p$(indep_hdrpkg)
$(lockme) dh_gencontrol -p$(indep_hdrpkg)
dh_md5sums -p$(indep_hdrpkg)
dh_builddeb -p$(indep_hdrpkg)
binary-indep: install-indep
@echo Debug: $@
dh_testdir
dh_testroot
dh_installchangelogs -i
dh_installdocs -i
dh_compress -i
dh_fixperms -i
dh_installdeb -i
$(lockme) dh_gencontrol -i
dh_md5sums -i
dh_builddeb -i
# Check ABI for package against last release (if not same abinum)
abi-check-%: $(stampdir)/stamp-build-%
@echo Debug: $@
install -d $(abidir)
sed -e 's/^\(.\+\)[[:space:]]\+\(.\+\)[[:space:]]\(.\+\)$$/\3 \2 \1/' \
$(builddir)/build-$*/Module.symvers | sort > $(abidir)/$*
@perl -f $(DROOT)/scripts/abi-check "$*" "$(prev_abinum)" "$(abinum)" \
"$(prev_abidir)" "$(abidir)" "$(skipabi)"
# Check the module list against the last release (always)
module-check-%: $(stampdir)/stamp-build-%
@echo Debug: $@
install -d $(abidir)
find $(builddir)/build-$*/ -name \*.ko | \
sed -e 's/.*\/\([^\/]*\)\.ko/\1/' | sort > $(abidir)/$*.modules
@perl -f $(DROOT)/scripts/module-check "$*" \
"$(prev_abidir)" "$(abidir)" $(skipmodule)
checks-%: module-check-% abi-check-%
@echo Debug: $@
# Check the config against the known options list.
config-prepare-check-%: $(stampdir)/stamp-prepare-tree-%
@echo Debug: $@
@perl -f $(DROOT)/scripts/config-check \
$(builddir)/build-$*/.config "$(arch)" "$*" "$(sharedconfdir)" "$(skipconfig)"
# Do udebs if not disabled in the arch-specific makefile
binary-udebs: binary-debs
@echo Debug: $@
ifeq ($(disable_d_i),)
@$(MAKE) --no-print-directory -f $(DROOT)/rules DEBIAN=$(DEBIAN) \
do-binary-udebs
endif
do-binary-udebs: debian/control
@echo Debug: $@
dh_testdir
dh_testroot
# unpack the kernels into a temporary directory
mkdir -p debian/d-i-${arch}
imagelist=$$(cat $(builddir)/kernel-versions | grep ^${arch} | awk '{print $$4}') && \
for i in $$imagelist; do \
dpkg -x $$(ls ../linux-image-$$i\_$(release)-$(revision)_${arch}.deb) \
debian/d-i-${arch}; \
if [ -f ../linux-image-extra-$$i\_$(release)-$(revision)_${arch}.deb ] ; then \
dpkg -x ../linux-image-extra-$$i\_$(release)-$(revision)_${arch}.deb \
debian/d-i-${arch}; \
fi; \
/sbin/depmod -b debian/d-i-${arch} $$i; \
done
# kernel-wedge will error if no modules unless this is touched
touch $(CURDIR)/debian/build/no-modules
touch ignore-dups
export SOURCEDIR=$(CURDIR)/debian/d-i-${arch} && \
cd $(builddir) && \
kernel-wedge install-files && \
kernel-wedge check
# Build just the udebs
dilist=$$(dh_listpackages -s | grep "\-di$$") && \
[ -z "$dilist" ] || \
for i in $$dilist; do \
dh_fixperms -p$$i; \
$(lockme) dh_gencontrol -p$$i; \
dh_builddeb -p$$i; \
done
#!/usr/bin/perl -w
my $flavour = shift;
my $prev_abinum = shift;
my $abinum = shift;
my $prev_abidir = shift;
my $abidir = shift;
my $skipabi = shift;
my $fail_exit = 1;
my $EE = "EE:";
my $errors = 0;
my $abiskip = 0;
my $count;
print "II: Checking ABI for $flavour...\n";
if (-f "$prev_abidir/ignore"
or -f "$prev_abidir/$flavour.ignore" or "$skipabi" eq "true") {
print "WW: Explicitly asked to ignore ABI, running in no-fail mode\n";
$fail_exit = 0;
$abiskip = 1;
$EE = "WW:";
}
if ($prev_abinum != $abinum) {
print "II: Different ABI's, running in no-fail mode\n";
$fail_exit = 0;
$EE = "WW:";
}
if (not -f "$abidir/$flavour" or not -f "$prev_abidir/$flavour") {
print "EE: Previous or current ABI file missing!\n";
print " $abidir/$flavour\n" if not -f "$abidir/$flavour";
print " $prev_abidir/$flavour\n" if not -f "$prev_abidir/$flavour";
# Exit if the ABI files are missing, but return status based on whether
# skip ABI was indicated.
if ("$abiskip" eq "1") {
exit(0);
} else {
exit(1);
}
}
my %symbols;
my %symbols_ignore;
my %modules_ignore;
my %module_syms;
# See if we have any ignores
my $ignore = 0;
print " Reading symbols/modules to ignore...";
for $file ("$prev_abidir/../blacklist", "$prev_abidir/../../perm-blacklist") {
if (-f $file) {
open(IGNORE, "< $file") or
die "Could not open $file";
while (<IGNORE>) {
chomp;
if ($_ =~ m/M: (.*)/) {
$modules_ignore{$1} = 1;
} else {
$symbols_ignore{$_} = 1;
}
$ignore++;
}
close(IGNORE);
}
}
print "read $ignore symbols/modules.\n";
sub is_ignored($$) {
my ($mod, $sym) = @_;
die "Missing module name in is_ignored()" if not defined($mod);
die "Missing symbol name in is_ignored()" if not defined($sym);
if (defined($symbols_ignore{$sym}) or defined($modules_ignore{$mod})) {
return 1;
}
return 0;
}
# Read new syms first
print " Reading new symbols ($abinum)...";
$count = 0;
open(NEW, "< $abidir/$flavour") or
die "Could not open $abidir/$flavour";
while (<NEW>) {
chomp;
m/^(\S+)\s(.+)\s(0x[0-9a-f]+)\s(.+)$/;
$symbols{$4}{'type'} = $1;
$symbols{$4}{'loc'} = $2;
$symbols{$4}{'hash'} = $3;
$module_syms{$2} = 0;
$count++;
}
close(NEW);
print "read $count symbols.\n";
# Now the old symbols, checking for missing ones
print " Reading old symbols ($prev_abinum)...";
$count = 0;
open(OLD, "< $prev_abidir/$flavour") or
die "Could not open $prev_abidir/$flavour";
while (<OLD>) {
chomp;
m/^(\S+)\s(.+)\s(0x[0-9a-f]+)\s(.+)$/;
$symbols{$4}{'old_type'} = $1;
$symbols{$4}{'old_loc'} = $2;
$symbols{$4}{'old_hash'} = $3;
$count++;
}
close(OLD);
print "read $count symbols.\n";
print "II: Checking for missing symbols in new ABI...";
$count = 0;
foreach $sym (keys(%symbols)) {
if (!defined($symbols{$sym}{'type'})) {
print "\n" if not $count;
printf(" MISS : %s%s\n", $sym,
is_ignored($symbols{$sym}{'old_loc'}, $sym) ? " (ignored)" : "");
$count++ if !is_ignored($symbols{$sym}{'old_loc'}, $sym);
}
}
print " " if $count;
print "found $count missing symbols\n";
if ($count) {
print "$EE Symbols gone missing (what did you do!?!)\n";
$errors++;
}
print "II: Checking for new symbols in new ABI...";
$count = 0;
foreach $sym (keys(%symbols)) {
if (!defined($symbols{$sym}{'old_type'})) {
print "\n" if not $count;
print " NEW : $sym\n";
$count++;
}
}
print " " if $count;
print "found $count new symbols\n";
if ($count and $prev_abinum == $abinum) {
print "WW: Found new symbols within same ABI. Not recommended\n";
}
print "II: Checking for changes to ABI...\n";
$count = 0;
my $moved = 0;
my $changed_type = 0;
my $changed_hash = 0;
foreach $sym (keys(%symbols)) {
if (!defined($symbols{$sym}{'old_type'}) or
!defined($symbols{$sym}{'type'})) {
next;
}
# Changes in location don't hurt us, but log it anyway
if ($symbols{$sym}{'loc'} ne $symbols{$sym}{'old_loc'}) {
printf(" MOVE : %-40s : %s => %s\n", $sym, $symbols{$sym}{'old_loc'},
$symbols{$sym}{'loc'});
$moved++;
}
# Changes to export type are only bad if new type isn't
# EXPORT_SYMBOL. Changing things to GPL are bad.
if ($symbols{$sym}{'type'} ne $symbols{$sym}{'old_type'}) {
printf(" TYPE : %-40s : %s => %s%s\n", $sym, $symbols{$sym}{'old_type'}.
$symbols{$sym}{'type'}, is_ignored($symbols{$sym}{'loc'}, $sym)
? " (ignored)" : "");
$changed_type++ if $symbols{$sym}{'type'} ne "EXPORT_SYMBOL"
and !is_ignored($symbols{$sym}{'loc'}, $sym);
}
# Changes to the hash are always bad
if ($symbols{$sym}{'hash'} ne $symbols{$sym}{'old_hash'}) {
printf(" HASH : %-40s : %s => %s%s\n", $sym, $symbols{$sym}{'old_hash'},
$symbols{$sym}{'hash'}, is_ignored($symbols{$sym}{'loc'}, $sym)
? " (ignored)" : "");
$changed_hash++ if !is_ignored($symbols{$sym}{'loc'}, $sym);
$module_syms{$symbols{$sym}{'loc'}}++;
}
}
print "WW: $moved symbols changed location\n" if $moved;
print "$EE $changed_type symbols changed export type and weren't ignored\n" if $changed_type;
print "$EE $changed_hash symbols changed hash and weren't ignored\n" if $changed_hash;
$errors++ if $changed_hash or $changed_type;
if ($changed_hash) {
print "II: Module hash change summary...\n";
foreach $mod (sort { $module_syms{$b} <=> $module_syms{$a} } keys %module_syms) {
next if ! $module_syms{$mod};
printf(" %-40s: %d\n", $mod, $module_syms{$mod});
}
}
print "II: Done\n";
if ($errors) {
exit($fail_exit);
} else {
exit(0);
}
#!/usr/bin/perl
#
# check-config -- check the current config for issues
#
use strict;
my $P = 'check-config';
my $test = -1;
if ($ARGV[0] eq '--test') {
$test = $ARGV[1] + 0;
} elsif ($#ARGV != 4) {
die "Usage: $P <config> <arch> <flavour> <commonconfig> <warn-only>\n";
}
my ($config, $arch, $flavour, $commonconfig, $warn_only) = @ARGV;
my $checks = "$commonconfig/enforce";
my %values = ();
# If we are in overridden then still perform the checks and emit the messages
# but do not return failure. Those items marked FATAL will alway trigger
# failure.
my $fail_exit = 1;
$fail_exit = 0 if ($warn_only eq 'true' || $warn_only eq '1');
my $exit_val = 0;
# Predicate execution engine.
sub pred_first {
my ($rest) = @_;
my $depth = 0;
my $off;
my $char;
my $pred;
for ($off = 0; $off <= length($rest); $off++) {
$char = substr($rest, $off, 1);
if ($char eq '(') {
$depth++;
} elsif ($char eq ')') {
$depth--;
} elsif ($depth == 0 && $char eq '&') {
last;
} elsif ($depth == 0 && $char eq '|') {
last;
}
}
if ($depth > 0) {
die "$P: $rest: missing close parenthesis ')'\n";
} elsif ($depth < 0) {
die "$P: $rest: missing open parenthesis '('\n";
}
($pred, $rest) = (substr($rest, 0, $off), substr($rest, $off + 1));
$pred =~ s/^\s*//;
$pred =~ s/\s*$//;
#print "pred<$pred> rest<$rest> char<$char>\n";
($pred, $rest, $char);
}
sub pred_do {
my ($pred) = @_;
my (@a) = split(' ', $pred);
my $possible;
if ($a[0] eq 'arch') {
die "$P: $pred: malformed -- $pred <arch>\n" if ($#a < 1);
for $possible (@a[1..$#a]) {
#print " *** ARCH<$flavour ?? $possible>\n";
return 1 if ($arch eq $possible);
}
return 0;
} elsif ($a[0] eq 'flavour') {
die "$P: $pred: malformed -- $pred <flavour>\n" if ($#a < 1);
for $possible (@a[1..$#a]) {
#print " *** FLAVOUR<$flavour ?? $a[1]>\n";
return 1 if ($flavour eq $possible);
}
return 0;
} elsif ($a[0] eq 'value') {
die "$P: $pred: malformed -- $pred <name> <val>\n" if ($#a != 2);
#print " *** CHECK<$a[1] $a[2] ?? " . $values{$a[1]} . ">\n";
return ($values{$a[1]} eq $a[2]);
} elsif ($a[0] eq 'exists') {
die "$P: $pred: malformed -- $pred <name>\n" if ($#a != 1);
return (defined $values{$a[1]});
} else {
die "$P: $pred: unknown predicate\n";
}
return 1;
}
sub pred_exec {
my ($rest) = @_;
my $pred;
my $cut = 0;
my $res;
my $sep;
#print "pred_exec<$rest>\n";
($pred, $rest, $sep) = pred_first($rest);
# Leading ! implies inversion.
if ($pred =~ /^\s*!\s*(.*)$/) {
#print " invert<$1>\n";
($cut, $res) = pred_exec($1);
$res = !$res;
# Leading / implies a CUT operation.
} elsif ($pred =~ /^\s*\/\s*(.*)$/) {
#print " cut<$1>\n";
($cut, $res) = pred_exec($1);
$cut = 1;
# Recurse left for complex expressions.
} elsif ($pred =~ /^\s*\((.*)\)\s*$/) {
#print " left<$1>\n";
($cut, $res) = pred_exec($1);
# Check for common syntax issues.
} elsif ($pred eq '') {
if ($sep eq '&' || $sep eq '|') {
die "$P: $pred$rest: malformed binary operator\n";
} else {
die "$P: $pred$rest: syntax error\n";
}
# A predicate, execute it.
} else {
#print " DO<$pred> sep<$sep>\n";
$res = pred_do($pred);
}
#print " pre-return res<$res> sep<$sep>\n";
if ($sep eq '') {
#
# Recurse right for binary operators -- note these are lazy.
} elsif ($sep eq '&' || $sep eq '|') {
#print " right<$rest> ? sep<$sep> res<$res>\n";
if ($rest =~ /^\s*($|\||\&)/) {
die "$P: $pred$rest: malformed binary operator\n";
}
if ($cut == 0 && (($res && $sep eq '&') || (!$res && $sep eq '|'))) {
#print " right<$rest>\n";
($cut, $res) = pred_exec($rest);
}
} else {
die "$P: $pred$rest: malformed predicate\n";
}
#warn " return cut<$cut> res<$res> sep<$sep>\n";
return ($cut, $res);
}
#
# PREDICATE TESTS
#
my $test_total = 1;
my $test_good = 0;
sub pred_test {
my ($pred, $eres, $eerr) = @_;
my ($cut, $res, $err, $fail);
$test_total++;
if ($test != 0 && $test != $test_total - 1) {
return;
}
eval {
($cut, $res) = pred_exec($pred);
};
$err = $@;
chomp($err);
$res = !!$res;
$eres = !!$eres;
$fail = '';
if (defined $eres && $res != $eres) {
$fail = "result missmatch, expected $eres returned $res";
}
if (defined $eerr && $err eq '') {
$fail = "error missmatch, expected '$eerr' returned success";
} elsif (defined $eerr && $err !~ /$eerr/) {
$fail = "error missmatch, expected '$eerr' returned '$err'";
} elsif (!defined $eerr && $err ne '') {
$fail = "error missmatch, expected success returned '$err'";
}
if ($fail eq '') {
$test_good++;
} else {
print "$pred: $test_total: FAIL: $fail\n";
}
#print "TEST<$pred> eres<$eres> eerr<$eerr> res<$res> err<$err>\n";
}
if ($test >= 0) {
$arch = 'MYARCH';
$flavour = 'MYFLAVOUR';
%values = ( 'ENABLED' => 'y', 'DISABLED' => 'n' );
# Errors.
my $eunkn = 'unknown predicate';
my $epred = 'malformed';
my $eclose = 'missing close parenthesis';
my $eopen = 'missing open parenthesis';
my $ebinary = 'malformed binary operator';
# Basic predicate tests.
print "TEST: $test_total: basic predicate tests ...\n";
pred_test('nosuchcommand', undef, $eunkn);
pred_test('arch', undef, $epred);
pred_test('arch MYARCH', 1, undef);
pred_test('arch MYARCH NOTMYARCH', 1, undef);
pred_test('arch NOTMYARCH MYARCH', 1, undef);
pred_test('arch NOTMYARCH NOTMYARCH MYARCH', 1, undef);
pred_test('arch NOTMYARCH MYARCH NOTMYARCH', 1, undef);
pred_test('arch NOTMYARCH', 0, undef);
pred_test('flavour', undef, $epred);
pred_test('flavour MYFLAVOUR', 1, undef);
pred_test('flavour NOTMYFLAVOUR MYFLAVOUR', 1, undef);
pred_test('flavour NOTMYFLAVOUR NOTMYFLAVOUR MYFLAVOUR', 1, undef);
pred_test('flavour NOTMYFLAVOUR MYFLAVOUR NOTMYFLAVOUR', 1, undef);
pred_test('flavour NOTMYFLAVOUR', 0, undef);
pred_test('value', undef, $epred);
pred_test('value ENABLED', undef, $epred);
pred_test('value ENABLED ENABLED ENABLED', undef, $epred);
pred_test('value ENABLED y', 1, undef);
pred_test('value ENABLED n', 0, undef);
pred_test('value DISABLED n', 1, undef);
pred_test('value DISABLED y', 0, undef);
pred_test('exists', undef, $epred);
pred_test('exists ENABLED ENABLED', undef, $epred);
pred_test('exists ENABLED', 1, undef);
pred_test('exists DISABLED', 1, undef);
pred_test('exists MISSING', 0, undef);
print "TEST: $test_total: inversion tests ...\n";
pred_test('!exists ENABLED', 0, undef);
pred_test('!exists MISSING', 1, undef);
pred_test('!!exists ENABLED', 1, undef);
pred_test('!!exists MISSING', 0, undef);
pred_test('!!!exists ENABLED', 0, undef);
pred_test('!!!exists MISSING', 1, undef);
print "TEST: $test_total: parentheses tests ...\n";
pred_test('(exists ENABLED)', 1, undef);
pred_test('((exists ENABLED))', 1, undef);
pred_test('(((exists ENABLED)))', 1, undef);
pred_test('(exists MISSING)', 0, undef);
pred_test('((exists MISSING))', 0, undef);
pred_test('(((exists MISSING)))', 0, undef);
pred_test('(!exists ENABLED)', 0, undef);
pred_test('((!exists ENABLED))', 0, undef);
pred_test('(((!exists ENABLED)))', 0, undef);
pred_test('(!exists MISSING)', 1, undef);
pred_test('((!exists MISSING))', 1, undef);
pred_test('(((!exists MISSING)))', 1, undef);
pred_test('((!(exists ENABLED)))', 0, undef);
pred_test('((!(exists MISSING)))', 1, undef);
pred_test('(!((exists ENABLED)))', 0, undef);
pred_test('(!((exists MISSING)))', 1, undef);
pred_test('!(((exists ENABLED)))', 0, undef);
pred_test('!(((exists MISSING)))', 1, undef);
pred_test('!((!(exists ENABLED)))', 1, undef);
pred_test('!((!(exists MISSING)))', 0, undef);
pred_test('!(!(!(exists ENABLED)))', 0, undef);
pred_test('!(!(!(exists MISSING)))', 1, undef);
pred_test('(', undef, $eclose);
pred_test('()(', undef, $eclose);
pred_test('(())(', undef, $eclose);
pred_test('((()))(', undef, $eclose);
pred_test('(()', undef, $eclose);
pred_test('((())', undef, $eclose);
pred_test('(((()))', undef, $eclose);
pred_test('(()()', undef, $eclose);
pred_test('((())()', undef, $eclose);
pred_test(')', undef, $eopen);
pred_test('())', undef, $eopen);
pred_test('(()))', undef, $eopen);
pred_test('((())))', undef, $eopen);
print "TEST: $test_total: binary and tests ...\n";
pred_test('exists ENABLED &', undef, $ebinary);
pred_test('& exists ENABLED', undef, $ebinary);
pred_test('exists ENABLED & & exists ENABLED', undef, $ebinary);
pred_test('exists MISSING & exists MISSING', 0, undef);
pred_test('exists MISSING & exists ENABLED', 0, undef);
pred_test('exists ENABLED & exists MISSING', 0, undef);
pred_test('exists ENABLED & exists ENABLED', 1, undef);
pred_test('exists MISSING & exists MISSING & exists MISSING', 0, undef);
pred_test('exists MISSING & exists MISSING & exists ENABLED', 0, undef);
pred_test('exists MISSING & exists ENABLED & exists MISSING', 0, undef);
pred_test('exists MISSING & exists ENABLED & exists ENABLED', 0, undef);
pred_test('exists ENABLED & exists MISSING & exists MISSING', 0, undef);
pred_test('exists ENABLED & exists MISSING & exists ENABLED', 0, undef);
pred_test('exists ENABLED & exists ENABLED & exists MISSING', 0, undef);
pred_test('exists ENABLED & exists ENABLED & exists ENABLED', 1, undef);
print "TEST: $test_total: binary or tests ...\n";
pred_test('exists ENABLED |', undef, $ebinary);
pred_test('| exists ENABLED', undef, $ebinary);
pred_test('exists ENABLED | | exists ENABLED', undef, $ebinary);
pred_test('exists MISSING | exists MISSING', 0, undef);
pred_test('exists MISSING | exists ENABLED', 1, undef);
pred_test('exists ENABLED | exists MISSING', 1, undef);
pred_test('exists ENABLED | exists ENABLED', 1, undef);
pred_test('exists MISSING | exists MISSING | exists MISSING', 0, undef);
pred_test('exists MISSING | exists MISSING | exists ENABLED', 1, undef);
pred_test('exists MISSING | exists ENABLED | exists MISSING', 1, undef);
pred_test('exists MISSING | exists ENABLED | exists ENABLED', 1, undef);
pred_test('exists ENABLED | exists MISSING | exists MISSING', 1, undef);
pred_test('exists ENABLED | exists MISSING | exists ENABLED', 1, undef);
pred_test('exists ENABLED | exists ENABLED | exists MISSING', 1, undef);
pred_test('exists ENABLED | exists ENABLED | exists ENABLED', 1, undef);
print "TEST: $test_total: binary or/and combination tests ...\n";
pred_test('exists MISSING | exists MISSING & exists MISSING', 0, undef);
pred_test('exists MISSING | exists MISSING & exists ENABLED', 0, undef);
pred_test('exists MISSING | exists ENABLED & exists MISSING', 0, undef);
pred_test('exists MISSING | exists ENABLED & exists ENABLED', 1, undef);
pred_test('exists ENABLED | exists MISSING & exists MISSING', 1, undef);
pred_test('exists ENABLED | exists MISSING & exists ENABLED', 1, undef);
pred_test('exists ENABLED | exists ENABLED & exists MISSING', 1, undef);
pred_test('exists ENABLED | exists ENABLED & exists ENABLED', 1, undef);
print "TEST: $test_total: binary and/or combination tests ...\n";
pred_test('exists MISSING & exists MISSING | exists MISSING', 0, undef);
pred_test('exists MISSING & exists MISSING | exists ENABLED', 0, undef);
pred_test('exists MISSING & exists ENABLED | exists MISSING', 0, undef);
pred_test('exists MISSING & exists ENABLED | exists ENABLED', 0, undef);
pred_test('exists ENABLED & exists MISSING | exists MISSING', 0, undef);
pred_test('exists ENABLED & exists MISSING | exists ENABLED', 1, undef);
pred_test('exists ENABLED & exists ENABLED | exists MISSING', 1, undef);
pred_test('exists ENABLED & exists ENABLED | exists ENABLED', 1, undef);
print "TEST: $test_total: cut tests ...\n";
pred_test('(arch MYARCH & exists MISSING) | exists ENABLED', 1, undef);
pred_test('(arch MYARCH &/ exists MISSING) | exists ENABLED', 0, undef);
$test_total--;
print "TEST: $test_good/$test_total succeeded\n";
exit $exit_val;
}
# Load up the current configuration values -- FATAL if this fails
print "$P: $config: loading config\n";
open(CONFIG, "<$config") || die "$P: $config: open failed -- $! -- aborting\n";
while (<CONFIG>) {
# Pull out values.
/^#*\s*(CONFIG_\w+)[\s=](.*)$/ or next;
if ($2 eq 'is not set') {
$values{$1} = 'n';
} else {
$values{$1} = $2;
}
}
close(CONFIG);
# FATAL: Check if we have an enforcement list.
my $pass = 0;
my $total = 0;
my $line = '';
print "$P: $checks: loading checks\n";
open(CHECKS, "<$checks") || die "$P: $checks: open failed -- $! -- aborting\n";
while (<CHECKS>) {
/^#/ && next;
chomp;
$line .= $_;
if ($line =~ /\\$/) {
chop($line);
$line .= " ";
next;
}
$line =~ /^\s*$/ && next;
#print "CHECK: <$line>\n";
$total++;
my (undef, $result) = pred_exec($line);
if (!$result) {
print "$P: FAIL: $line\n";
$exit_val = $fail_exit;
} else {
$pass++;
}
$line = '';
}
close(CHECKS);
print "$P: $pass/$total checks passed -- exit $exit_val\n";
exit $exit_val;
#!/bin/bash
. debian/debian.env
vars=$1
. $vars
if [ "$is_sub" = "" ]; then
flavour=$(basename $vars | sed 's/.*\.//')
stub=${DEBIAN}/control.d/flavour-control.stub
else
flavour=$(basename $vars .vars)
stub=${DEBIAN}/sub-flavours/control.stub
fi
cat $stub | grep -v '^#' | sed \
-e "s#FLAVOUR#$flavour#g" \
-e "s#DESC#$desc#g" \
-e "s#ARCH#$arch#g" \
-e "s#SUPPORTED#$supported#g" \
-e "s#TARGET#$target#g" \
-e "s#BOOTLOADER#$bootloader#g" \
-e "s#=PROVIDES=#$provides#g" \
-e "s#=CONFLICTS=#$conflicts#g"
#!/bin/bash -e
. debian/debian.env
hdrdir="$1"
symdir="$2"
flavour="$3"
echo "Symlinking and copying headers for $flavour..."
excludes="( -path ./debian -prune -o -path ./${DEBIAN} -prune -o -path ./.git ) -prune -o"
(
find . $excludes -type f \
\( -name 'Makefile*' -o -name 'Kconfig*' -o -name 'Kbuild*' -o \
-name '*.sh' -o -name '*.pl' -o -name '*.lds' \) -print
find ./include ./scripts -name .gitignore -prune -o -type f -print
find ./include -mindepth 1 -maxdepth 1 $excludes -type d -print
) | (
while read file; do
dir=$file
lastdir=$file
if [ -e "$hdrdir/$file" -o -L "$hdrdir/$file" ]; then
continue
fi
while [ ! -e "$hdrdir/$dir" -a ! -L "$hdrdir/$dir" ]; do
lastdir=$dir
dir=`dirname $dir`
done
# If the last item to exist is a symlink we assume all is good
if [ ! -L "$hdrdir/$dir" ]; then
# Turns things like "./foo" into "../"
deref="`echo -n $lastdir | sed -e 's/^\.//' -e's,/[^/]*,../,g'`"
item="`echo -n $lastdir | sed -e 's/^\.\///'`"
ln -s $deref$symdir/$item $hdrdir/$item
fi
done
)
exit
#!/bin/bash
#
# Find all files in linux-firmware that are new or different since the previous release
# and copy them into the kernel firmware directory. You should only do this on the
# backport branch since it would be redundant on the released kernel. It assumed you've
# unpacked linux-firmware from each release into separate directories.
#
# Example: $0 ~/ubuntu/linux-firmware-precise ~/ubuntu/linux-firmware-quantal
if [ "$1" = "" ] || [ "$2" = "" ] || [ ! -f $1/WHENCE ] || [ ! -f $2/WHENCE ]
then
echo You must supply 2 firmware directories.
exit 1
fi
if [ ! -f debian/debian.env ]
then
echo You must run this script from the root of the repo
exit 1
fi
CDIR=`pwd`
OFW=$1
NFW=$2
cd $NFW
#
# Find all files in $NFW that are new or different from $1
#
(find . -type f | egrep -v "debian|git|LICEN|WHEN|READ|Make|configure" | sed 's;\./;;' | \
while read f
do
if [ ! -f $OFW/$f ]
then
echo $f
elif ! cmp $f $OFW/$f > /dev/null
then
echo $f
fi
done) |\
while read f
do
mkdir -p $CDIR/firmware/`dirname $f`
cp -v $f $CDIR/firmware/`dirname $f`
done
#!/bin/bash
if [ "$#" != "2" ]; then
echo "Usage: $0 <release> <revision>" 1>&2
exit 1
fi
if [ "$DEBIAN" = "" ]; then
. debian/debian.env
fi
ver=$1
revision=$2
abi=$(echo $revision | awk -F. '{print $1}')
verabi=$ver-$abi
verfull=$ver-$revision
WGET="wget --tries=1 --timeout=10 --quiet -c"
abidir="`pwd`/$DEBIAN/abi/$verfull"
tmpdir="`pwd`/abi-tmp-$verfull"
origdir="`pwd`"
fwinfo=$abidir/fwinfo
test -d $tmpdir || mkdir $tmpdir
package_prefixes() {
__package_prefixes="$@"
}
getall() {
arch=$1
shift
mkdir -p $abidir/$arch
for sub in $@; do
if [ -f $abidir/$arch/$sub ]; then
echo "Exists: $sub"
continue
fi
echo -n "Fetching $sub($arch)..."
prefixes=""
filenames=""
cd $tmpdir
for prefix in $__package_prefixes
do
filename=${prefix}-${verabi}-${sub}_${verfull}_${arch}.deb
for r in "${repo_list[@]}"
do
if ! [ -f $filename ]; then
$WGET $r/$filename
fi
if [ -f $filename ]; then
prefixes="$prefixes $prefix"
filenames="$filenames $filename"
break
fi
done
done
if [ "$filenames" != "" ]; then
echo -n "extracting$prefixes..."
for filename in $filenames
do
dpkg-deb --extract $filename tmp
done
find tmp -name "*.ko" | while read f; do
modinfo $f | grep ^firmware >> $fwinfo
done
if [ -f tmp/boot/abi-* ]; then
mv tmp/boot/abi-* $abidir/$arch/$sub
else
echo -n "NO ABI FILE..."
fi
(cd tmp; find lib/modules/$verabi-$sub/kernel -name '*.ko') | \
sed -e 's/.*\/\([^\/]*\)\.ko/\1/' | sort > \
$abidir/$arch/$sub.modules
(
cd tmp;
# Prevent exposing some errors when called by python scripts. SIGPIPE seems to get
# exposed when using the `find ...` form of the command.
ko=$(find lib/modules/$verabi-$sub/kernel \
-name '*.ko' | head -1)
readelf -p .comment "$ko" | awk '
($1 == "[") {
printf("%s", $3);
for (n=4; n<=NF; n++) {
printf(" %s", $n);
}
print ""
}' | sort -u >$abidir/$arch/$sub.compiler
version=`cat $abidir/$arch/$sub.compiler`
echo -n "$version..."
)
rm -rf tmp $filenames
echo "done."
else
echo "FAILED."
fi
cd $origdir
done
}
# MAIN
# Setup abi directory
mkdir -p $abidir
echo $abi > $abidir/abiname
# NOTE: The flavours are hardcoded, because they may have changed from the
# current build.
__package_prefixes="linux-image"
. $DEBIAN/etc/getabis
compilers=`cat $abidir/*/*.compiler | sort -u | wc -l`
if [ "$compilers" != 1 ]; then
echo "WARNING: inconsistant compiler versions detected" 1>&2
fi
sort < $fwinfo | uniq > fwinfo.tmp
mv fwinfo.tmp $fwinfo
rmdir $tmpdir
#!/usr/bin/perl -w
use strict;
use Text::Wrap;
my $kernel_auth = "Upstream Kernel Changes";
my (%map, @reverts);
my $pstate = 1;
my $no_kern_log = 0;
my $print_shas = 0;
my $first_print = 1;
while (@ARGV) {
my $opt = $ARGV[0];
shift;
if ($opt eq "--no-kern-log") {
$no_kern_log = 1;
} elsif ($opt eq "--print-shas") {
$print_shas = 1;
} else {
print STDERR "Unknown options: $opt\n";
exit(1);
}
}
sub check_reverts($) {
my ($entry) = @_;
my ($check);
foreach $check (reverse @reverts) {
my $desc = "Revert \"" . $entry->{'desc'} . "\"";
if ($check->{'desc'} eq $desc) {
@reverts = grep($_->{'desc'} ne $desc, @reverts);
return 1;
}
}
return 0;
}
sub add_entry($) {
my ($entry) = @_;
my $key = $entry->{'author'};
# store description in array, in email->{desc list} map
if (exists $map{$key}) {
# grab ref
my $obj = $map{$key};
# add desc to array
push(@$obj, $entry);
} else {
# create new array, containing 1 item
my @arr = ($entry);
# store ref to array
$map{$key} = \@arr;
}
}
sub shortlog_entry($$$$$) {
my ($name, $desc, $bug, $cve, $commit) = @_;
my $entry;
$desc =~ s#/pub/scm/linux/kernel/git/#/.../#g;
$desc =~ s#\[PATCH\] ##g;
$desc =~ s#^\s*##g;
$desc =~ s# *UBUNTU: ##g;
$entry->{'desc'} = $desc;
if ($bug ne '') {
$entry->{'bugno'} = $bug;
}
$entry->{'cve'} = $cve;
$entry->{'commit'} = $commit;
$entry->{'author'} = $name;
if ($desc =~ /^Revert "/) {
push(@reverts, $entry);
return;
}
return if check_reverts($entry);
add_entry($entry);
}
# sort comparison function
sub by_name($$) {
my ($a, $b) = @_;
uc($a) cmp uc($b);
}
sub shortlog_output {
my ($obj, $key, $entry);
foreach $key (sort by_name keys %map) {
next if $key eq $kernel_auth and $no_kern_log;
print "\n" unless $first_print;
$first_print = 0;
# output author
printf " [ %s ]\n\n", $key;
# output author's 1-line summaries
$obj = $map{$key};
foreach $entry (reverse @$obj) {
print wrap(" * ", " ", $entry->{'desc'}) . "\n";
# For non upstream changes, add other info.
if ($key ne $kernel_auth) {
if ($print_shas) {
print " - GIT-SHA " . $entry->{'commit'} .
"\n";
}
}
if (defined($entry->{'bugno'})) {
print " - LP: #" . $entry->{'bugno'} . "\n";
}
if (defined($entry->{'cve'})) {
print " - " . $entry->{'cve'} . "\n";
}
}
}
}
sub changelog_input {
my ($author, $desc, $commit, $entry, $cve);
while (<STDIN>) {
# get commit
if ($pstate == 1) {
next unless /^commit (.*)/;
$commit = $1;
$pstate++;
}
# get author and email
elsif ($pstate == 2) {
my ($email);
next unless /^[Aa]uthor:?\s*(.*?)\s*<(.*)>/;
$author = $1;
$email = $2;
$desc = undef;
$cve = undef;
# cset author fixups
if (!$author) {
$author = $email;
}
$pstate++;
}
# skip to blank line
elsif ($pstate == 3) {
next unless /^\s*$/;
$pstate++;
}
# skip to non-blank line
elsif ($pstate == 4) {
next unless /^\s*?(.*)/;
my $ignore = 0;
my $do_ignore = 0;
my $bug = undef;
my %bugz = ();
my $k;
# skip lines that are obviously not
# a 1-line cset description
next if /^\s*From: /;
chomp;
$desc = $1;
if ($desc =~ /^ *(Revert "|)UBUNTU:/) {
$do_ignore = 1;
} else {
$do_ignore = 0;
$author = $kernel_auth;
$ignore = 1 if $desc =~ /Merge /;
}
while (<STDIN>) {
$ignore = 1 if ($do_ignore && /^ *Ignore: yes/i);
if (/^ *Bug: *(#|)([0-9#,\s]*)\s*$/i) {
foreach $k (split('(,|\s)\s*(#|)', $2)) {
$bugz{$k} = 1 if (($k ne '') and ($k =~ /[0-9]+/));
}
}
elsif (/^ *BugLink: *http.*:\/\/.*\/([0-9]+)/i) {
$bugz{$1} = 1;
}
elsif (/^ *(CVE-.*)/) {
$cve = $1
}
last if /^commit /;
}
$bug = join(", #", sort keys(%bugz));
if (!$ignore) {
&shortlog_entry($author, $desc, $bug,
$cve, $commit, 0);
}
$pstate = 1;
if ($_ && /^commit (.*)/) {
$commit = $1;
$pstate++;
}
}
else {
die "invalid parse state $pstate";
}
}
foreach $entry (@reverts) {
add_entry($entry);
}
}
&changelog_input;
&shortlog_output;
exit(0);
#!/usr/bin/perl -w
my $debian;
$droot = $ARGV[0] if (defined $ARGV[0]);
$droot = 'debian' if (!defined $droot);
$debian = $ARGV[1] if (defined $ARGV[1]);
$debian = 'debian.master' if (!defined $debian);
system("make -s -f $droot/rules printchanges > $debian/changes");
open(CHANGELOG, "< $debian/changelog") or die "Cannot open changelog";
open(CHANGES, "< $debian/changes") or die "Cannot open new changes";
open(NEW, "> $debian/changelog.new") or die "Cannot open new changelog";
$printed = 0;
while (<CHANGELOG>) {
if (/^ CHANGELOG: /) {
next if $printed;
while (<CHANGES>) {
print NEW;
}
$printed = 1;
} else {
print NEW;
}
}
close(NEW);
close(CHANGES);
close(CHANGELOG);
rename("$debian/changelog.new", "$debian/changelog");
unlink("$debian/changes");
#!/usr/bin/perl
if ($#ARGV != 2) {
warn "Usage: $0 <changelog> <to> <range>\n";
die " $0 debian.master/changelog v3.2.3 v3.2.2..v3.2.3\n";
}
my ($changelog, $to, $range) = @ARGV;
my @changes = ();
push(@changes, "\n");
push(@changes, " [ Upstream Kernel Changes ]\n\n");
push(@changes, " * rebase to $to\n");
open(LOG, "git log '$range'|") || die "$0: git log failed: - $!\n";
while (<LOG>) {
if (m@BugLink: .*launchpad.net/.*/([0-9]+)\s$@) {
push(@changes, " - LP: #$1\n");
}
}
close(LOG);
open(CHANGELOG, "< $changelog") or die "Cannot open changelog";
open(NEW, "> $changelog.new") or die "Cannot open new changelog";
$printed = 3;
while (<CHANGELOG>) {
if (/^ CHANGELOG: /) {
$printed--;
print NEW;
if ($printed == 0) {
print NEW @changes;
}
next;
}
print NEW;
}
close(NEW);
close(CHANGELOG);
rename("$changelog.new", "$changelog");
#!/usr/bin/perl
if ($#ARGV != 2) {
die "Usage: $0 <changelog> <stop at> <start at>\n";
}
my ($changelog, $end, $start) = @ARGV;
$end =~ s/.*\.//;
$start =~ s/.*\.//;
my @changes = ();
my $output = 0;
open(CHG, "<debian.master/changelog") ||
open(CHG, "<debian/changelog") ||
die "$0: debian/changelog: open failed - $!\n";
while (<CHG>) {
if (/^\S+\s+\((.*\.(\d+))\)/) {
if ($2 <= $end) {
last;
}
if ($2 == $start) {
$output = 1;
}
if ($output) {
push(@changes, "\n [ Ubuntu: $1 ]\n\n");
next;
}
}
next if ($output == 0);
next if (/^\s*$/);
next if (/^\s--/);
next if (/^\s\s[^\*\s]/);
push(@changes, $_);
}
close(CHG);
open(CHANGELOG, "< $changelog") or die "Cannot open changelog";
open(NEW, "> $changelog.new") or die "Cannot open new changelog";
$printed = 3;
while (<CHANGELOG>) {
if (/^ CHANGELOG: /) {
$printed--;
print NEW;
if ($printed == 0) {
print NEW @changes;
}
next;
}
print NEW;
}
close(NEW);
close(CHANGELOG);
rename("$changelog.new", "$changelog");
#!/bin/bash
. debian/debian.env
# Script to merge all configs and run 'make silentoldconfig' on it to wade out bad juju.
# Then split the configs into distro-commmon and flavour-specific parts
# We have to be in the top level kernel source directory
if [ ! -f MAINTAINERS ] || [ ! -f Makefile ]; then
echo "This does not appear to be the kernel source directory." 1>&2
exit 1
fi
mode=${1:?"Usage: $0 [oldconfig|editconfig]"}
yes=0
case "$mode" in
update*configs) mode='silentoldconfig' ;;
default*configs) mode='oldconfig'; yes=1 ;;
edit*configs) ;; # All is good
gen*configs) mode='genconfigs' ;; # All is good
dump*configs) mode='config'; yes=1 ;;
*) echo "$0 called with invalid mode" 1>&2
exit 1 ;;
esac
kerneldir="`pwd`"
confdir="$kerneldir/${DEBIAN}/config"
sharedconfdir="$kerneldir/debian.master/config"
variant="$2"
. $DEBIAN/etc/kernelconfig
bindir="`pwd`/${DROOT}/scripts/misc"
common_conf="$confdir/config.common.$family"
tmpdir=`mktemp -d`
mkdir "$tmpdir/CONFIGS"
if [ "$mode" = "genconfigs" ]; then
keep=1
mode="oldconfig"
test -d CONFIGS || mkdir CONFIGS
fi
for arch in $archs; do
rm -rf build
mkdir build
# Map debian archs to kernel archs
case "$arch" in
ppc64) kernarch="powerpc" ;;
amd64) kernarch="x86_64" ;;
lpia) kernarch="x86" ;;
sparc) kernarch="sparc64" ;;
armel|armhf) kernarch="arm" ;;
*) kernarch="$arch" ;;
esac
archconfdir=$confdir/$arch
flavourconfigs=$(cd $archconfdir && ls config.flavour.*)
# Merge configs
# We merge config.common.ubuntu + config.common.<arch> +
# config.flavour.<flavour>
for config in $flavourconfigs; do
fullconf="$tmpdir/$arch-$config-full"
case $config in
*)
: >"$fullconf"
if [ -f $common_conf ]; then
cat $common_conf >> "$fullconf"
fi
if [ -f $archconfdir/config.common.$arch ]; then
cat $archconfdir/config.common.$arch >> "$fullconf"
fi
cat "$archconfdir/$config" >>"$fullconf"
if [ -f $confdir/OVERRIDES ]; then
cat $confdir/OVERRIDES >> "$fullconf"
fi
;;
esac
done
for config in $flavourconfigs; do
if [ -f $archconfdir/$config ]; then
fullconf="$tmpdir/$arch-$config-full"
cat "$fullconf" > build/.config
# Call oldconfig or menuconfig
case "$mode" in
editconfigs)
# Interactively edit config parameters
while : ; do
echo -n "Do you want to edit config: $arch/$config? [Y/n] "
read choice
case "$choice" in
y* | Y* | "" )
make O=`pwd`/build ARCH=$kernarch menuconfig
break ;;
n* | N* )
break ;;
*)
echo "Entry not valid"
esac
done
;;
*)
echo "* Run $mode (yes=$yes) on $arch/$config ..."
if [ "$yes" -eq 1 ]; then
yes "" | make O=`pwd`/build ARCH=$kernarch "$mode"
else
make O=`pwd`/build ARCH=$kernarch "$mode"
fi ;;
esac
cat build/.config > $archconfdir/$config
cat build/.config > "$tmpdir/CONFIGS/$arch-$config"
if [ "$keep" = "1" ]; then
cat build/.config > CONFIGS/$arch-$config
fi
else
echo "!! Config not found $archconfdir/$config..."
fi
done
echo "Running splitconfig.pl for $arch"
echo
# Can we make this more robust by avoiding $tmpdir completely?
# This approach was used for now because I didn't want to change
# splitconfig.pl
(cd $archconfdir; $bindir/splitconfig.pl config.flavour.*; mv config.common \
config.common.$arch; cp config.common.$arch $tmpdir)
done
rm -f $common_conf
# Now run splitconfig.pl on all the config.common.<arch> copied to
# $tmpdir
(cd $tmpdir; $bindir/splitconfig.pl *)
(
cd $confdir;
rm -f *-full
grep -v 'is UNMERGABLE' <$tmpdir/config.common >$common_conf
for arch in $archs; do
grep -v 'is UNMERGABLE' <$tmpdir/config.common.$arch \
>$arch/config.common.$arch
done
)
echo ""
echo "Running config-check for all configurations ..."
echo ""
fail=0
for arch in $archs; do
archconfdir=$confdir/$arch
flavourconfigs=$(cd $archconfdir && ls config.flavour.*)
for config in $flavourconfigs; do
flavour="${config##*.}"
if [ -f $archconfdir/$config ]; then
fullconf="$tmpdir/CONFIGS/$arch-$config"
"$bindir/../config-check" "$fullconf" "$arch" "$flavour" "$sharedconfdir" "0" || let "fail=$fail+1"
fi
done
done
if [ "$fail" != 0 ]; then
echo ""
echo "*** ERROR: $fail config-check failures detected"
echo ""
fi
rm -rf build
#!/usr/bin/perl -w
open(TAGS, "git tag -l |") or die "Could not get list of tags";
@tags = <TAGS>;
close(TAGS);
open(LOGS, "git log --pretty=short |") or die "ERROR: Calling git log";
my $commit = "";
while (<LOGS>) {
my $origtag;
if (m|^commit (.*)$|) {
$commit = $1;
next;
}
m|\s*UBUNTU: (Ubuntu-2\.6\..*)| or next;
$tag = $1;
($origtag) = grep(/^$tag.orig$/, @tags);
if (!defined($origtag)) {
print "I: Adding original tag for $tag\n";
system("git tag -m $tag $tag.orig $tag");
}
print "I: Tagging $tag => $commit\n";
system("git tag -f -m $tag $tag $commit");
}
close(LOGS);
#!/usr/bin/perl -w
%allconfigs = ();
%common = ();
print "Reading config's ...\n";
for $config (@ARGV) {
# Only config.*
next if $config !~ /^config\..*/;
# Nothing that is disabled, or remnant
next if $config =~ /.*\.(default|disabled|stub)$/;
%{$allconfigs{$config}} = ();
print " processing $config ... ";
open(CONFIG, "< $config");
while (<CONFIG>) {
# Skip comments
/^#*\s*CONFIG_(\w+)[\s=](.*)$/ or next;
${$allconfigs{$config}}{$1} = $2;
$common{$1} = $2;
}
close(CONFIG);
print "done.\n";
}
print "\n";
print "Merging lists ... \n";
# %options - pointer to flavour config inside the allconfigs array
for $config (keys(%allconfigs)) {
my %options = %{$allconfigs{$config}};
print " processing $config ... ";
for $key (keys(%common)) {
next if not defined $common{$key};
# If we don't have the common option, then it isn't
# common. If we do have that option, it must have the same
# value. EXCEPT where this file does not have a value at all
# which may safely be merged with any other value; the value
# will be elided during recombination of the parts.
if (!defined($options{$key})) {
# Its ok really ... let it merge
} elsif (not defined($options{$key})) {
undef $common{$key};
} elsif ($common{$key} ne $options{$key}) {
undef $common{$key};
}
}
print "done.\n";
}
print "\n";
print "Creating common config ... ";
open(COMMON, "> config.common");
print COMMON "#\n# Common config options automatically generated by splitconfig.pl\n#\n";
for $key (sort(keys(%common))) {
if (not defined $common{$key}) {
print COMMON "# CONFIG_$key is UNMERGABLE\n";
} elsif ($common{$key} eq "is not set") {
print COMMON "# CONFIG_$key is not set\n";
} else {
print COMMON "CONFIG_$key=$common{$key}\n";
}
}
close(COMMON);
print "done.\n\n";
print "Creating stub configs ...\n";
for $config (keys(%allconfigs)) {
my %options = %{$allconfigs{$config}};
print " processing $config ... ";
open(STUB, "> $config");
print STUB "#\n# Config options for $config automatically generated by splitconfig.pl\n#\n";
for $key (sort(keys(%options))) {
next if defined $common{$key};
if ($options{$key} =~ /^is /) {
print STUB "# CONFIG_$key $options{$key}\n";
} else {
print STUB "CONFIG_$key=$options{$key}\n";
}
}
close(STUB);
print "done.\n";
}
#!/usr/bin/perl -w
$flavour = shift;
$prev_abidir = shift;
$abidir = shift;
$skipmodule = shift;
print "II: Checking modules for $flavour...";
if (-f "$prev_abidir/ignore.modules"
or -f "$prev_abidir/$flavour.ignore.modules") {
print "explicitly ignoring modules\n";
exit(0);
}
if (not -f "$abidir/$flavour.modules" or not -f
"$prev_abidir/$flavour.modules") {
print "previous or current modules file missing!\n";
print " $abidir/$flavour.modules\n";
print " $prev_abidir/$flavour.modules\n";
if (defined($skipmodule)) {
exit(0);
} else {
exit(1);
}
}
print "\n";
my %modules;
my %modules_ignore;
my $missing = 0;
my $new = 0;
my $errors = 0;
# See if we have any ignores
if (-f "$prev_abidir/../modules.ignore") {
my $ignore = 0;
open(IGNORE, "< $prev_abidir/../modules.ignore") or
die "Could not open $prev_abidir/../modules.ignore";
print " reading modules to ignore...";
while (<IGNORE>) {
chomp;
next if /\s*#/;
$modules_ignore{$_} = 1;
$ignore++;
}
close(IGNORE);
print "read $ignore modules.\n";
}
# Read new modules first
print " reading new modules...";
$new_count = 0;
open(NEW, "< $abidir/$flavour.modules") or
die "Could not open $abidir/$flavour.modules";
while (<NEW>) {
chomp;
$modules{$_} = 1;
$new_count++;
}
close(NEW);
print "read $new_count modules.\n";
# Now the old modules, checking for missing ones
print " reading old modules...";
$old_count = 0;
open(OLD, "< $prev_abidir/$flavour.modules") or
die "Could not open $prev_abidir/$flavour.modules";
while (<OLD>) {
chomp;
if (not defined($modules{$_})) {
print "\n" if not $missing;
$missing++;
if (not defined($modules_ignore{$_})) {
print " MISS: $_\n";
$errors++;
} else {
print " MISS: $_ (ignored)\n";
}
} else {
$modules{$_}++;
}
$old_count++;
}
close(OLD);
# Check for new modules
foreach $mod (keys(%modules)) {
if ($modules{$mod} < 2) {
print "\n" if not $missing and not $new;
print " NEW : $mod\n";
$new++;
}
}
if ($new or $missing) {
print " read $old_count modules : new($new) missing($missing)\n";
} else {
print "read $old_count modules.\n";
}
# Let's see where we stand...
if ($errors) {
if (defined($skipmodule)) {
print "WW: Explicitly asked to ignore failures (probably not good)\n";
} else {
print "EE: Missing modules (start begging for mercy)\n";
exit 1
}
}
if ($new) {
print "II: New modules (you've been busy, wipe the poop off your nose)\n";
} else {
print "II: No new modules (hope you're happy, slacker)\n";
}
print "II: Done\n";
exit(0);
#!/bin/bash
#
# Build a new directory of modules based on an inclusion list.
# The includsion list format must be a bash regular expression.
#
# usage: $0 ROOT INCLUSION_LIST
# example: $0 debian/build/build-virtual \
# debian/build/build-virtual-ALL debian/build/build-virtual \
# debian.master/control.d/virtual.inclusion-list
master=0
if [ "$1" = "--master" ]; then
master=1
shift
fi
ROOT=$1
NROOT=$2
ILIST=$3
#
# Prep a destination directory.
#
mkdir -p ${NROOT}
# Copy over the framework...
if [ "$master" -eq 1 ]; then
(cd ${ROOT}; find . ! -name "*.ko" -type f) | \
while read f
do
mkdir -p ${NROOT}/`dirname $f`
mv ${ROOT}/$f ${NROOT}/$f
done
fi
cat ${ILIST} |while read i
do
#
# 'find' blurts a warning if it cannot find any ko files.
#
if echo "$i" | grep '\*' > /dev/null
then
(cd ${ROOT}; eval find "${i}" -name "*.ko") |while read f
do
mkdir -p ${NROOT}/`dirname $f`
mv ${ROOT}/$f ${NROOT}/$f
done
else
if [ -f "${ROOT}/$i" ]
then
mkdir -p ${NROOT}/`dirname $i`
mv ${ROOT}/$i ${NROOT}/$i
else
echo Warning: Could not find ${ROOT}/$i
fi
fi
done
exit 0
#!/bin/bash
. debian/debian.env
echo "SUB_PROCESS $FROM => $TO"
export from_pkg="linux-image-$ABI_RELEASE-$FROM"
export to_pkg="linux-image-$ABI_RELEASE-$TO"
from_moddir="debian/$from_pkg/lib/modules/$ABI_RELEASE-$FROM"
to_moddir="debian/$to_pkg/lib/modules/$ABI_RELEASE-$FROM"
install -d "debian/$to_pkg/boot"
install -m644 debian/$from_pkg/boot/config-$ABI_RELEASE-$FROM \
debian/$to_pkg/boot/
install -m600 debian/$from_pkg/boot/{vmlinuz,System.map}-$ABI_RELEASE-$FROM \
debian/$to_pkg/boot/
#
# Print some warnings if there are files in the sub-flavours list
# that do not actually exist.
#
cat ${DEBIAN}/sub-flavours/$TO.list | while read line
do
(
cd debian/$from_pkg/lib/modules/$ABI_RELEASE-$FROM/kernel;
#
# If its a wildcard, then check that there are files that match.
#
if echo "$line" | grep '\*' > /dev/null
then
if [ `eval find "$line" -name '*.ko' 2>/dev/null|wc -l` -lt 1 ]
then
echo SUB_INST Warning - No files in $line
fi
#
# Else it should be a single file reference.
#
elif [ ! -f "$line" ]
then
echo SUB_INST Warning - could not find "$line"
fi
)
done
cat ${DEBIAN}/sub-flavours/$TO.list | while read line; do
(
cd debian/$from_pkg/lib/modules/$ABI_RELEASE-$FROM/kernel;
if echo "$line" | grep '\*' > /dev/null
then
eval find "$line" -name '*.ko' 2>/dev/null || true
elif [ -f "$line" ]
then
echo "$line"
fi
);
done | while read mod; do
echo "SUB_INST checking: $mod"
fromdir="/lib/modules/$ABI_RELEASE-$FROM/"
egrep "^($fromdir)?kernel/$mod:" \
$from_moddir/modules.dep | sed -e "s|^$fromdir||" -e 's/://' -e 's/ /\n/g' | \
while read m; do
m="${fromdir}$m"
test -f debian/$to_pkg/$m && continue
echo "SUB_INST installing: $m"
install -D -m644 debian/$from_pkg/$m \
debian/$to_pkg/$m
done
done
Scripts placed in this directory get called one at a time by run-parts(8).
The scripts are expected to perform some sort of sanity checks on the
finished build. Scripts will be called once for each flavour.
Some environment variables are exported to make life a little easier:
DPKG_ARCH : The dpkg architecture (e.g. "amd64")
KERN_ARCH : The kernel architecture (e.g. "x86_64")
FLAVOUR : The specific flavour for this run (e.g. "generic")
VERSION : The full version of this build (e.g. 2.6.22-1)
REVISION : The exact revision of this build (e.g. 1.3)
PREV_REVISION : The revision prior to this one
ABI_NUM : The specific ABI number for this build (e.g. 2)
PREV_ABI_NUM : The previous ABI number. Can be the same as ABI_NUM.
BUILD_DIR : The directory where this build took place
INSTALL_DIR : The directory where the package is prepared
SOURCE_DIR : Where the main kernel source is
Scripts are expected to have a zero exit status when no problems occur,
and non-zero when an error occurs that should stop the build. Scripts
should print whatever info they deem needed to deduce the problem.
#!/usr/bin/perl -w
my %map;
print "Checking for dupe aliases in $ENV{'FLAVOUR'}...\n";
$aliases =
"$ENV{'INSTALL_DIR'}/lib/modules/$ENV{'VERSION'}-$ENV{'FLAVOUR'}/modules.alias";
open(ALIASES, "< $aliases") or die "Could not open $aliases";
while (<ALIASES>) {
chomp;
my ($junk, $alias, $module) = split;
if (defined($map{$alias})) {
printf("%s %20s / %-20s : %s \n", ("$map{$alias}" eq "$module")
? "INT" : " ", $map{$alias}, $module, $alias);
} else {
$map{$alias} = $module;
}
}
exit(0);
#!/bin/bash
full_version=`uname -r`
# Removing flavour from version i.e. generic or server.
flavour_abi=${full_version#*-}
flavour=${flavour_abi#*-}
version=${full_version%-$flavour}
this="$0_$version"
if [ ! -f "$this" ]; then
echo "$this not found" >&2
echo "You may need to install linux-tools-$version" >&2
exit 2
fi
exec "$this" "$@"
#!/bin/bash
full_version=`uname -r`
# Removing flavour from version i.e. generic or server.
flavour_abi=${full_version#*-}
flavour=${flavour_abi#*-}
version=${full_version%-$flavour}
perf="perf_$version"
if ! which "$perf" > /dev/null; then
echo "$perf not found" >&2
echo "You may need to install linux-tools-$version" >&2
exit 2
fi
exec "$perf" "$@"
#!/bin/bash
full_version=`uname -r`
# Removing flavour from version i.e. generic or server.
flavour_abi=${full_version#*-}
flavour=${flavour_abi#*-}
version=${full_version%-$flavour}
turbostat="turbostat_$version"
if ! which "$turbostat" > /dev/null; then
echo "$turbostat not found" >&2
echo "You may need to install linux-tools-$version" >&2
exit 2
fi
exec "$turbostat" "$@"
#!/bin/bash
full_version=`uname -r`
# Removing flavour from version i.e. generic or server.
flavour_abi=${full_version#*-}
flavour=${flavour_abi#*-}
version=${full_version%-$flavour}
x86_energy_perf_policy="x86_energy_perf_policy_$version"
if ! which "$x86_energy_perf_policy" > /dev/null; then
echo "$x86_energy_perf_policy not found" >&2
echo "You may need to install linux-tools-$version" >&2
exit 2
fi
exec "$x86_energy_perf_policy" "$@"
This is the list of patches/features which have been temporarily
reverted or disabled for Q:
UBUNTU: SAUCE: AppArmor: basic networking rules
#!/bin/bash
F=$1
if [ "$F" = "" ]
then
echo You must supply a firmware file.
exit 1
fi
echo "unsigned char d[] = {" > $F.c
hexdump -v -e '"\t" 8/1 "0x%02x, " "\n"' $F >> $F.c
echo "};" >> $F.c
gcc -c $F.c
objcopy -Oihex $F.o $F.ihex
menu "Ubuntu Supplied Third-Party Device Drivers"
#
# NOTE: to allow drivers to be added and removed without causing merge
# collisions you should add new entries in the middle of the six lines
# of ## at the bottom of the list. Always add three lines of ## above
# your new entry and maintain the six lines below.
#
##
##
##
##
##
##
endmenu
#
# Makefile for the Linux kernel ubuntu supplied third-party device drivers.
#
#
# NOTE: to allow drivers to be added and removed without causing merge
# collisions you should add new entries in the middle of the six lines
# of ## at the bottom of the list. Always add three lines of ## above
# your new entry and maintain the six lines below.
#
##
##
##
##
##
##
# This is a stupid trick to get kbuild to create ubuntu/built-in.o
obj- += foo.o
Only use this directory for things which need to share their headers with
other parts of the kernel or other modules in ubuntu/
Otherwise, keep them local to the module directory.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment