#!/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 \ --disable-static \ --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 'meson' => <<'EOF', mkdir build cd build CFLAGS="$SLKCFLAGS" \ CXXFLAGS="$SLKCFLAGS" \ meson .. \ --buildtype=release \ --infodir=/usr/info \ --libdir=/usr/lib${LIBDIRSUFFIX} \ --localstatedir=/var \ --mandir=/usr/man \ --prefix=/usr \ --sysconfdir=/etc \ -Dstrip=true "${NINJA:=ninja}" DESTDIR=$PKG $NINJA install cd .. 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; } elsif(/\bmeson\.build$/) { $cmd = $buildcmds{meson}; last; } } close $f; return $cmd; } sub check_github_disposition { my $url = shift; my $filename = shift; my $disposition; warn "Checking github Content-Disposition header\n"; open my $fh, "wget --quiet --save-headers -O- $url|"; while(<$fh>) { s/\r//; if(/^Content-Disposition:\s*attachment;\s*filename=(.*)$/i) { $disposition = $1; last; } last if /^$/; } close $fh; if(not defined $disposition) { die "!!! Got no Content-Disposition header from github!\n"; } elsif($filename eq $disposition) { warn "=== URL filename matches Content-Disposition filename, good.\n"; } else { die "!!! Content-Disposition filename mismatch:\n!!! local: $filename\n!!! remote: $disposition\n"; } } sub fix_github_url { my $u = shift; return $u unless ($u =~ m,https?://github.com/([^/]+)/([^/]+)/archive/([^/]+)(\.(?:tar.gz|zip))$,); my $user = $1; my $proj = $2; my $aversion = $3; my $pversion = $3; my $ext = $4; warn "Converting short-form github URL to long form\n"; $pversion =~ s/^v//; # maybe other letters? my $filename = "$proj-$pversion$ext"; $u = "https://github.com/$user/$proj/archive/$aversion/$proj-$pversion$ext"; check_github_disposition($u, $filename); warn "=== Rewrote github URL as: $url\n"; return $u; } ### main() $url = shift || &usage; # Take package name from the current dir chomp ($package = `pwd`); $package =~ s,.*/,,; $url = fix_github_url($url); # 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