#!/usr/bin/perl -w # Create a SBo compliant .info file # (and a .SlackBuild from a template, if one doesn't already exist, # and a slack-desc if a README exists) ($SELF = $0) =~ s,.*/,,; # Fill in your name and email address here: $name = $ENV{SBO_NAME} || die "$SELF: please source ~/.sbostuff.cfg"; $email = $ENV{SBO_EMAIL} || die "$SELF: please source ~/.sbostuff.cfg"; use LWP::Simple; use Digest::MD5 'md5_hex'; sub usage { die "usage: $SELF url [homepage] [version]\n"; } sub get_build_command { %buildcmds = ( 'autoconf' => <<'EOF', CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ ./configure \ --prefix=/usr \ --libdir=/usr/lib${LIBDIRSUFFIX} \ --sysconfdir=/etc \ --localstatedir=/var \ --mandir=/usr/man \ --docdir=/usr/doc/$PRGNAM-$VERSION \ --build=$ARCH-slackware-linux make make install-strip DESTDIR=$PKG EOF 'cmake' => <<'EOF', mkdir -p build cd build cmake \ -DCMAKE_C_FLAGS:STRING="$SLKCFLAGS" \ -DCMAKE_CXX_FLAGS:STRING="$SLKCFLAGS" \ -DCMAKE_INSTALL_PREFIX=/usr \ -DLIB_SUFFIX=${LIBDIRSUFFIX} \ -DMAN_INSTALL_DIR=/usr/man \ -DCMAKE_BUILD_TYPE=Release .. make make install DESTDIR=$PKG cd .. EOF 'python' => <<'EOF', python setup.py install --root=$PKG EOF 'perl' => <<'EOF', perl Makefile.PL \ PREFIX=/usr \ INSTALLDIRS=vendor \ INSTALLVENDORMAN3DIR=/usr/man/man3 make make test make install DESTDIR=$PKG EOF ); my $cmd = $buildcmds{autoconf}; my ($file, $tar) = @_; # if it ain't a tar file, just return the default return $cmd unless $tar; open my $f, "tar tf $file |" or return $cmd; while(<$f>) { chomp; # look only at the 2nd level dir (e.g. foo-1.2.3/configure.ac) next if m,.*/.*/,; #warn "looking at file $_\n"; if(/^\bconfigure\.(ac|in)$/) { $cmd = $buildcmds{autoconf}; last; } elsif(/\bCMakeLists\.txt$/) { $cmd = $buildcmds{cmake}; last; } elsif(/\bsetup\.py$/) { $cmd = $buildcmds{python}; last; } elsif(/\bMakefile\.PL$/) { $cmd = $buildcmds{perl}; last; } } close $f; return $cmd; } $url = shift || &usage; # Take package name from the current dir chomp ($package = `pwd`); $package =~ s,.*/,,; # Take filename from last part of URL ($file = $url) =~ s,.*/,,; # Generate appropriate extract command if($file =~ /\.zip$/i) { $extract = "unzip \$CWD/\$PRGNAM-\$VERSION.zip"; } elsif($file =~ /\.rar$/i) { $extract = "unrar x \$CWD/\$PRGNAM-\$VERSION.rar"; } elsif($file =~ /\.7z$/i) { $extract = "7za x \$CWD/\$PRGNAM-\$VERSION.rar"; } elsif($file =~ /(\.tar(?:$|\..*)|\.t[bxg]z)/i) { $extract = "tar xvf \$CWD/\$PRGNAM-\$VERSION$1"; $tar = 1; } else { $extract = "EXTRACT"; } $homepage = shift; if(!$homepage) { if($url =~ m{http://downloads.(?:sourceforge|sf).net/([^/]+)/}) { $homepage = "http://sourceforge.net/projects/$1/"; } elsif($url =~ m,https://github\.com/[^/]*/[^/]*/,) { $homepage = $&; } elsif($url =~ m,((?:ht|f)tp://[^/]+/),) { $homepage = $1; } else { die "Can't figure out homepage\n"; } warn "Assuming homepage is $homepage\n"; } $version = shift || 0; if(!$version) { # Try to figure out the version number. The regex is fairly dumb. if($file =~ /-(\d[\d._]+(?:[a-z]+)?)\.(?:tar|t[gzb]z|zip|rar|7z)/) { $version = $1; warn "Version appears to be $version\n"; } else { die "Can't figure out version number\n"; } } print STDERR "Downloading $url..."; if($url =~ /sourceforge\.net/i) { $extra_wget_params = "--user-agent wget"; } else { $extra_wget_params = "--referer='$url'"; } system("wget $extra_wget_params $url"); if(open $f, "<$file") { $md5 = Digest::MD5->new->addfile($f)->hexdigest; close $f; } else { warn "Can't find downloaded file '$file', MD5SUM will be wrong in .info\n"; $md5 = "FIXME"; } if(not -e "$package.SlackBuild") { warn "$package.SlackBuild does not exist, creating from template\n"; $buildcmd = get_build_command($file, $tar); open my $build, ">$package.SlackBuild" or die $!; while() { s/__NAME__/$name/g; s/__EMAIL__/$email/g; s/__PRGNAM__/$package/g; s/__VERSION__/$version/g; s/__EXTRACT__/$extract/g; s/__BUILD__/$buildcmd/g; print $build "$_"; } close $build; chmod 0755, "$package.SlackBuild"; } if((-e "README") && (! -e "slack-desc")) { warn "slack-desc does not exist, creating from existing README\n"; system("mkslackdesc"); } open $f, ">$package.info" or die $!; $content = < /dev/null || true find $PKG/usr/man -type f -exec gzip -9 {} \; for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done rm -f $PKG/usr/info/dir gzip -9 $PKG/usr/info/*.info* find $PKG -name perllocal.pod \ -o -name ".packlist" \ -o -name "*.bs" \ | xargs rm -f mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION cp -a \ $PKG/usr/doc/$PRGNAM-$VERSION cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild mkdir -p $PKG/install cat $CWD/slack-desc > $PKG/install/slack-desc cat $CWD/doinst.sh > $PKG/install/doinst.sh cd $PKG /sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.${PKGTYPE:-tgz}