summaryrefslogtreecommitdiff
path: root/Packages.txt
blob: e5506694c57b64407549d685a187520430bcfbfd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
# $NetBSD: Packages.txt,v 1.3 1997/11/13 13:47:38 hubertf Exp $
###########################################################################


		  =======================================
		    An attempt of some documentation on
			 NetBSD's Packages system
		  =======================================

		      Alistair Crooks, Hubert Feyrer


0. Introduction and Overview
============================

There's an awful lot of freely-available software available, some of which
has also been "ported" to NetBSD.  The NetBSD packages collection, which is
derived from the FreeBSD ports collection, incorporates any changes
necessary to make that software run on NetBSD, and makes the installation
of the package easy by means of a single command.  De-installation is
equally simple.

The NetBSD package system is derived from the FreeBSD ports system.  It is
used to enable third-party software to be built easily on NetBSD hosts.
Once the software has been built, it is manipulated with the pkg_* tools so
that installation and de-installation is simple, and inventory printed, and
one-line comments and more verbose descriptions can be retrieved.

This document detailes 4 sections below. They are:

 1. To install packages by building
 2. To make a binary package
 3. To install a binary package
 4. Making your own package

The patient readers are advised to go and read the "guidelines" section of
the FreeBSD handbook
(http://www.freebsd.org/handbook/handbook251.html#porting), which provides
detailed instructions on the construction of a FreeBSD "port".  Impatient
readers are also advised to read that section.  A lot of the information is
this document is taken from that section of the FreeBSD handbook, mostly
without attribution.


1. To install packages by Building
====================================

This assumes that the package is already part of the NetBSD package system.
If it is not, then you are advised to read section 4 of this document:
"Making your own package".

To get the package source going, you need to get the pkgsrc.tar.gz file
from ftp://ftp.netbsd.org/pub/NetBSD-current/tar_files/pkgsrc.tar.gz and
unpack it into /usr/pkgsrc.

Assuming that has been done, become root and change into the relevant
directory. You can then type

	make

at the shell prompt to build the various components of the package, and

	make install

at the shell prompt to install the various components into the correct
place on your system.

There is one gotcha:

The distribution file (i.e. the unmodified source) must exist on your
system for the packages system to be able to build it.  If it's not, then
ftp(1) is used to fetch the distribution files automatically.  If you are
sitting behind a firewall, you must specify the relevant proxy hosts to
enable you to talk to other machines on the Internet which are not behind
your firewall.  This is an environment variable in the form of a URL e.g.
in Amdahl, the machine orpheus.amdahl.com is one of our firewalls, and it
uses port 80 as the proxy port number.  So the proxy environment variables
look like:

	ftp_proxy=ftp://orpheus.amdahl.com:80/
	http_proxy=http://orpheus.amdahl.com:80/

Taking the top system utility as an example, we can install it on our
system by building as shown in the typescript below:

> Script started on Fri Oct  3 13:22:31 1997
> root@pumpy:/u/pkgsrc/sysutils/top(1342)# make
> >> top-3.5beta5.tar.gz doesn't seem to exist on this system.
> >> Attempting to fetch from ftp://ftp.groupsys.com/pub/top/.
> Requesting ftp://ftp.groupsys.com/pub/top/top-3.5beta5.tar.gz (via ftp://orpheus.amdahl.com:80/)
> Successfully retrieved file.
> >> Checksum OK for top-3.5beta5.tar.gz.
> ===>  Extracting for top-3.5beta5
> ===>  Patching for top-3.5beta5
> ===>  Applying NetBSD patches for top-3.5beta5
> ===>  Configuring for top-3.5beta5
> /bin/cp /u/pkgsrc/sysutils/top/files/defaults /u/pkgsrc/sysutils/top/work/top-3.5beta5/.defaults
> chmod a-x /u/pkgsrc/sysutils/top/work/top-3.5beta5/install
> 
> Reading configuration from last time...
> 
> Using these settings:
>         Bourne Shell   /bin/sh
>           C compiler   cc
>     Compiler options   -DHAVE_GETOPT -O
>          Awk command   awk
>      Install command   /usr/bin/install
> 
>               Module   netbsd13
>              LoadMax   5.0
>         Default TOPN   -1
>         Nominal TOPN   18
>        Default Delay   2
> Random passwd access   yes
>           Table Size   47
>                Owner   root
>          Group Owner   kmem
>                 Mode   2755
>        bin directory   $(PREFIX)/bin
>        man directory   $(PREFIX)/man/man1
>        man extension   1
>        man style       man
> 
> Building Makefile...
> Building top.local.h...
> Building top.1...
> Doing a "make clean".
> rm -f *.o top core core.* sigdesc.h
> To create the executable, type "make".
> To install the executable, type "make install".
> ===>  Building for top-3.5beta5
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c top.c
> awk -f sigconv.awk /usr/include/sys/signal.h >sigdesc.h
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c commands.c
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c display.c
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c screen.c
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c username.c
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c utils.c
> utils.c: In function `errmsg':
> utils.c:348: warning: return discards `const' from pointer target type
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c version.c
> cc -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O  -c getopt.c
> cc "-DOSREV=12G" -DHAVE_GETOPT -DORDER -DHAVE_GETOPT -O -c machine.c
> rm -f top
> cc -o top top.o commands.o display.o screen.o username.o  utils.o version.o getopt.o machine.o -ltermcap -lm -lkvm
> root@pumpy:/u/pkgsrc/sysutils/top(1343)# make install
> >> Checksum OK for top-3.5beta5.tar.gz.
> ===>  Installing for top-3.5beta5
> /usr/bin/install -o root -m 2755 -g kmem top /usr/pkg/bin
> /usr/bin/install top.1 /usr/pkg/man/man1/top.1
> strip /usr/pkg/bin/top
> ===>  Registering installation for top-3.5beta5
> root@pumpy:/u/pkgsrc/sysutils/top(1344)# 

As you can see, the package is installed under the default root of the
packages tree - /usr/pkg. Should this not conform to your tastes, simply
set the PREFIX variable in your environment, and it will use that value as
the root of your packages tree. So, to use /usr/local, set

	PREFIX=/usr/local

in your environment.


2. To make a binary package
===========================

Once you have built and installed the package mentioned in section 1 above,
you can build it into a "binary package" - you might want to do this so
that you can use the binaries you have just built on another NetBSD system,
or to provide a simple means for others to use your binary package - this
is done by changing to the appropriate directory in the pkgsrc tree, and
typing the command

	make package

at the shell prompt.  This will build and install your package, and then
construct a binary package out of the results so that you can use the pkg_*
tools to manipulate this. At the present time, this binary package is in
the form of a gzipped tar file.

> root@pumpy:/u/pkgsrc/sysutils/top(1344)# make package
> >> Checksum OK for top-3.5beta5.tar.gz.
> ===>  Building package for top-3.5beta5
> Creating package top-3.5beta5.tgz
> Registering depends:.
> Creating gzip'd tar ball in '/u/pkgsrc/sysutils/top/top-3.5beta5.tgz'
> root@pumpy:/u/pkgsrc/sysutils/top(1345)#


3. Installing a binary package
==============================

To install a binary package on a NetBSD system, you should use the
pkg_add(1) command.  Please pay very careful attention to the warnings
expressed in that manual page about the inherent dangers of installing
binary packages which you did not create yourself, and the security holes
that can be introduced onto your system by indiscriminate adding of such
files.

Any packages needed to run the package in question will be installed too,
assuming they are present on your system.


4. Making your own package
==========================

This section should also be known as "How to make files for a pkgsrc
directory."


4.1 Category

Firstly, you should consider into which category your software falls.  The
NetBSD package collection is divided into categories.  At the time of
writing, these categories are:

  archivers
  astro
  audio
  benchmarks
  cad
  chinese
  comms
  converters
  databases
  devel
  editors
  emulators
  games
  german
  graphics
  japanese
  korean
  lang
  mail
  math
  mbone
  misc
  net
  news
  plan9
  print
  russian
  security
  shells
  sysutils
  textproc
  vietnamese
  www
  x11

It is possible that your package may fall into more than one category - in
that case, you should pick the one most likely to describe your software.
After all, that is the place that most people will look for it, and so you
have more chance of other people using it if you describe it properly.


4.2 A package's directory and its component directories and files

4.2.1 Makefile

The building, installation, and creation of a binary package are all
controlled by the package's Makefile.

There's a Makefile for each package.  This file includes the standard
<bsd.port.mk> file, which sets all the definitions and actions necessary
for the package to compile and install itself. The mandatory fields are the
DISTNAME, which specifies the base name of the distribution file which will
be downloaded from the site on the Internet, MASTER_SITES which specifies
that site, CATEGORIES which denotes the categories into which the package
falls, PKGNAME which is the name of the package, and the MAINTAINER name.
This is so that anyone who quibbles with the (always completely correct)
decisions taken by the guy who maintains the port can complain vigorously.
(Actually, in my experience, the FreeBSD maintainers have all been very
responsive.)

See /usr/share/mk/bsd.port.mk for a description of all available options.


4.2.2 The files directory

If you have any files that you wish to be placed in the package prior to
configuration or building, you could place these files here, and use a cp
command in the pre-configure target to achieve this.  Alternatively, you
could simply diff the file against /dev/null, and use the patch mechanism
to manage the creation of this file.

Besides that, this directory contains the (mandatory) md5 checksome of all
the distfiles need for the package to compile.


4.2.2.1 The files/md5 file

This file contains an md5 checksum of the distribution file(s) to ensure
that the file retrieved from the Internet has not been altered by a malign
force to introduce a security hole.  The file contains the md5 checksum of
the original distribution file used to create the NetBSD package, from
which any patches were generated etc.

It can be generated by hand using the md5(1) command or by invoking "make
makesum".


4.2.3 The patches directory

This directory contains files that are used by the patch(1) command to
modify the sources as distributed in the distribution file, into a form
that will compile and run perfectly on NetBSD.  The files are applied
successively, in alphabetic order (as returned by a shell "patches/patch-*"
glob expansion), so patch-aa is applied before patch-ab etc.

The patch-?? files should be in diff -u format.  This is because the
FreeBSD ports tsar finds this format easier to read than context diffs, and
so you have more chance of getting your NetBSD package accepted as part of
the FreeBSD ports system if you format your diffs in a unified fashion.


4.2.4 The pkg directory

This directory contains three files used to manage the creation of binary
packages.  Files from this directory are used in the binary package itself,
and will thus be installed on other machines, so you should be aware that
there is a wider audience than you might think for your comments and
witticisms.


4.2.4.1 The pkg/COMMENT file

A one-line description of the piece of software. There is no need to
mention the package's name - this will automatically be added by the pkg_*
tools when they are invoked.


4.2.4.2 The pkg/DESCR file

A multi-line description of the piece of software.  This should include any
credits where they are due.  Please bear in mind that others do not share
your sense of humour (or spelling idiosyncracies), and that others will
read everything that you write here.


4.2.4.3 The pkg/PLIST file

This file governs the files that are installed on your system: all the
binaries, manual pages, etc. There are other directives which may be
entered in this file, to control the creation and deletion of directories,
and the location of inserted files.


4.2.5 The scripts directory

This directory contains any files that are necessary for configuration of
your software, etc.


4.2.6 The work directory

When you type "make" the distribution files are unpacked into this
directory.  It can be removed by typing

	make clean

at the shell prompt.


4.3 CPP definitions

To port an application to NetBSD, it's usually necessary for the compiler
to be able to judge the system on which it's compiling, and we use
definitions so that the C pre-processor can do this.

The really impatient should just note that a number of the FreeBSD ports
(which are called packages in the NetBSD world) rely on the CPP definition
__FreeBSD__.  I believe that this should be used sparingly, for
FreeBSD-specific features, but unfortunately this is not always the case.
A number also rely on the fact that the CPU type is an Intel-based
little-endian CPU.

To test whether you are working on a 4.4 BSD-derived system, you should use
the BSD definition, which is defined in <sys/param.h> on said systems.
Unfortunately, it may not always be appropriate to include that header file
without checking whether it's available -

        #ifdef (defined(__unix__) || defined(unix)) && !defined(USG)
        #include <sys/param.h>
        #endif

and then you can surround the BSD-specific parts of your port using the
conditional:

	#if (defined(BSD) && BSD >= 199306)
	...
	#endif

Please use the __NetBSD__ definition sparingly - it should only apply to
features of NetBSD that are not present in other 4.4-lite derived BSDs.

You should also avoid defining __FreeBSD__=1 and then simply using the
FreeBSD port, if only from an aesthetic viewpoint (see section 4.4, FreeBSD
ports).


4.4 FreeBSD ports

It's quite possible that a FreeBSD port exists for the piece of software
you're trying to build on NetBSD.  If that is the case, it's very possible
that the FreeBSD port will work on NetBSD.  However, check that the person
who ported the software to FreeBSD has not played fast and loose with the
__FreeBSD__ cpp definition without good cause - a simple way to do this is
to do

	grep -i freebsd patches/patch-??

in the package directory.


4.5 Idiosyncracies

4.5.1 If your package uses GNU autoconf

> GNU_CONFIGURE= yes

Note that this appends --prefix=${PREFIX} to CONFIGURE_ARGS, so you don't
have to do that yourself, and this may not be what you want.


4.5.2 If your package uses imake or xmkmf

> USE_IMAKE= yes


4.5.3 You don't have to have a patches directory if you don't have any
patches, but it won't hurt you either.


4.5.4 If your package uses a different distribution method from .tar.gz:
take a look at the packages for sam, which uses a gzipped shell archive
(shar), but the quick solution is to set EXTRACT_SUFX to the name after the
DIST_NAME field, and

> EXTRACT_SUFX=   .msg.gz
> EXTRACT_CMD=            zcat
> EXTRACT_BEFORE_ARGS=
> EXTRACT_AFTER_ARGS=     |sh


4.5.5 Your package doesn't create a subdirectory for itself (like GNU
software does, for instance), but extracts itself in the current directory:
see sam again, but the quick answer is:

