diff options
-rw-r--r-- | pkgtools/url2pkg/DESCR | 12 | ||||
-rw-r--r-- | pkgtools/url2pkg/Makefile | 37 | ||||
-rw-r--r-- | pkgtools/url2pkg/PLIST | 5 | ||||
-rw-r--r-- | pkgtools/url2pkg/files/MakeMaker.pm | 70 | ||||
-rwxr-xr-x | pkgtools/url2pkg/files/url2pkg | 244 | ||||
-rw-r--r-- | pkgtools/url2pkg/files/url2pkg.8 | 6 | ||||
-rw-r--r-- | pkgtools/url2pkg/files/url2pkg.pl | 431 |
7 files changed, 534 insertions, 271 deletions
diff --git a/pkgtools/url2pkg/DESCR b/pkgtools/url2pkg/DESCR index 68c3939f3e9..c060cd4f35f 100644 --- a/pkgtools/url2pkg/DESCR +++ b/pkgtools/url2pkg/DESCR @@ -1,9 +1,3 @@ -Shellscript that will take an URL of a source .tar.gz (or other) -file, and perform some steps to generate a package: - - - setup a basic Makefile - - run "make fetch" and "make makesum" - - generate a dummy pkg/PLIST - - run "make extract" - - try to find out the WRKSRC (if needed) - - try to find out of this package uses GNU auto-configure +The url2pkg program creates a new pkgsrc package from only the URL of a +distribution file. It is intended to help pkgsrc developers create new +packages quickly and easily. diff --git a/pkgtools/url2pkg/Makefile b/pkgtools/url2pkg/Makefile index 40d3ffe824f..0099f5b3400 100644 --- a/pkgtools/url2pkg/Makefile +++ b/pkgtools/url2pkg/Makefile @@ -1,31 +1,38 @@ -# $NetBSD: Makefile,v 1.43 2006/06/12 17:02:23 reed Exp $ +# $NetBSD: Makefile,v 1.44 2006/10/02 16:49:30 rillig Exp $ # -DISTNAME= url2pkg-1.34 -CATEGORIES= pkgtools sysutils -MASTER_SITES= # Nothing -DISTFILES= # Nothing +DISTNAME= url2pkg-2.0 +CATEGORIES= pkgtools +MASTER_SITES= # none +DISTFILES= # none -MAINTAINER= hubertf@NetBSD.org -HOMEPAGE= # Nothing +MAINTAINER= rillig@NetBSD.org +HOMEPAGE= http://www.NetBSD.org/Documentation/pkgsrc/creating.html COMMENT= Tool to automate initial steps in building a package PKG_INSTALLATION_TYPES= overwrite pkgviews WRKSRC= ${WRKDIR} -EXTRACT_ONLY= # empty NO_CHECKSUM= yes -NO_CONFIGURE= yes -USE_LANGUAGES= # empty +NO_BUILD= yes +USE_LANGUAGES= # none +USE_TOOLS+= perl:run -INSTALLATION_DIRS= bin ${PKGMANDIR}/man8 +INSTALLATION_DIRS= bin ${PKGMANDIR}/man8 lib/url2pkg/ExtUtils -do-build: - ${SED} -e 's|@MAKE@|${MAKE}|g' \ - < ${FILESDIR}/url2pkg > ${WRKSRC}/url2pkg +do-extract: + cp ${FILESDIR}/url2pkg.pl ${WRKSRC}/ + +SUBST_CLASSES+= up +SUBST_STAGE.up= do-configure +SUBST_FILES.up= url2pkg.pl +SUBST_SED.up= -e 's,@MAKE@,'${MAKE:Q}',g' +SUBST_SED.up+= -e 's,@PERL@,${PERL5},g' +SUBST_SED.up+= -e 's,@PERLLIBDIR@,${PREFIX}/lib/url2pkg,g' do-install: - ${INSTALL_SCRIPT} ${WRKSRC}/url2pkg ${PREFIX}/bin/url2pkg + ${INSTALL_SCRIPT} ${WRKSRC}/url2pkg.pl ${PREFIX}/bin/url2pkg ${INSTALL_MAN} ${FILESDIR}/url2pkg.8 ${PREFIX}/${PKGMANDIR}/man8 + ${INSTALL_DATA} ${FILESDIR}/MakeMaker.pm ${PREFIX}/lib/url2pkg/ExtUtils/ .include "../../mk/bsd.pkg.mk" diff --git a/pkgtools/url2pkg/PLIST b/pkgtools/url2pkg/PLIST index ad838824b46..d1749367a14 100644 --- a/pkgtools/url2pkg/PLIST +++ b/pkgtools/url2pkg/PLIST @@ -1,3 +1,6 @@ -@comment $NetBSD: PLIST,v 1.1 2001/10/31 21:19:12 zuntum Exp $ +@comment $NetBSD: PLIST,v 1.2 2006/10/02 16:49:30 rillig Exp $ bin/url2pkg +lib/url2pkg/ExtUtils/MakeMaker.pm man/man8/url2pkg.8 +@dirrm lib/url2pkg/ExtUtils +@dirrm lib/url2pkg diff --git a/pkgtools/url2pkg/files/MakeMaker.pm b/pkgtools/url2pkg/files/MakeMaker.pm new file mode 100644 index 00000000000..7889d50f25e --- /dev/null +++ b/pkgtools/url2pkg/files/MakeMaker.pm @@ -0,0 +1,70 @@ +# -*-perl-*- + +# This is a drop-in replacement for the MakeMaker Perl module. Instead +# of generating a Makefile, it extracts the dependency information for +# other Perl modules. It is used to simplify the generation of pkgsrc +# packages for Perl modules. + +package ExtUtils::MakeMaker; + +use strict; +use warnings; + +BEGIN { + use Exporter; + use vars qw(@ISA @EXPORT); + @ISA = qw(Exporter); + @EXPORT = qw(WriteMakefile); +} + +use constant pkgsrcdir => "../.."; + +# Finds and returns the category a given package lies in. +# If the package does not exist, C<undef> is returned. +# If the package exists more than once, it is unspecified which +# of the categories is returned. +sub find_category($) { + my ($pkg) = @_; + my $retval; + + opendir(D, pkgsrcdir) or die; + foreach my $cat (readdir(D)) { + next if ($cat =~ qr"^\."); + + if (-d (sprintf("%s/%s/%s", pkgsrcdir, $cat, $pkg))) { + $retval = $cat; + } + } + closedir(D); + return $retval; +} + +sub WriteMakefile(%) { + my (%options) = @_; + + if (exists($options{"PREREQ_PM"})) { + my $deps = $options{"PREREQ_PM"}; + + foreach my $dep (sort(keys(%{$deps}))) { + my ($ver, $pkgbase, $category); + + $ver = $deps->{$dep}; + ($pkgbase = "p5-${dep}") =~ s/::/-/g; + $category = find_category($pkgbase); + + if (defined($category)) { + printf("%s>=%s:../../%s/%s\n", $pkgbase, $ver, $category, $pkgbase); + + } else { + # If the package does not exist but the + # Perl module can be loaded, assume that + # no extra dependency is needed. Otherwise fail. + if (!eval(sprintf("use %s %s; 1;", $dep, $ver))) { + die("$0: ERROR: No pkgsrc package found for dependency ${dep}>=${ver}.\n$@\n"); + } + } + } + } +} + +1; diff --git a/pkgtools/url2pkg/files/url2pkg b/pkgtools/url2pkg/files/url2pkg deleted file mode 100755 index d3c6686da55..00000000000 --- a/pkgtools/url2pkg/files/url2pkg +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh -# -# $NetBSD: url2pkg,v 1.38 2006/06/12 17:02:23 reed Exp $ -# -# url2pkg -# (c) 1999-2002 Hubert Feyrer <hubert@feyrer.de> -# - -if [ "$MAKE" = "" ]; then - MAKE=@MAKE@ -fi - -if [ "$PKGEDITOR" != "" ]; then - editor="$PKGEDITOR" -elif [ "$EDITOR" != "" ]; then - editor="$EDITOR" -else - editor="vi" -fi - -if [ "$PKGMAINTAINER" != "" ]; then - email_maintainer="$PKGMAINTAINER" -elif [ "$REPLYTO" != "" ]; then - email_maintainer="$REPLYTO" -else - email_maintainer="INSERT_YOUR_MAIL_ADDRESS_HERE" -fi - -if [ ! -f ../../mk/bsd.pkg.mk ]; then - echo "Run this in .../pkgsrc/foo/bar !" - exit 1 -fi - -if [ ! -f w*/.extract_done ]; then - if [ "$1" = "" ]; then - echo -n 'URL: ' - read url - else - url="$1" - fi - - found=0 - for A in `cat ../../mk/fetch/sites.mk`; do - if [ "`expr "$A" : ".*+="`" -gt 0 ]; then - master_site="`echo $A|cut -f1 -d +`" - fi - if [ ! "${A}" = "\\" ]; then - if [ `expr "$url" : "$A"` -gt 0 ]; then - found=1 - DISTNAME=`expr "$url" : '.*/\([^/?]*\)'` - name=`expr "$url" : "${A}\(.*\)/[^/]*\$"` - MASTER_SITES="\${${master_site}:=${name}/}" - case "${master_site}" in - "MASTER_SITE_SOURCEFORGE") - HOMEPAGE="http://$name.sourceforge.net/" ; ;; - "MASTER_SITE_GNU") - HOMEPAGE="http://www.gnu.org/software/$name/" ; ;; - esac - HOMEPAGE=`expr "$url" : '\(.*/\)[^/]*$'` - break - fi - fi - done - - if [ $found = 0 ]; then - prdownloads="http://prdownloads.sourceforge.net/" - if [ `expr "$url" : "$prdownloads.*"` -gt 0 ]; then - DISTNAME=`expr "$url" : '.*/\([^/?]*\)'` - sfname=`expr "$url" : "${prdownloads}\(.*\)/[^/]*\$"` - MASTER_SITES='${MASTER_SITE_SOURCEFORGE:='"$sfname"'/}' - HOMEPAGE="http://$sfname.sourceforge.net/" - found=1 - fi - fi - - if [ $found = 0 ]; then - DISTNAME=`expr "$url" : '.*/\([^/]*\)$'` - MASTER_SITES=`expr "$url" : '\(.*/\)[^/]*$'` - HOMEPAGE=$MASTER_SITES - fi - - case "$DISTNAME" in - *.tgz) EXTRACT_SUFX=".tgz" - DISTNAME=`expr ${DISTNAME} : '\(.*\)\.[^.]*'` - ;; - *.tar.Z) EXTRACT_SUFX=.tar.Z - DISTNAME=`expr ${DISTNAME} : '\(.*\)\.[^.]*\.[^.]*'` - ;; - *.tar.gz) EXTRACT_SUFX=.tar.gz - DISTNAME=`expr ${DISTNAME} : '\(.*\)\.[^.]*\.[^.]*'` - ;; - *.tar.bz2) EXTRACT_SUFX=.tar.bz2 - DISTNAME=`expr ${DISTNAME} : '\(.*\)\.[^.]*\.[^.]*'` - ;; - *) EXTRACT_SUFX=`expr ${DISTNAME} : '.*\(\.[^.]*\)'` - DISTNAME=`expr ${DISTNAME} : '\(.*\)\.[^.]*'` - ;; - esac - - if [ -f Makefile ]; then - mv Makefile Makefile.BAK - fi - - category=`pwd | sed 's|^.*/\([^/]*\)/[^/]*$|\1|'` - ( - echo '# $'NetBSD'$' - echo '#' - echo "" - echo "DISTNAME= $DISTNAME" - echo "CATEGORIES= $category" - echo "MASTER_SITES= $MASTER_SITES" - if [ "$EXTRACT_SUFX" != ".tar.gz" ]; then - echo "EXTRACT_SUFX= ${EXTRACT_SUFX}" - fi - echo "" - echo "MAINTAINER= $email_maintainer" - echo "HOMEPAGE= $HOMEPAGE" - echo "COMMENT= SHORT_DESCRIPTION_OF_THE_PACKAGE" - echo "" - echo '.include "../../mk/bsd.pkg.mk"' - ) >Makefile - - echo '@comment $'NetBSD'$' > PLIST - touch distinfo - - ${editor} +5 Makefile - - echo "Running 'make makesum' ..." - $MAKE makesum - - echo "Running 'make extract' ..." - $MAKE extract -fi - -# -# Exec Artificial Intelligence Modules here ... -# -wrksrc=`cd w* ; echo *` -if [ "$wrksrc" != "$DISTNAME" ]; then - WRKSRC="\${WRKDIR}/$wrksrc" -fi - -wsrcdir=`echo w*`/$wrksrc -configure=$wsrcdir/configure -echo checking $configure XXX -if [ -x $configure ]; then - if $configure --version | egrep \ - 'configure generated by autoconf version|Free Software Foundation' \ - >/dev/null 2>&1 ; then - GNU_CONFIGURE=yes - else - HAS_CONFIGURE=yes - fi - - if find $wsrcdir -name \*.mo -o -name \*.gmo >/dev/null ; then - USE_PKGLOCALEDIR=yes - fi - - GCONF2_SCHEMAS=`find $wsrcdir -name \*.schemas -o -name \*.schemas.in* \ - | sed -e 's|^.*/||' -e 's/.in.in$//' -e 's/.in$//'` -fi - -ltconfig=$wsrcdir/ltconfig -ltmain=$wsrcdir/ltmain.sh -libtool=\${WRKSRC}/libtool -echo checking libtool: $ltconfig -if [ -f $ltconfig -o -f $ltmain ]; then - USE_LIBTOOL=yes -fi - -PKGCONFIGS=`cd $wsrcdir && find * -name \*.pc.in -a ! -name \*-uninstalled.pc.in -type f` - -echo "Fixing up Makefile." -( - sed '/^.include/d' <Makefile - - if [ "${WRKSRC}" != "" ]; then - echo "WRKSRC= $WRKSRC" - fi - - if [ "${USE_PKGLOCALEDIR}" != "" ]; then - echo "USE_PKGLOCALEDIR= $USE_PKGLOCALEDIR" - fi - - if [ "${USE_LIBTOOL}" != "" ]; then - echo "USE_LIBTOOL= $USE_LIBTOOL" - fi - - if [ "${PKGCONFIGS}" != "" ]; then - echo "USE_TOOLS+= pkg-config" - fi - - if [ "${HAS_CONFIGURE}" != "" ]; then - echo "HAS_CONFIGURE= $HAS_CONFIGURE" - fi - if [ "${GNU_CONFIGURE}" != "" ]; then - echo "GNU_CONFIGURE= $GNU_CONFIGURE" - fi - - echo - - for i in $PKGCONFIGS ; do - echo "PKGCONFIG_OVERRIDE+= $i" - done - - echo - - if [ -n "$GCONF2_SCHEMAS" ]; then - echo 'CONFIGURE_ENV+= GCONF_SCHEMA_FILE_DIR="${PREFIX}/share/gconf/schemas/"' - echo 'MAKE_ENV+= GCONF_SCHEMA_FILE_DIR="${PREFIX}/share/gconf/schemas/"' - - echo "" - - for i in $GCONF2_SCHEMAS ; do - echo "GCONF2_SCHEMAS+= $i" - done - - echo "" - echo '.include "../../devel/GConf2/schemas.mk"' - fi - - if [ -d $wsrcdir/libltdl ]; then - echo '.include "../../devel/libltdl/convenience.mk"' - fi - - echo '.include "../../mk/bsd.pkg.mk"' -) >Makefile.$$ -mv Makefile.$$ Makefile - -echo "" -echo "Contents of $wsrcdir:" -ls -la $wsrcdir - -if [ ! -f DESCR ]; then - touch DESCR -fi - -# GNU Autoconf scripts will create this file... remove it. -[ -f configure.lineno ] && rm configure.lineno - -echo "" -echo "Remember to correct CATEGORIES, HOMEPAGE, COMMENT, and DESCR when you're done!" -echo "" -echo "Good luck! (See pkgsrc/doc/pkgsrc.txt for some more help :-)" diff --git a/pkgtools/url2pkg/files/url2pkg.8 b/pkgtools/url2pkg/files/url2pkg.8 index 84987370466..dcdfc05453d 100644 --- a/pkgtools/url2pkg/files/url2pkg.8 +++ b/pkgtools/url2pkg/files/url2pkg.8 @@ -1,4 +1,4 @@ -.\" $NetBSD: url2pkg.8,v 1.7 2006/10/01 15:09:05 rillig Exp $ +.\" $NetBSD: url2pkg.8,v 1.8 2006/10/02 16:49:30 rillig Exp $ .\" .\" Copyright (c) 2001 The NetBSD Foundation, Inc. .\" All rights reserved. @@ -39,7 +39,7 @@ .Os .Sh NAME .Nm url2pkg -.Nd Automatic NetBSD package generator +.Nd Automatic pkgsrc package generator .Sh SYNOPSIS .Nm .Op Ar URL @@ -114,6 +114,8 @@ package for the software that can be found at .Sh AUTHORS .Nm was written by +.An Roland Illig Aq rillig@NetBSD.org , +enhancing the previous version by .An Hubert Feyrer Aq hubertf@NetBSD.org . .br This man page was written by diff --git a/pkgtools/url2pkg/files/url2pkg.pl b/pkgtools/url2pkg/files/url2pkg.pl new file mode 100644 index 00000000000..8440b883bb3 --- /dev/null +++ b/pkgtools/url2pkg/files/url2pkg.pl @@ -0,0 +1,431 @@ +#! @PERL@ +# $NetBSD: url2pkg.pl,v 1.1 2006/10/02 16:49:30 rillig Exp $ +# + +use strict; +use warnings; + +# +# Build-time Configuration. +# + +my $make = '@MAKE@'; +my $perllibdir = '@PERLLIBDIR@'; + +use constant true => 1; +use constant false => 0; + +# +# Some helper subroutines. +# + +sub run_editor($$) { + my ($fname, $lineno) = @_; + + my $editor = $ENV{"PKGEDITOR"} || $ENV{"EDITOR"} || "vi"; + + system { $editor } ($editor, "+${lineno}", $fname); +} + +sub get_maintainer() { + + return $ENV{"PKGMAINTAINER"} || $ENV{"REPLYTO"} || "INSERT_YOUR_MAIL_ADDRESS_HERE"; +} + +sub print_section($$) { + my ($f, $vars) = @_; + + if (scalar(@{$vars}) == 0) { + return; + } + + my $width = 0; + foreach my $var (@{$vars}) { + my $len = length($var->[0]); + $width = ($len > $width) ? $len : $width; + } + + foreach my $var (@{$vars}) { + my $len = length($var->[0]) + 1; + my $adjlen = (($width + 1 + 1) + 7) &-8; + my $ntabs = (7 + $adjlen - $len) / 8; + printf $f ("%s=%s%s\n", $var->[0], "\t" x $ntabs, $var->[1]); + } + printf $f ("\n"); +} + +# +# Introduction to the magic_* subroutines. +# +# The following routines are called after the distfiles have been +# downloaded and extracted. They may inspect the extracted files +# to automatically define some variables in the package Makefile. +# +# The following variables may be used in the magic_* subroutines: +# $distname contains the package name, including the version number. +# $abs_wrkdir is an absolute pathname to the working directory, which +# contains the extracted distfiles. $abs_wrksrc is the absolute pathname +# to a subdirectory of $abs_wrkdir, in which you can usually find the +# package-provided Makefiles or configure scripts. +# +# The following lists may be extended by the magic_* routines and +# will later appear in the package Makefile: @depends and @build_depends +# contain the dependencies of the package, in the form +# "package>=version". @includes is a list of pathnames relative to the +# package path. All these files will be included at the bottom of the +# Makefile. @build_vars is a list of [varname, value] items that contain +# variables that will be defined in the fourth paragraph of the package +# Makefile, where the build configuration takes place. The @extra_vars +# are similar to the @build_vars, but separated by an empty line in the +# Makefile. The @todo items are inserted below the second paragraph in +# the Makefile. +# + +my ($distname, $abs_wrkdir, $abs_wrksrc); +my (@depends, @build_depends, @includes, @build_vars, @extra_vars, @todo); +my ($pkgname); + +# +# And now to the real magic_* subroutines. +# + +sub magic_configure() { + my $gnu_configure = false; + + open(CONF, "<", "${abs_wrksrc}/configure") or return; + while (defined(my $line = <CONF>)) { + if ($line =~ qr"autoconf|Free Software Foundation"i) { + $gnu_configure = true; + last; + } + } + close(CONF); + + my $varname = ($gnu_configure ? "GNU_CONFIGURE" : "HAS_CONFIGURE"); + push(@build_vars, [$varname, "yes"]); +} + +sub magic_gconf2_schemas() { + my $gconf2_files = `cd $abs_wrksrc && find * -type f -name "*.schemas" -o -name "*.schemas.in*" -print 2>/dev/null | sed -e 's|^.*/||' -e 's/.in.in\$//' -e 's/.in\$//'`; + if ($gconf2_files =~ qr"\S") { + push(@build_vars, ["CONFIGURE_ENV+", "GCONF_SCHEMA_FILE_DIR=\${PREFIX:Q}/share/gconf/schemas/"]); + push(@build_vars, ["MAKE_ENV+", "GCONF_SCHEMA_FILE_DIR=\${PREFIX:Q}/share/gconf/schemas/"]); + foreach my $f (split(qr"\s+", $gconf2_files)) { + push(@extra_vars, ["GCONF2_SCHEMAS+", $f]); + } + push(@includes, "../../devel/GConf2/schemas.mk"); + } +} + +sub magic_libtool() { + if (-f "${abs_wrksrc}/ltconfig" || -f "${abs_wrksrc}/ltmain.sh") { + push(@build_vars, ["USE_LIBTOOL", "yes"]); + } + if (-d "${abs_wrksrc}/libltdl") { + push(@includes, "../../devel/libltdl/convenience.mk"); + } +} + +sub magic_perlmod() { + if (-f "${abs_wrksrc}/Build.PL") { + + # It's a Module::Build module. Dependencies cannot yet be + # extracted automatically. + push(@todo, "Look for the dependencies in Build.PL."); + + push(@build_vars, ["PERL5_MODULE_TYPE", "Module::Build"]); + + } elsif (-f "${abs_wrksrc}/Makefile.PL") { + open(DEPS, "cd ${abs_wrksrc} && perl -I${perllibdir} Makefile.PL |") or die; + while (defined(my $dep = <DEPS>)) { + chomp($dep); + push(@depends, $dep); + } + close(DEPS) or die; + + } else { + return; + } + + my $packlist = $distname; + $packlist =~ s/-[0-9].*//; + $packlist =~ s/-/\//g; + push(@build_vars, ["PERL5_PACKLIST", "auto/${packlist}/.packlist"]); + push(@includes, "../../lang/perl5/module.mk"); + $pkgname = "p5-\${DISTNAME}"; +} + +sub magic_pkg_config() { + my $pkg_config_files = `cd $abs_wrksrc && find * -type f -name "*.pc.in" -a ! -name "*-uninstalled.pc.in" -print 2>/dev/null`; + if ($pkg_config_files =~ qr"\S") { + push(@build_vars, ["USE_TOOLS+", "pkg-config"]); + } + foreach my $f (split(qr"\s+", $pkg_config_files)) { + push(@extra_vars, ["PKGCONFIG_OVERRIDE+", $f]); + } +} + +sub magic_po() { + if (`cd $abs_wrksrc && find * -type f -name "*.mo" -o -name "*.gmo" -print 2>/dev/null` =~ qr"\S") { + push(@build_vars, ["USE_PKGLOCALEDIR", "yes"]); + } +} + +sub magic_use_languages() { + my $c_files = `cd $abs_wrksrc && find * -type f -name "*.c" -print 2>/dev/null`; + my $cxx_files = `cd $abs_wrksrc && find * -type f "(" -name "*.cpp" -o -name "*.cc" -o -name "*.C" ")" -print 2>/dev/null`; + my $f_files = `cd $abs_wrksrc && find * -type f -name "*.f" -print 2>/dev/null`; + my $languages = {}; + + $c_files =~ qr"\S" and $languages->{"c"} = true; + $cxx_files =~ qr"\S" and $languages->{"c++"} = true; + $f_files =~ qr"\S" and $languages->{"f"} = true; + + my $use_languages = join(" ", sort(keys(%{$languages}))); + if ($use_languages eq "") { + $use_languages = "# none"; + } + if ($use_languages ne "c") { + push(@build_vars, ["USE_LANGUAGES", $use_languages]); + } +} + +# +# Subroutines for generating the initial package and adjusting it after +# the distfiles have been extracted. +# + +sub generate_initial_package($) { + my ($url) = @_; + my ($found, $master_site); + my ($master_sites, $distfile, $homepage, $dist_sufx, $category); + + $found = false; + open(SITES, "<", "../../mk/fetch/sites.mk") or die; + while (defined(my $line = <SITES>)) { + chomp($line); + + if ($line =~ qr"^(MASTER_SITE_.*)\+=") { + $master_site = $1; + + } elsif ($line =~ qr"^\t(.*?)(?:\s+\\)$") { + my ($site) = ($1); + + if (index($url, $site) == 0) { + $found = true; + + if ($url =~ qr"^\Q${site}\E(.+)/([^/]+)$") { + my $subdir = $1; + $distfile = $2; + + $master_sites = "\${${master_site}:=${subdir}/}"; + if ($master_site eq "MASTER_SITE_SOURCEFORGE") { + $homepage = "http://${subdir}.sourceforge.net/"; + } elsif ($master_site eq "MASTER_SITE_GNU") { + $homepage = "http://www.gnu.org/software/${subdir}/"; + } else { + $homepage = substr($url, 0, -length($distfile)); + } + } else { + $master_sites = "\${${master_site}}"; + } + } + } + } + + if (!$found) { + if ($url =~ qr"^http://prdownloads\.sourceforge\.net/([^/]*)/[^/]*\?download$") { + my $pkgbase = $1; + $distfile = $2; + + $master_sites = "\${MASTER_SITE_SOURCEFORGE:=${pkgbase}/}"; + $homepage = "http://${pkgbase}.sourceforge.net/"; + $found = true; + } + } + + if (!$found) { + if ($url =~ qr"^(.*/)(.*)$") { + ($master_sites, $distfile) = ($1, $2); + $homepage = $master_sites; + } else { + die("$0: ERROR: Invalid URL: ${url}\n"); + } + } + + if ($distfile =~ qr"^(.*)(\.tgz|\.tar\.Z|\.tar\.gz|\.tar\.bz2)$") { + ($distname, $dist_sufx) = ($1, $2); + } elsif ($distfile =~ qr"^(.*)(\.[^.]+)$") { + ($distname, $dist_sufx) = ($1, $2); + } else { + ($distname, $dist_sufx) = ($distfile, "# none"); + } + + # ignore errors. + rename("Makefile", "Makefile-url2pkg.bak"); + + `pwd` =~ qr".*/([^/]+)/[^/]+$" or die; + $category = $1; + + open(MF, ">", "Makefile") or die; + print MF ("# \$NetBSD\$\n"); + print MF ("#\n"); + print MF ("\n"); + print_section(*MF, [ + ["DISTNAME", $distname], + ["CATEGORIES", $category], + ["MASTER_SITES", $master_sites], + ($dist_sufx ne ".tar.gz" + ? ["EXTRACT_SUFX", $dist_sufx] + : ()) + ]); + print_section(*MF, [ + ["MAINTAINER", get_maintainer()], + ["HOMEPAGE", $homepage], + ["COMMENT", "SHORT_DESCRIPTION_OF_THE_PACKAGE"] + ]); + print MF ("# url2pkg-marker (please do not remove this line.)\n"); + print MF (".include \"../../mk/bsd.pkg.mk\"\n"); + close(MF) or die; + + open(PLIST, ">", "PLIST") or die; + print PLIST ("\@comment \$NetBSD\$\n"); + close(PLIST) or die; + + open(DI, ">", "distinfo") or die; + close(DI) or die; + + open(DESCR, ">", "DESCR") or die; + close(DESCR) or die; + + run_editor("Makefile", 5); + + print ("url2pkg> Running \"make makesum\" ...\n"); + (system { $make } ($make, "makesum")) == 0 or die; + + print ("url2pkg> Running \"make extract\" ...\n"); + (system { $make } ($make, "extract")) == 0 or die; +} + +sub adjust_package_from_extracted_distfiles() +{ + my ($seen_marker); + + chomp($abs_wrkdir = `${make} show-var VARNAME=WRKDIR`); + + # + # Determine the value of WRKSRC. + # + my @files = (); + opendir(WRKDIR, $abs_wrkdir) or die; + while (defined(my $f = readdir(WRKDIR))) { + next if $f =~ qr"^\."; + push(@files, $f); + } + closedir(WRKDIR); + if (@files == 1) { + if ($files[0] ne $distname) { + push(@build_vars, ["WRKSRC", "\${WRKDIR}/$files[0]"]); + } + $abs_wrksrc = "${abs_wrkdir}/$files[0]"; + } else { + push(@build_vars, ["WRKSRC", "\${WRKDIR}"]); + $abs_wrksrc = $abs_wrkdir; + } + + magic_configure(); + magic_gconf2_schemas(); + magic_libtool(); + magic_perlmod(); + magic_pkg_config(); + magic_po(); + magic_use_languages(); + + print("url2pkg> Adjusting the Makefile.\n"); + + open(MF1, "<", "Makefile") or die; + open(MF2, ">", "Makefile-url2pkg.new") or die; + + # Copy the user-edited part of the Makefile. + while (defined(my $line = <MF1>)) { + if ($line =~ qr"^# url2pkg-marker\b") { + $seen_marker = true; + last; + } + print MF2 ($line); + + # Note: This is not elegant, but works. + if (defined($pkgname) && $line =~ qr"^DISTNAME=(\t+)") { + print MF2 ("PKGNAME=$1${pkgname}\n"); + } + } + + if (scalar(@todo) != 0) { + foreach my $todo (@todo) { + print MF2 ("# TODO: ${todo}\n"); + } + print MF2 ("\n"); + } + + my @depend_vars; + foreach my $bd (@build_depends) { + push(@depend_vars, ["BUILD_DEPENDS+", $bd]); + } + foreach my $d (@depends) { + push(@depend_vars, ["DEPENDS+", $d]); + } + print_section(*MF2, \@depend_vars); + + print_section(*MF2, \@build_vars); + print_section(*MF2, \@extra_vars); + + foreach my $f (@includes) { + print MF2 (".include \"${f}\"\n"); + } + + # Copy the rest of the user-edited part of the Makefile. + while (defined(my $line = <MF1>)) { + print MF2 ($line); + } + + close(MF1); + close(MF2) or die; + if ($seen_marker) { + rename("Makefile-url2pkg.new", "Makefile") or die; + } else { + unlink("Makefile-url2pkg.new"); + die("$0: ERROR: didn't find the url2pkg marker in the file.\n"); + } + +} + +sub main() { + my $url; + + if (!-f "../../mk/bsd.pkg.mk") { + die("$0 must be run from a package directory (.../pkgsrc/category/package)."); + } + + my @extract_cookie = <w*/.extract_done>; + if (scalar(@extract_cookie) == 0) { + if (scalar(@ARGV) == 0) { + print("URL: "); + $url = <STDIN>; + } else { + $url = shift(@ARGV); + } + + generate_initial_package($url); + } else { + chomp($distname = `${make} show-var VARNAME=DISTNAME`); + } + + adjust_package_from_extracted_distfiles(); + + print("\n"); + print("Remember to correct CATEGORIES, HOMEPAGE, COMMENT, and DESCR when you're done!\n"); + print("\n"); + print("Good luck! (See pkgsrc/doc/pkgsrc.txt for some more help :-)\n"); +} + +main(); |