my $basedir='@datadir@/lufs';
-$basedir=~s#\$\Q{prefix}\E#@prefix@#g;
+my $vardir='@localstatedir@/lib/lufs';
+$basedir=~s#\$\Q{prefix}\E#'@prefix@';#ge;
+$vardir=~s#\$\Q{prefix}\E#'@prefix@';#ge;
sub srcdir { my($uname_r)=@_; $basedir."/".($uname_r lt "2.5" ? "2.4" : "2.5"); }
my $modbindir=$basedir."/modbin";
my @sources=qw(proc.c inode.c dir.c file.c symlink.c);
my $quiet;
my $kernel;
my $prebuild;
-die if !GetOptions(
- "q|quiet",\$quiet,
- "kernel",\$kernel, # it must contain "include" subdir
- "modbindir=s",\$modbindir,
- "basedir=s",\$basedir,
- "prebuild",\&prebuild,
- );
-
+my $kernel_gcc_args="";
my $lufsmnt_bin;
if ($0 eq "lufsmnt" || $0=~m#/lufsmnt$#) {
$quiet=1;
- $lufsmnt_bin='@modbindir@/lufsmnt-bin';
+ $lufsmnt_bin='@bindir@/lufsmnt-bin';
+ }
+else {
+ die if !GetOptions(
+ "q|quiet",\$quiet,
+ "kernel",\$kernel, # it must contain "include" subdir
+ "modbindir=s",\$modbindir,
+ "basedir=s",\$basedir,
+ "prebuild",\&prebuild,
+ "kernel-gcc-args=s",\$kernel_gcc_args,
+ );
}
_pass if $filesystems=~/\blufs$/m;
my $modules=_readfile "/proc/modules"; # 'lufs' may be already loaded
_pass if $modules=~/^lufs\b/m;
-_pass if !_system "modprobe lufs";
+_pass if !_system "modprobe lufs 2>/dev/null";
my $proc_version=_readfile "/proc/version";
my $uname_r=($proc_version=~/^Linux version (\S+)/)[0] || _readfile "uname -r|";
my $moduledir="/lib/modules/$uname_r/kernel/fs/lufs";
print STDERR "Destination module directory: $moduledir\n" if !$quiet;
-_system "mkdir -p $moduledir" and confess "Cannot create moduledir: $moduledir";
-_pass 1 if build($kernel,$uname_r,"$moduledir/lufs.o");
+for ("$vardir/lufs.o") {
+ # 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 "rm -rf $moduledir; mkdir -p $moduledir; ln -s $_ $moduledir/lufs.o";
+ _pass 1;
+ }
+ }
local $_;
while (<$modbindir/*.o>) {
.($quiet ? " 2>/dev/null" : "")
." -O2 -pipe -fomit-frame-pointer -fno-strict-aliasing -mpreferred-stack-boundary=2 -Wall"
." -D__KERNEL__ -DMODULE -DLINUX -DKBUILD_MODNAME=lufs"
+ ." ".$kernel_gcc_args
." -I$kernel/include"
." -I$kernel/include/asm-i386/mach-default"; # gcc should not care if this 2.5 dir does not exist
|| (!$config && !$autoconf); # assume modversions if not known
my @objects=map({ my $o=$_; $o=~s/[.]c$/.o/; $o; } @sources);
- return !_system "set -e; mkdir -p `dirname $destmodule`;"
+ return !_system "set -e; mkdir -p `dirname $destmodule`; rm -f $destmodule;"
+ .(!$vardir ? "" : " cd $vardir;")
." $cmdline -c ".join(" ",map({ srcdir($uname_r)."/".$_; } @sources)).";"
." ld -r -o $destmodule ".join(" ",@objects).";"
." rm -f ".join(" ",@objects);
sub prebuild
{
+ $vardir=undef(); # we may not yet have /var/lib/lufs
for (@ARGV) {
do { prebuild_rpm $_; next; } if /[.]rpm$/;
do { prebuild_dir $_; next; } if -d $_;