> NO_WRKSUBDIR=   yes


4.5.6 Your package uses a weird Configure script: See the top package, but
the quick answer is

> HAS_CONFIGURE=          yes
> CONFIGURE_SCRIPT=       Configure
> CONFIGURE_ARGS=	netbsd13


4.5.7 Your package has an HTTP URL: No problem, see the libutf and mysql
packages, just use the http URL and ftp(1) will handle it.

> MASTER_SITES=   http://www.tcx.se/ \
>                 http://www.buoy.com/mysql/ \
>                 http://web.tryc.on.ca/mysql/ \
>                 http://mysql.staufen.de/ \
>                 http://mysql.acer.net/


4.5.8 Your package builds in a different directory from its base DIST_NAME:
see tcl and tk packages:

> WRKSRC=         ${WRKDIR}/${DISTNAME}/unix


4.5.9 Your package needs to specify a different PREFIX: This can be fraught
with danger if you're using GNU configure, as (see 4.5.1)
--prefix=${PREFIX} is automatically appended to CONFIGURE_ARGS.  SO take a
look at mit-pthreads, omit GNU_CONFIGURE=yes, use HAS_CONFIGURE=yes, and
manually add the modified PREFIX to CONFIGURE_ARGS yourself:

> HAS_CONFIGURE= yes
> CONFIGURE_ARGS += ${PREFIX}/dirname


