#!/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(<DATA>) {
		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 = <<EOF;
PRGNAM="$package"
VERSION="$version"
HOMEPAGE="$homepage"
DOWNLOAD="$url"
MD5SUM="$md5"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES=""
MAINTAINER="$name"
EMAIL="$email"
EOF
print $content;
print $f $content;
close $f;

__DATA__
#!/bin/sh

# Slackware build script for __PRGNAM__

# Written by __NAME__ (__EMAIL__)

# Licensed under the WTFPL. See http://www.wtfpl.net/txt/copying/ for details.

PRGNAM=__PRGNAM__
VERSION=${VERSION:-__VERSION__}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}

if [ -z "$ARCH" ]; then
  case "$( uname -m )" in
    i?86) ARCH=i586 ;;
    arm*) ARCH=arm ;;
       *) ARCH=$( uname -m ) ;;
  esac
fi

CWD=$(pwd)
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}

if [ "$ARCH" = "i586" ]; then
  SLKCFLAGS="-O2 -march=i586 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
  SLKCFLAGS="-O2 -march=i686 -mtune=i686"
  LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
  SLKCFLAGS="-O2 -fPIC"
  LIBDIRSUFFIX="64"
else
  SLKCFLAGS="-O2"
  LIBDIRSUFFIX=""
fi

set -e

rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
__EXTRACT__
cd $PRGNAM-$VERSION
chown -R root:root .
find -L .  -perm /111 -a \! -perm 755 -a -exec chmod 755 {} \+ -o \
        \! -perm /111 -a \! -perm 644 -a -exec chmod 644 {} \+

__BUILD__
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
  | cut -f 1 -d : | xargs strip --strip-unneeded 2> /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 <documentation> \
  $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}