From owner-freebsd-ports Wed Sep 22 10:28:12 1999 Delivered-To: freebsd-ports@freebsd.org Received: from news.uni-kl.de (news.uni-kl.de [131.246.137.51]) by hub.freebsd.org (Postfix) with SMTP id 403B615523; Wed, 22 Sep 1999 10:27:54 -0700 (PDT) (envelope-from naddy@unix-ag.uni-kl.de) Received: from sushi.unix-ag.uni-kl.de ( root@sushi.unix-ag.uni-kl.de [131.246.89.13] ) by news.uni-kl.de id aa29932 ; 22 Sep 1999 19:29 MESZ Received: from fettuccini.unix-ag.uni-kl.de (fettuccini.unix-ag.uni-kl.de [131.246.89.27]) by sushi.unix-ag.uni-kl.de (8.9.1a/8.9.1) with ESMTP id TAA28972; Wed, 22 Sep 1999 19:27:42 +0200 Received: (from naddy@localhost) by fettuccini.unix-ag.uni-kl.de (8.9.3/8.9.3) id TAA26348; Wed, 22 Sep 1999 19:27:50 +0200 (CEST) (envelope-from naddy) Date: Wed, 22 Sep 1999 19:27:50 +0200 From: Christian Weisgerber To: Satoshi - Ports Wraith - Asami Cc: freebsd-ports@freebsd.org Subject: Re: Port Making Program Message-ID: <19990922192750.A96298@fettuccini.unix-ag.uni-kl.de> References: <19990921133230.A43770@cichlids.cichlids.com> <7saaf3$5r5$1@bigeye.rhein-neckar.de> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="fUYQa+Pmc3FrFX/N" X-Mailer: Mutt 0.95.4i In-Reply-To: ; from Satoshi - Ports Wraith - Asami on Wed, Sep 22, 1999 at 04:26:35AM -0700 Sender: owner-freebsd-ports@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Satoshi - Ports Wraith - Asami: > * OpenBSD has a "plist" target in its bsd.port.mk. Rather than > * rewriting this facility from scratch, it could just be ported. > * I can take a look at this later today. > > That will be great. It's always nice to borrow something from the > other *BSD's. :) Here we go... The modifications to bsd.port.mk are minor; an additional cookie is introduced along with a "plist" target that calls Marc Espie's make-plist Perl script. That script again required only small changes. The main difference to OpenBSD is that they include the man pages in the PLIST. We skip ${MANPREFIX}/man in the find. A patch with the changes is appended. I tried it out with a couple of ports. Some more people ought to bang on it. I do not claim to have any understanding whatsoever of the bsd.port.mk internals. ;-) Here's the relevant section from : | 17. Create pkg/PLIST | | After the install is complete use the developer's command: | | make plist | | which makes the file PLIST-auto in the pkg directory. This | file is a candidate packing list. Beware: the files are found | by timestamp. This means it does NOT: | | o list any files installed with `tar' as their timestamp | will not change and thus won't be found by `find' | | o update the info/dir file if .info files are added. | You'll have to add that by hand. Also, be sure that | the info/dir is not part of the PLIST. | | o try to do anything special with links or symbolic links. | A cursory test of tar shows it does the right thing | with links and symbolic links so I don't see why we | need to special case anything in the packing list. But | still... | | Peruse `PLIST-auto' and verify that everything was installed | and that it was installed in the proper locations. Anything | not installed can be added to a port Makefile `post-install' | rule. | | Copy `PLIST-auto' to `PLIST' -- Christian "naddy" Weisgerber naddy@unix-ag.uni-kl.de --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="plist.patch" --- Mk/bsd.port.mk.orig Wed Sep 22 06:12:55 1999 +++ Mk/bsd.port.mk Wed Sep 22 19:05:21 1999 @@ -675,6 +675,7 @@ # there is no way to refer to them cleanly from within the macro AFAIK. EXTRACT_COOKIE?= ${WRKDIR}/.extract_done CONFIGURE_COOKIE?= ${WRKDIR}/.configure_done +INSTALL_PRE_COOKIE?=${WRKDIR}/.install_started INSTALL_COOKIE?= ${WRKDIR}/.install_done BUILD_COOKIE?= ${WRKDIR}/.build_done PATCH_COOKIE?= ${WRKDIR}/.patch_done @@ -1771,7 +1772,8 @@ .endif @if [ -d ${PREFIX}/info -a ! -f ${PREFIX}/info/dir -a -f /usr/share/info/dir ]; then \ ${SED} -ne '1,/Menu:/p' /usr/share/info/dir > ${PREFIX}/info/dir; \ - fi + fi + @touch ${INSTALL_PRE_COOKIE} .endif @cd ${.CURDIR} && ${MAKE} ${__softMAKEFLAGS} ${.TARGET:S/^real-/pre-/} @if [ -f ${SCRIPTDIR}/${.TARGET:S/^real-/pre-/} ]; then \ @@ -1947,7 +1949,7 @@ .if !target(reinstall) reinstall: - @${RM} -f ${INSTALL_COOKIE} ${PACKAGE_COOKIE} + @${RM} -f ${INSTALL_PRE_COOKIE} ${INSTALL_COOKIE} ${PACKAGE_COOKIE} @DEPENDS_TARGET="${DEPENDS_TARGET}" ${MAKE} install .endif @@ -2117,6 +2119,18 @@ exit 1; \ fi) ; \ fi +.endif + +# Packing list utilities. This generates a packing list from a recently +# installed port. Not perfect, but pretty close. The generated file +# will have to have some tweaks done by hand. +# +.if !target(plist) +plist: install + @PREFIX=${PREFIX} LDCONFIG="${LDCONFIG}" MTREE_FILE=${MTREE_FILE} \ + INSTALL_PRE_COOKIE=${INSTALL_PRE_COOKIE} \ + SETENV="${SETENV}" MANPREFIX=${MANPREFIX} \ + ${PERL} ${PORTSDIR}/Tools/make-plist > ${PLIST}-auto .endif ################################################################ --- /dev/null Wed Sep 22 19:07:42 1999 +++ Tools/make-plist Wed Sep 22 19:00:03 1999 @@ -0,0 +1,163 @@ +#!/usr/bin/perl -w + +# $FreeBSD$ +# $OpenBSD: make-plist,v 1.2 1999/07/29 14:01:12 espie Exp $ + +# Copyright (c) 1999 Marc Espie +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the OpenBSD project +# +# 4. Neither the name of the OpenBSD project nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + + +use strict; + + +use File::Find; + +my (%newdir, %occupied, %ldconfig, %infodir, @files); + +# compare all files against this date +my $date = (stat $ENV{INSTALL_PRE_COOKIE})[10]; + +# prefix to remove from everything +my $base = $ENV{PREFIX}; + +# skip man pages +my $manprefix = "$ENV{MANPREFIX}/man"; + + +# read an mtree file, and produce the corresponding directory hierarchy +sub parse_mtree { + # start under current PREFIX, usually + my $current = shift; + local(*FILE); + my %mtree; + open FILE, $ENV{MTREE_FILE}; + while() { + chomp; + s/^\s*//; + next if /^\#/ || /^\//; + s/\s.*$//; + next if /^$/; + if ($_ eq '..') { + $current =~ s|/[^/]*$||; + next; + } else { + $current.="/$_"; + } + $_ = $current; + while (s|/\./|/|) {} + $mtree{$_} = 1; + } + close FILE; + return \%mtree; +} + +sub strip { + local($_) = shift; + s|^\Q$base\E/||; + return $_; +} + +sub add_info { + my ($header, $infodir) = @_; + for my $d (sort (keys %$infodir) ) { + for my $f (sort @{$infodir->{$d}}) { + my $d2 = strip($d); + print "$header --info-dir=\%D/$d2 \%D/$d2/$f\n"; + } + } +} + + +# recursive traversal: mark specific `info' dirs, `ldconfig' dirs, +# and potentially modified dirs + +find( + sub { + if ($File::Find::dir eq $manprefix) { + $File::Find::prune = 1; + return; + } + my $cdate = (lstat $_)[10]; + if ($cdate >= $date) { + if (-d _) { + $newdir{$File::Find::name} = 1; + } else { + push(@files, $File::Find::name); + if (/\.so\.\d+(\.\d+)?$/) { + $ldconfig{$File::Find::dir} = 1; + } + if (/\.info$/) { + my $d = $File::Find::dir; + $infodir{$d} = [] unless defined $infodir{$d}; + push(@{$infodir{$d}}, $_); + } + } + } else { + $occupied{$File::Find::dir} = 1; + } + }, $base); + + +# occupied marks a dir that was already there... +# so all parents had to be around too +for my $d (keys %occupied) { + while ($d ne '') { + undef $newdir{$d} if defined $newdir{$d}; + $d =~ s|/.*?/?$||; + } +} + +# make sure mtree is removed +my $mtree = parse_mtree($base); +for my $d (keys %$mtree) { + undef $newdir{$d} +} + +add_info('@unexec install-info --delete', \%infodir); + +for my $f (sort @files) { + print strip($f), "\n" unless ($f =~ m|/dir$|) && (defined $infodir{$`}); +} + +for my $d (sort { $b cmp $a } (grep { $newdir{$_} } (keys %newdir) ) ) { + print "\@dirrm ",strip($d), "\n"; +} + +my $setenv = $ENV{SETENV}; +my $ldconfig = $ENV{LDCONFIG}; + +for my $d (sort (keys %ldconfig)) { + print "\@exec $setenv OBJFORMAT=%%PORTOBJFORMAT%% $ldconfig -m %D/", strip($d), "\n"; + print "\@unexec $setenv OBJFORMAT=%%PORTOBJFORMAT%% $ldconfig -R\n"; +} + +add_info('@exec install-info', \%infodir); + --fUYQa+Pmc3FrFX/N-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-ports" in the body of the message