4.6 A worked example

I checked to find a piece of software that isn't in the FreeBSD ports
collection, and picked GNU bison.  Quite why someone would want to have
bison when Berkeley yacc is already present in the tree is beyond me, but
it's useful for the purposes of this exercise.

> root@pumpy:/u/pkgsrc/lang(1765)# cd /usr/pkgsrc/lang
> root@pumpy:/u/pkgsrc/lang(1765)# mkdir bison
> root@pumpy:/u/pkgsrc/lang(1766)# cd bison
> root@pumpy:/u/pkgsrc/lang/bison(1767)# cat > Makefile << EOF
> # <NetBSD RCS Id>
> # New ports collection makefile for:    bison
> # Version required:     1.25
> # Date created:         1 October 1997
> # Whom:                 agc@netbsd.org
> #
> #
>  
> DISTNAME=       bison-1.25
> CATEGORIES=     lang
> MASTER_SITES=   ${MASTER_SITE_GNU}
>  
> GNU_CONFIGURE=  yes
> MAN1=           bison.1
>  
> .include <bsd.port.mk>
> EOF
> root@pumpy:/u/pkgsrc/lang/bison(1768)# mkdir files patches pkg
> root@pumpy:/u/pkgsrc/lang/bison(1769)# make fetch
> >> bison-1.25.tar.gz doesn't seem to exist on this system.
> >> Attempting to fetch from ftp://prep.ai.mit.edu/pub/gnu//.
> Requesting ftp://prep.ai.mit.edu/pub/gnu//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/)
> ftp: Error retrieving file: 500 Internal error
>  
> >> Attempting to fetch from ftp://wuarchive.wustl.edu/systems/gnu//.
> Requesting ftp://wuarchive.wustl.edu/systems/gnu//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/)
> ftp: Error retrieving file: 500 Internal error
>  
> >> Attempting to fetch from ftp://ftp.freebsd.org/pub/FreeBSD/distfiles//.
> Requesting ftp://ftp.freebsd.org/pub/FreeBSD/distfiles//bison-1.25.tar.gz (via ftp://orpheus.amdahl.com:80/)
> Successfully retrieved file.
> root@pumpy:/u/pkgsrc/lang/bison(1770)# md5 /usr/pkgsrc/distfiles/bison-1.25.tar.gz | sed -e 's;/usr/pkgsrc/distfiles/;;' > files/md5
> root@pumpy:/u/pkgsrc/lang/bison(1771)# cat > pkg/COMMENT << EOF
> GNU yacc clone.
> EOF
> root@pumpy:/u/pkgsrc/lang/bison(1772)# cat > pkg/DESCR << EOF
> GNU version of yacc.  Can make re-entrant parsers, and numerous other
> improvements.  Why you would want this when Berkeley yacc(1) is part
> of the NetBSD source tree is beyond me.
>  
> Alistair Crooks (agc@netbsd.org)
>  
> EOF
> root@pumpy:/u/pkgsrc/lang/bison(1773)# cat > pkg/PLIST << EOF
> bin/bison
> EOF
> root@pumpy:/u/pkgsrc/lang/bison(1777)# make
> >> Checksum OK for bison-1.25.tar.gz.
> ===>  Extracting for bison-1.25
> ===>  Patching for bison-1.25
> ===>   Ignoring empty patch directory
> ===>  Configuring for bison-1.25
> creating cache ./config.cache
> checking for gcc... cc
> checking whether we are using GNU C... yes
> checking for a BSD compatible install... /usr/bin/install -c -o bin -g bin
> checking how to run the C preprocessor... cc -E
> checking for minix/config.h... no
> checking for POSIXized ISC... no
> checking whether cross-compiling... no
> checking for ANSI C header files... yes
> checking for string.h... yes
> checking for stdlib.h... yes
> checking for memory.h... yes
> checking for working const... yes
> checking for working alloca.h... no
> checking for alloca... yes
> checking for strerror... yes
> updating cache ./config.cache
> creating ./config.status
> creating Makefile
> ===>  Building for bison-1.25
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g LR0.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g allocate.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g closure.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g conflicts.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g derives.c
> cc -c -DXPFILE=\"/usr/pkg/share/bison.simple\"  -DXPFILE1=\"/usr/pkg/share/bison.hairy\" -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1  -g  ./files.c 
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g getargs.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g gram.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g lalr.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g lex.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g main.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g nullable.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g output.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g print.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g reader.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g reduce.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g symtab.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g warshall.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g version.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g getopt.c
> cc -c -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_STDLIB_H=1 -DHAVE_MEMORY_H=1 -DHAVE_ALLOCA=1 -DHAVE_STRERROR=1 -I./../include  -g getopt1.c
> cc  -g -o bison LR0.o allocate.o closure.o conflicts.o derives.o files.o         getargs.o gram.o lalr.o lex.o                                   main.o nullable.o output.o print.o reader.o reduce.o symtab.o   warshall.o version.o                                            getopt.o getopt1.o  
> ./files.c:240: warning: mktemp() possibly used unsafely, consider using mkstemp()
> rm -f bison.s1
> sed -e "/^#line/ s|bison|/usr/pkg/share/bison|" < ./bison.simple > bison.s1
> root@pumpy:/u/pkgsrc/lang/bison(1785)# make install
> >> Checksum OK for bison-1.25.tar.gz.
> ===>  Installing for bison-1.25
> sh ./mkinstalldirs /usr/pkg/bin /usr/pkg/share  /usr/pkg/info /usr/pkg/man/man1
> rm -f /usr/pkg/bin/bison
> cd /usr/pkg/share; rm -f bison.simple bison.hairy
> rm -f /usr/pkg/man/man1/bison.1 /usr/pkg/info/bison.info*
> install -c  -o bin -g bin -m 555 bison /usr/pkg/bin/bison
> /usr/bin/install -c -o bin -g bin -m 644 bison.s1 /usr/pkg/share/bison.simple
> /usr/bin/install -c -o bin -g bin -m 644 ./bison.hairy /usr/pkg/share/bison.hairy
> cd .; for f in bison.info*;  do /usr/bin/install -c -o bin -g bin -m 644 $f /usr/pkg/info/$f; done
> /usr/bin/install -c -o bin -g bin -m 644 ./bison.1 /usr/pkg/man/man1/bison.1
> ===>  Registering installation for bison-1.25
> root@pumpy:/u/pkgsrc/lang/bison(1786)# make package
> >> Checksum OK for bison-1.25.tar.gz.
> ===>  Building package for bison-1.25
> Creating package bison-1.25.tgz
> Registering depends:.
> Creating gzip'd tar ball in '/u/pkgsrc/lang/bison/bison-1.25.tgz'
> root@pumpy:/u/pkgsrc/lang/bison(1787)# make clean
> ===>  Cleaning for bison-1.25
> root@pumpy:/u/pkgsrc/lang/bison(1788)# 

