use vars qw($kernel_gcc_args);
$kernel_gcc_args="";
+sub modext { my($uname_r)=@_; ($uname_r lt "2.5" ? "o" : "ko"); }
+
my $lufsmnt_bin;
if ($0 eq "lufsmnt" || $0=~m#/lufsmnt$#) {
$quiet=1;
my $uname_r_base=($uname_r=~/^([^-]+)/)[0];
print STDERR "Running kernel version: $uname_r (base version $uname_r_base)\n" if !$quiet;
+my $lufs_o="lufs.".modext($uname_r);
+
my $moduledir="/lib/modules/$uname_r$uname_smp/kernel/fs/lufs";
print STDERR "Destination module directory: $moduledir\n" if !$quiet;
"/usr/src/linux-$uname_r",
"/usr/src/linux-$uname_r_base",
"/usr/src/linux",
+ "/usr/src/kernel-source-$uname_r", # no .config?
);
do { $kernel||=$_ if -d $_; } for (@kernel_paths);
if (!$kernel) {
else {
# We need /usr/include/lufs/* for standard package compilation.
# There is no sense to make separate 'devel' package.
- for ("$vardir/lufs.o") {
+ for ("$vardir/$lufs_o") {
next if !$vardir;
# Create the 'lufs.o' in our /var/lib directory and only link it
# to prevent using obsolete modules after upgrading 'lufs' package.
# depmod(1) will take the larget symlink name - we must create directory for it.
if (build($kernel,$uname_r,$_)) {
do { cluck "Failed to symlink $_"; next; }
- if _system "/bin/rm -rf $moduledir; /bin/mkdir -p $moduledir; /bin/ln -s $_ $moduledir/lufs.o";
+ if _system "/bin/rm -rf $moduledir; /bin/mkdir -p $moduledir; /bin/ln -s $_ $moduledir/$lufs_o";
_pass 1;
}
}
}
local $_;
-for (<$modbindir/*-$uname_r*/*.o>,<$modbindir/*-${uname_r_base}*/*.o>,<$modbindir/*/*.o>) {
- next if _system "/sbin/rmmod lufs 2>/dev/null; /sbin/insmod -o lufs -p $_ 2>/dev/null";
+for (<$modbindir/*-$uname_r*/$lufs_o>,<$modbindir/*-${uname_r_base}*/$lufs_o>,<$modbindir/*/$lufs_o>) {
+ # Do not: /sbin/insmod -o lufs -p $_ 2>/dev/null
+ # as 2.6 insmod has no options at all.
+ next if _system "/sbin/rmmod lufs 2>/dev/null; /sbin/insmod $_ 2>/dev/null";
do { cluck "Failed to symlink $_"; next; }
- if _system "/bin/rm -rf $moduledir; /bin/mkdir -p $moduledir; /bin/ln -s $_ $moduledir/lufs.o";
- _pass 1;
+ if _system "/bin/rm -rf $moduledir; /bin/mkdir -p $moduledir; /bin/ln -s $_ $moduledir/$lufs_o";
+ # 0 as already insmod(8)ed.
+ _pass 0;
}
confess "lufs module not loaded: Try running $basedir/prepmod to see more." if $quiet;
-confess "Failed to prepare lufs.o module for your Linux kernel $uname_r.\n"
+confess "Failed to prepare $lufs_o module for your Linux kernel $uname_r.\n"
.($kernel ? "Detected Linux kernel sources \"$kernel\" do not appear to be valid.\n"
: "No Linux kernel sources for your running kernel were found.\n")
."Please install kernel-source-x.y.z.i386.rpm or kernel-headers_x.y.z_i386.deb.\n"
my($kernel,$uname_r,$destmodule,%args)=@_;
print STDERR "Using kernel sources: $kernel\n" if !$quiet;
- confess "Kernel sources $kernel do not contain 'Rules.make' file" if ! -f $kernel."/Rules.make";
+ # 'Rules.make' not present in 2.6+ kernels
+ do { confess "Kernel sources $kernel do not contain '$_' file" if ! -f $_; } for ($kernel."/arch/i386/Makefile");
my $kdebug="";
do { $kdebug=$_ if !/^@/; } for ('@KDEBUG_FLAGS@');
my $predir=srcdir $uname_r;
$predir=$ENV{"PWD"}."/$predir" if $predir!~m#^/#;
- # Do not use existing '$kernel/tmp_include_depends' or '$kernel/.depend'
- # as it may contain non-existing pathnames:
- _system "make -C $kernel dep"
- .($quiet ? ' &>/dev/null' : '')
- if !$args{"nodep"};
# Workaround a bug in at least Red Hat 2.4.18-18.8.0
if (-f "$kernel/include/linux/version.h") {
for ("$kernel/include/linux/modversions.h") {
." SUBDIRS=\"$predir\" modules"
." EXTRA_CFLAGS=\"$kernel_gcc_args\""
.($quiet ? ' &>/dev/null' : '');
- my @objects=map({ my $o=$_; $o=~s/[.]c$/.o/; $o; } @sources);
- return !_system "set -e; /bin/mkdir -p `dirname $destmodule`; /bin/rm -f $destmodule;"
+ my @objects=map({ my $o=$_; $o=~s/[.]c$/.o/; $o; } @sources,"lufs.mod.c","lufs.c");
+ $cmdline="set -e; /bin/mkdir -p `dirname $destmodule`; /bin/rm -f $destmodule;"
." $cmdline;"
- ." /bin/rm -f ".join(" ",map(("$predir/$_","$predir/.$_.flags"),@objects)).";"
- ." /bin/mv -f $predir/lufs.o $destmodule;";
+ ." /bin/rm -f ".join(" ",map(("$predir/$_","$predir/.$_.flags","$predir/.$_.cmd"),@objects),"$predir/lufs.mod.c","$predir/.lufs.ko.cmd").";"
+ ." /bin/mv -f $predir/lufs.".modext($uname_r)." $destmodule;";
+ my $r=!_system $cmdline;
+ return $r if $r;
+ # Rebuild existing '$kernel/tmp_include_depends' or '$kernel/.depend'
+ # as it may contain non-existing pathnames:
+ _system "make -C $kernel dep"
+ .($quiet ? ' &>/dev/null' : '');
+ return !_system $cmdline;
}
my($kernel,$uname_r,$destmodule,%args)=@_;
# Debian uname(1) does not support '-p'.
- my $arch=_readfile "uname -p|" || _readfile "uname -m|";
+ my $arch=_readfile "uname -p 2>/dev/null || true|"
+ || _readfile "uname -m|";
chomp $arch;
my $single_config=-f "$kernel/.config";
if (!$single_config) {
if -f $spec_config;
}
my $r;
- if (-f "$kernel/Rules.make" && -f "$kernel/.config")
+ # 'Rules.make' not present in 2.6+ kernels
+ if (-f $kernel."/arch/i386/Makefile" && -f "$kernel/.config")
{ $r=build_make $kernel,$uname_r,$destmodule,%args; }
else
{ $r=build_gcc $kernel,$uname_r,$destmodule,%args; }
confess "Unrecognized vendor for dir: $dir" if !$vendor;
confess "Unrecognized uname_r for dir: $dir" if !$uname_r;
- confess "Failed to build $dir" if !build $dir,$uname_r,$modbindir."/lufs-$vendor-$uname_r.o",%args;
+ confess "Failed to build $dir" if !build $dir,$uname_r,$modbindir."/lufs-$vendor-$uname_r.".modext($uname_r),%args;
}
$dir or confess "Kernel source tree not found in: $rpm";
_system "cp -p $dir/include/linux/rhconfig.h $dir/include/linux/rhconfig.h-orig"
if -f "$dir/include/linux/rhconfig.h";
- # Do not use existing '$dir/tmp_include_depends' or '$dir/.depend'
- # as it may contain non-existing pathnames:
- _system "make -C $dir dep";
for my $smp ("","smp") {
my @archs=qw(i386 i586 i686 athlon);
for my $arch (@archs) {
next if ! -f $spec_config;
_system "ln -s $spec_config $dir/.config";
}
- prebuild_kernel $dir,$vendor,$uname_r.$smp.".".$arch,"nodep"=>1;
+ prebuild_kernel $dir,$vendor,$uname_r.$smp.".".$arch;
_system "rm -f $dir/.config"
if !$single_config;
}