1#!/usr/bin/perl -w 2# 3# Copyright (c) 2000 Neil Blakey-Milner 4# All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25# SUCH DAMAGE. 26# 27 28# a script to gain a bit of knowledge about a supplied distfile 29 30use strict; 31use vars qw/ $opt_n /; 32 33use File::Basename qw( basename dirname ); 34use Getopt::Std qw( getopts ); 35 36my ($filename, $ver, $initdir, $distdir, $wrkdir, $tmpdir); 37my ($makefile, $wrksrc); 38my (%cap); 39 40chomp($initdir = `pwd`); 41 42$cap{"MAINTAINER"} = ($ENV{"MAINTAINER"} || $ENV{"PKGMAINTAINER"} || "ports\@freebsd.org"); 43 44getopts('n'); 45 46&usage if $#ARGV != 0; 47 48$filename = $ARGV[0]; 49 50if ($filename =~ m#^(f|ht)tp\://#) { 51 print `fetch $filename`; 52 $cap{"MASTER_SITES"} = dirname($filename) . '/'; 53 $filename = basename($filename); 54} 55chdir(dirname($filename)); 56chomp($distdir = `pwd`); 57chdir ($initdir); 58 59&chk_extract; # .tar.gz vs .tgz vs .tar.bz2, &c. 60&enh_distname; 61if ($opt_n) { 62 print "filename is $filename\n"; 63 print "PORTNAME is " . $cap{"PORTNAME"} . "\n"; 64 print "PORTVERSION is " . $cap{"PORTVERSION"} . "\n"; 65 exit; 66} 67&bareskel; 68&md5; 69&writemk; 70 71exit; 72 73sub bareskel { 74 $tmpdir = $cap{'PORTNAME'}; 75 $tmpdir .= ".$$" while -e $tmpdir; 76 mkdir($tmpdir,0777); 77 78 `printf "\n" > $tmpdir/pkg-plist`; 79 `printf "\n" > $tmpdir/pkg-descr`; 80} 81 82sub writemk { 83 84 my (%tmp); 85 my ($key); 86 87 my ($distname); 88 $distname = $cap{"PORTNAME"}; 89 90 foreach $key (keys %cap) { 91 $tmp{$key} = $cap{$key}; 92 } 93 94 open(MAKEFILE, ">$tmpdir/Makefile"); 95 my ($date); 96 chomp($date = `date +"\%d \%b \%Y"`); 97 98 print MAKEFILE <<EOF; 99# New ports collection makefile for: $distname 100# Date created: $date 101# Whom: makeport.pl 102# 103# \$FreeBSD\$ 104# 105 106EOF 107 108 print MAKEFILE "PORTNAME= " . $tmp{"PORTNAME"} . "\n"; 109 print MAKEFILE "PORTVERSION= " . $tmp{"PORTVERSION"} . "\n"; 110 delete($tmp{"PORTNAME"}); 111 delete($tmp{"PORTVERSION"}); 112 113 print MAKEFILE "CATEGORIES= misc\n"; 114 foreach $key (keys %tmp) { 115 my($tmp) = $tmp{$key}; 116 if (($key eq "DISTNAME") || ($key eq "EXTRACT_SUFX")) { 117 print MAKEFILE "$key=\t$tmp\n"; 118 delete($tmp{$key}); 119 } 120 } 121 122 if ($tmp{"MASTER_SITES"}) { 123 print MAKEFILE "MASTER_SITES= ". $tmp{"MASTER_SITES"} . "\n\n"; 124 delete($tmp{"MASTER_SITES"}); 125 } 126 127 print MAKEFILE "\nMAINTAINER=\t" . $tmp{"MAINTAINER"} . "\n"; 128 delete($tmp{"MAINTAINER"}); 129 print MAKEFILE "COMMENT=\t" . "A" . "\n\n"; 130 131 if ($tmp{"LIB_DEPENDS"}) { 132 print MAKEFILE "LIB_DEPENDS=". $tmp{"LIB_DEPENDS"} . "\n\n"; 133 delete($tmp{"LIB_DEPENDS"}); 134 } 135 136 #second group 137 foreach $key (keys %tmp) { 138 my($tmp) = $tmp{$key}; 139 print MAKEFILE "$key=\t$tmp\n"; 140 } 141 142 print MAKEFILE "# -- eos --\n\n"; 143 144 print MAKEFILE ".include <bsd.port.mk>\n"; 145 close (MAKEFILE); 146} 147 148sub md5 { 149 my $tmp = basename($filename); 150 chdir ($initdir); 151 `md5 $filename | perl -pe "s#$filename#$tmp#" > $tmpdir/distinfo`; 152} 153 154sub chk_extract { 155 my $tmp = basename($filename); 156 157 $tmp =~ s/(\.tgz)$// && do { 158 $cap{"DISTNAME"} = $tmp; 159 $cap{"EXTRACT_SUFX"} = $1; 160 return; 161 }; 162 $tmp =~ s/(\.tar\.bz2)$// && do { 163 $cap{"DISTNAME"} = $tmp; 164 $cap{"EXTRACT_SUFX"} = $1 if ($1 ne ".tar.bz2"); 165 $cap{"USE_BZIP2"} = "YES"; 166 return; 167 }; 168 $tmp =~ s/(\.tar)$// && do { 169 $cap{"DISTNAME"} = $tmp; 170 $cap{"EXTRACT_SUFX"} = $1; 171 return; 172 }; 173 $tmp =~ s/(\.tar.*)$// && do { 174 $cap{"DISTNAME"} = $tmp; 175 $cap{"EXTRACT_SUFX"} = $1 if ($1 ne ".tar.gz"); 176 return; 177 }; 178} 179 180sub add_extsuffix { 181 return if $cap{"EXTRACT_SUFX"}; 182 if ($cap{"USE_BZIP2"}) { 183 $cap{"EXTRACT_SUFX"} = ".tar.bz2"; 184 } else { 185 $cap{"EXTRACT_SUFX"} = ".tar.gz"; 186 } 187} 188 189sub enh_distname { 190 my($changes) = 0; 191 my($play) = $cap{"DISTNAME"}; 192 #print "starting play...\n"; 193 my($firstshot) = 0; 194 my($portname, $portversion); 195 if (defined($play) eq "") { 196 die "can't make heads or tails of $filename"; 197 } 198 while ($changes == 0) { 199 $changes = 1; 200 $firstshot++; 201 $_ = $play; 202 #print "using $play\n"; 203 /^(.*[0-9][a-z]?)([-._][a-z]*)$/i && do { 204 print "Door #1\n"; 205 $cap{"DISTNAME"} = $1; 206 $play = $1; 207 &add_extsuffix; 208 $cap{"EXTRACT_SUFX"} = $2 . $cap{"EXTRACT_SUFX"}; 209 $changes = 0; 210 next; 211 }; 212 /^([a-z]*)([0-9]+)([-._])([0-9]+([-._]).*)$/i && do { 213 print "Door #2\n"; 214 if ($5 eq $3) { 215 $play = "$1-$2.$4"; 216 #$cap{"PORTNAME"} = $1; 217 #$cap{"PORTVERSION"} = "$2.$4"; 218 $portname = $1; 219 $portversion = "$2.$4"; 220 $changes = 0; 221 next; 222 } 223 }; 224 /^(.*?[^-._])([0-9])([-._])([^v]?[0-9]*[a-z]*)([-._]?)(.*)$/i &&( $firstshot == 1) && do { 225 print "Door #4\n"; 226 if (($5 eq $3) || ($5 eq "")) { 227 #$cap{"PORTNAME"} = $1; 228 #$cap{"PORTVERSION"} = "$2$3$4$5$6"; 229 $portname = $1; 230 $portversion = "$2$3$4$5$6"; 231 next; 232 } 233 }; 234 /^(.*?)([-._])(v?)((?:[0-9][-._])*[0-9][a-z]?.*)$/i && do { 235 print "Door #3\n"; 236 my($tmp); 237 $tmp = $1; 238 $ver = "$4"; 239 if ($ver =~ /^(.*)([-._])([0-9]?)([a-z])[a-z]+([0-9]?)$/) { 240 print "Door #3.1\n"; 241 my($foo) = ""; 242 #print "1 - $1\n"; 243 #print "2 - $2\n"; 244 #print "3 - $3\n"; 245 #print "4 - $4\n"; 246 #print "5 - $5\n"; 247 $foo = "." if $2; 248 #$ver = "$1$foo$3$4$5"; 249 $ver = "$1$foo$3$4$5"; 250 } 251 $portname = $tmp; 252 $portversion = $ver; 253 next; 254 }; 255 } 256 257 if (defined($portversion) eq "") { 258 die "can't make heads or tails of $filename"; 259 } 260 261 $portversion =~ s/_/./g; 262 $portversion =~ s/-/./g; 263 264 $cap{"PORTNAME"} = $portname; 265 $cap{"PORTVERSION"} = $portversion; 266 267 my ($temp1); 268 my ($temp2); 269 270 $temp1 = $cap{"DISTNAME"}; 271 $temp2 = $cap{"PORTNAME"} . "-" . $cap{"PORTVERSION"}; 272 273 if ($temp1 eq $temp2) { 274 delete($cap{"DISTNAME"}); 275 } 276} 277 278sub usage { 279 print STDERR <<"EOF"; 280usage: $0 filename 281 282 generates a ports skeleton for port based on filename 283 284EOF 285 exit; 286} 287