Finally, please tar up and gzip the package directory (without the binary
package) and mail it to me (agc@netbsd.org), remembering to uuencode it
first.


4.7 Do-it-yourself - Gotchas

Whenever you're preparing a port from the FreeBSD collection or doing it
from scratch, there's a number of points to take care for in order to get
everything done propperly. Here is an attempt of list of all these gotchas.


4.7.1 Makefile

 - Add MANCOMPRESSED (if not already there), see comment in bsd.port.mk
 - Update MAN?; important for manpages being compressed correctly if MANZ
   is set
 - Replace /usr/local by ${PREFIX} in all Files but Makefiles (see patches
   below) 


4.7.2 pkg/PLIST

 - If there's a "@exec ldconfig ...", add an "@unexec ldconfig ...", so the
   hints-file for ld.so doesn't grow without end.
 - Add any missing @dirrm statements


4.7.3 Debugging

To check out all these gotchas, here are the steps that I do in order to
get a package working (Please note this is basically the same as above,
only with some debugging aids ;):

 - Retrieve port from FreeBSD collection
 - Fix RCS-Id: remove the '$'s around the FreeBSD RCS Id, and insert the
   word FreeBSD, then add a $NetBSD: Packages.txt,v 1.3 1997/11/13 13:47:38 hubertf Exp $ before the "FreeBSD Id ..." string

   I.e.
   before:
	# $Id: Packages.txt,v 1.3 1997/11/13 13:47:38 hubertf Exp $

   after:
	# $NetBSD: Packages.txt,v 1.3 1997/11/13 13:47:38 hubertf Exp $
	# FreeBSD Id: Makefile,v 1.17 1997/06/16 06:39:51 max Exp

 - Import unchanged FreeBSD source (ONLY if you have cvs access, not neeed
   otherwise):
   (cd ...pkgsrc/category/pkgname ; cvs import pkgsrc/category/pkgname \
	FREEBSD FreeBSD-current-yyyy-mm-dd)
 - remove tree && checkout new one (again, ONLY needed if you have cvs
   access)
 - Look at Makefile, fix if necessary
 - Look at patches, remember if not appropriate
 - have a look at pkg/PLIST, add a "@comment $NetBSD: Packages.txt,v 1.3 1997/11/13 13:47:38 hubertf Exp $" line at the beginning
   of PLIST
 - make
 - If something's not ok, fix; for patches: fix the file, then re-generate
   the diff: 'diff foo foo.orig >../../patches/patch-xx' (mv patch-xx
   patch-xx.orig before); If there's no foo.orig from a previous patch, be
   sure to have an old version of the file somewhere; re-iterate :)
 - If all builds ok: touch /tmp/bla
 - make install
 - find /usr/pkg/ /usr/X11R6/ -newer /tmp/bla >/tmp/x
 - pkg_delete blub
 - find /usr/pkg/ /usr/X11R6/ -newer /tmp/bla: if this brings up any files,
   they are missing pkg/PLIST; add them.
 - Compare pkg/PLIST against /tmp/x, fix the further one
   ( sort /tmp/x >/tmp/x2 ; sort pkg/PLIST >/tmp/P ; sdiff /tmp/x2 /tmp/P )
 - make reinstall && make package
 - pkg_delete blub
 - find /usr/pkg/ /usr/X11R6/ -type f -newer /tmp/bla shouldn't find anything
   now
 - pkg_add .../blub.tgz
 - Play with it :)
 - pkg_delete - still no file should be left (re-run above find)
 - submit (or commit, IF you have cvs access :)


###########################################################################
# Local Variables:
# mode:		Text
# fill-column:	75
# End: