Merge from vendor branch TNF:
[pkgsrc.git] / pkgtools / port2pkg / files / port2pkg.pl
1 #!/usr/bin/env perl
2 #
3 # $NetBSD: port2pkg.pl,v 1.3 1999/09/14 00:43:20 sakamoto Exp $
4 #
5
6 require 'getopts.pl';
7 $^W=1;
8 use strict;
9 use vars qw($opt_m);
10 my($maintainer) = "packages\@netbsd.org";
11 my($makefile, $master_site_subdir, $extract_cmd);
12 my($portsdir, $pkgdir);
13 my($namespace, $portname, $portversion, $distname, $pkgname);
14 my(@man, @cat);
15
16 if (! &Getopts('m:')) {&usage_and_exit();}
17 $|=1;
18
19 $portsdir = shift;
20 $pkgdir = shift;
21 if (! $portsdir || ! $pkgdir) {&usage_and_exit();}
22
23 if ($opt_m) {$maintainer = $opt_m;}
24 if (! -d "$portsdir") {die "$portsdir: $!\n";}
25 if (! -d "$pkgdir") {
26         if (mkdir($pkgdir, 0755) == 0) {
27                 die "$pkgdir: $!\n";
28         }
29 }
30
31 system("${GTAR} cCf $portsdir - .|${GTAR} xCf $pkgdir -");
32
33 &read_Makefile();
34 &conv_Makefile();
35 &conv_PLIST();
36 &add_NetBSD_ID();
37
38 system("(cd $pkgdir; pkglint)");
39 0;
40
41 sub usage_and_exit {
42         print "port2pkg [-m maintainer] portsdir pkgdir\n";
43         exit;
44 }
45
46 sub read_Makefile {
47         open(PORTS, "$portsdir/Makefile")
48                 || die "$portsdir/Makefile: $!\n";
49         while (<PORTS>) {
50                 if (/\\$/) {
51                         chop;
52                         chop;
53                 }
54                 $makefile .= $_;
55         }
56         close(PORTS);
57
58         my ($extract_before_args, $extract_after_args);
59         foreach my $line (split(/\n/, $makefile)) {
60                 $_ = $line;
61                 if (/^PORTNAME\?*=(\s*)(.*)/) {
62                         $namespace = $1;
63                         $portname = $2;
64                 } elsif (/^PORTVERSION\?*=\s*(.*)/) {
65                         $portversion = $1;
66                 } elsif (/^DISTNAME\?*=\s*(.*)/) {
67                         $distname = $1;
68                 } elsif (/^MASTER_SITE_SUBDIR\?*=\s*(.*)/) {
69                         $master_site_subdir = $1;
70                         if (!($master_site_subdir =~ /\/$/)) {
71                                 $master_site_subdir .= "/";
72                         }
73                 } elsif (/^MAN(.)\?*=\s*(.*)/) {
74                         $man[$1] .= $2;
75                 } elsif (/^CAT(.)\?*=\s*(.*)/) {
76                         $cat[$1] .= $2;
77                 } elsif (/^EXTRACT_CMD\?*=\s*(.*)/) {
78                         $extract_cmd = $1;
79                 } elsif (/^EXTRACT_BEFORE_ARGS\?*=\s*(.*)/) {
80                         $extract_before_args = $1;
81                 } elsif (/^EXTRACT_AFTER_ARGS\?*=\s*(.*)/) {
82                         $extract_after_args = $1;
83                 }
84         }
85
86         if (defined($extract_cmd) && $extract_cmd ne "") {
87                 if ($extract_before_args ne "") {
88                         $extract_before_args = " $extract_before_args";
89                 }
90                 if ($extract_after_args ne "") {
91                         $extract_after_args = " $extract_after_args";
92                 }
93                 $extract_cmd = "$extract_cmd$extract_before_args" .
94                         " \${DOWNLOADED_DISTFILE}$extract_after_args";
95         }
96
97         if (defined($distname)) {
98                 $distname =~ s/\${PORTNAME}/$portname/;
99                 $distname =~ s/\${PORTVERSION}/$portversion/;
100
101                 if ($distname ne "$portname-$portversion") {
102                         $pkgname = "$portname-$portversion";
103                 }
104         } else {
105                 $distname = "$portname-$portversion";
106         }
107 }
108
109 sub conv_Makefile {
110         open(PORTS, "$portsdir/Makefile")
111                 || die "$portsdir/Makefile: $!\n";
112         open(PKG, ">$pkgdir/Makefile")
113                 || die "$pkgdir/Makefile: $!\n";
114
115         print PKG "# \$NetBSD\$\n";
116
117         # header
118         while (<PORTS>) {
119                 if (! /^\#/) {last;}
120
121                 if (/\$FreeBSD(: .*) \$/ || /\$Id(: .*) \$/) {
122                         print PKG "\# FreeBSD Id$1\n";
123                 } else {
124                         print;
125                 }
126         }
127         print PKG;
128
129         # body
130         my ($nextline, $remove, $master_sites, $noportdocs);
131         while (<PORTS>) {
132                 if (/\\$/) {
133                         $nextline++;
134                         next if ($remove);
135                 } else {
136                         $nextline = 0;
137                         if ($remove) {
138                                 $remove = 0;
139                                 next;
140                         }
141                 }
142
143                 s|^\.include <bsd.port.pre.mk>|.include \"../../mk/bsd.prefs.mk\"|;
144                 s|^\.include <bsd.port.mk>|.include \"../../mk/bsd.pkg.mk\"|;
145                 s|^FETCH_(DEPENDS)|BUILD_$1|;
146                 s|^LIB_(DEPENDS)|$1|;
147                 s|\$\{PORTSDIR\}|../..|g;
148                 s|PLIST_SUB|PLIST_SUBST|;
149
150                 if (defined($master_site_subdir) &&
151                     $master_site_subdir ne "" &&
152                     ($master_sites || /^MASTER_SITES\?*=/)) {
153                         s|([^L][^O][^C][^A][^L])\}|$1:=$master_site_subdir}|g;
154
155                         if ($nextline) {
156                                 $master_sites = 1;
157                         } else {
158                                 $master_sites = 0;
159                         }
160                 }
161
162                 if (/(\/usr\/local)/ ||
163                     /(\/usr\/X11R6)/ ||
164                     /(ldconfig)/i ||
165                     /(MASTERDIR)/ ||
166                     /(.*cat.*MESSAGE.*)/i) {
167                         print "WARN: found \"$1\"\n";
168                 }
169
170                 if (/^PORTVERSION/ ||
171                     /^DISTNAME/ ||
172                     /^MAN(.)\?*=/ ||
173                     /^CAT(.)\?*=/ ||
174                     /^MASTER_SITE_SUBDIR/ ||
175                     /^EXTRACT_BEFORE_ARGS/ ||
176                     /^EXTRACT_AFTER_ARGS/) {
177                         $remove if ($nextline);
178                 } elsif (/^PORTNAME/) {
179                         print PKG "DISTNAME=$namespace$distname\n";
180                         print PKG "PKGNAME=$namespace$pkgname\n" if defined($pkgname);
181                         $remove if ($nextline);
182                 } elsif (/^(EXTRACT_CMD\?*=)/) {
183                         print PKG "$1\t$extract_cmd\n";
184                         $remove if ($nextline);
185                 } elsif (/^(MAINTAINER\?*=)/) {
186                         print PKG "$1\t$maintainer\n";
187                         $remove if ($nextline);
188
189                         open(DESCR, "$pkgdir/pkg/DESCR")
190                                 || die "$pkgdir/pkg/DESCR: $!\n";
191                         while (<DESCR>) {
192                                 chop;
193                                 if (/^WWW:[\s]*(.*)/) {
194                                         print PKG "HOMEPAGE=\t$1\n";
195                                 }
196                         }
197                         close(DESCR);
198                 } elsif ($noportdocs || /^\.if.*NOPORTDOCS/) {
199                         if (/^\.if/) {
200                                 $noportdocs++;
201                                 if ($noportdocs > 2) {print PKG $_;}
202                         } elsif (/^\.endif/) {
203                                 $noportdocs--;
204                                 if ($noportdocs > 2) {print PKG $_;}
205                         } else {
206                                 print PKG $_;
207                         }
208                 } else {
209                         print PKG $_;
210                 }
211         }
212
213         close(PORTS);
214         close(PKG);
215 }
216
217 sub add_manual {
218         my ($FILE, $category) = @_;
219
220         for (my $i = 1; $i <= 8; $i++) {
221                 if (!defined(eval "\$$category\[\$i\]")) {next;}
222                         foreach my $item (sort(split(/[ \t\n]+/,
223                             eval "\$$category\[\$i\]"))) {
224                                 print $FILE "$category/$category$i/$item\n";
225                 }
226         }
227 }
228
229 sub conv_PLIST {
230         my ($file, $plist);
231         if (opendir(PKGDIR, "$portsdir/pkg") == 0) {return 0;}
232         while ($plist = readdir(PKGDIR)) {
233                 if (!($plist =~ /^PLIST/)) {next;}
234
235                 open(PORTS, "$portsdir/pkg/$plist")
236                         || die "$portsdir/pkg/$plist: $!\n";
237                 open(PKG, ">$pkgdir/pkg/$plist")
238                         || die "$pkgdir/pkg/$plist: $!\n";
239
240                 print PKG "\@comment \$NetBSD\$\n";
241                 my ($cat_added, $man_added);
242                 while (<PORTS>) {
243                         s|\%\%([^\%]+)\%\%|\${$1}|g;
244                         if (/^\@.*ldconfig/) {next;}
245                         if (defined($cat_added) && $cat_added == 0 && /^[d-z]/){
246                                 &add_manual(*PKG, "cat");
247                                 $cat_added++;
248                         }
249                         if (defined($man_added) && $man_added == 0 && /^[n-z]/){
250                                 &add_manual(*PKG, "man");
251                                 $man_added++;
252                         }
253
254                         print PKG $_;
255                 }
256                 if (defined($cat_added) && $cat_added == 0)
257                         {&add_manual(*PKG, "cat");}
258                 if (defined($man_added) && $man_added == 0)
259                         {&add_manual(*PKG, "man");}
260
261                 close(PKG);
262                 close(PORTS);
263         }
264         closedir(PKGDIR);
265 }
266
267 sub add_NetBSD_ID {
268         my ($patch);
269         if (open(MD5, "$portsdir/files/md5")) {
270                 open(NMD5, ">$pkgdir/files/md5")
271                         || die "$pkgdir/files/md5: $!\n";
272                 print NMD5 "\$NetBSD\$\n\n";
273                 while (<MD5>) {
274                         print NMD5 $_;
275                 }
276                 close(NMD5);
277                 close(MD5);
278         }
279
280         if (opendir(PATCHDIR, "$portsdir/patches") == 0) {return 0;}
281         while ($patch = readdir(PATCHDIR)) {
282                 if ($patch eq "\." || $patch eq "\.."
283                         || $patch eq "CVS") {next;}
284                 if (open(PATCH, "$portsdir/patches/$patch")) {
285                         open(NPATCH, ">$pkgdir/patches/$patch")
286                                 || die "$pkgdir/patches/$patch: $!\n";
287                         print NPATCH "\$NetBSD\$\n\n";
288                         while (<PATCH>) {
289                                 if (/(FreeBSD)/i ||
290                                     /(#!.*perl)/) {
291                                         print "WARN: $pkgdir/patches/" .
292                                           "$patch includes \"$1\".\n";
293                                 }
294                                 print NPATCH $_;
295                         }
296                         close(NPATCH);
297                         close(PATCH);
298                 }
299         }
300         closedir(PATCHDIR);
301 }