Manually registering dependencies for ports
b. f.
bf1783 at googlemail.com
Mon Jun 7 01:30:42 UTC 2010
>Hello,
>
>I've been wondering about something: When I write a script or webapp that
>needs some port to run, like a perl module, I install the needed port and
>life is good (tm). A year later when I've completely forgotten about the
>script I go do some spring-cleaning of the ports on the server, and I see
>some perl module that doesn't have any dependencies, and delete it. Fast
>forward a few days when I discover the script doesn't work anymore, cue
>face-palm, remove bullet from foot, etc.
>
>Is there some way I can register a dependency to prevent this ? Like
>adding a flag to an installed port to say "something outside of the ports
>system depends on this" along with a user specified comment string. A
>system like that could result in something like this:
>
>pkg_delete -x p5-something
>pkg_delete: p5-something cant be uninstalled because: "somescript.pl uses
>this module, for the love of everything good do not delete it"
Yeah, there is. If you don't want to make a local port for your
script/program with the module listed as a dependency, then don't muck
about +REQUIRED_BY and friends -- that's a pain. Instead, you can use
a "package requirements procedure" -- a script or program that is
executed before installation/deinstallation, and if it returns
non-zero exit status, the installation/deinstallation aborts. You can
read about it in pkg_create(1) (look at the -r flag), and
pkg_delete(1), of course. For example, say you have a script called
/home/foo that requires a port /usr/ports/devel/bar. Add something
like the following script as /usr/ports/devel/bar/pkg-req:
#!/bin/sh
if [ "x$1" = "x" ]; then
exit 1;
fi
if [ "x$2" = "xINSTALL" ]; then
exit 0;
elif [ "x$2" = "xDEINSTALL" ]; then
if [ -f /home/foo ] ; then
echo "/home/foo requires this package; aborting deinstallation; use
-f to override"
exit 1
else
exit 0
fi
else
exit 1
fi
When you rebuild and reinstall devel/bar, this script will be added as
/var/db/pkg/bar-1.0/+REQUIRE, for example. You can add it manually if
bar-1.0 is already installed, and it will take effect when pkg_delete
acts on bar-1.0, even without rebuilding.
Obviously, you can make this more elaborate: it could examine a list
of dependent programs contained in a file that you can edit, and check
for each one of them in your PATH, or in specified places. You could
edit this list at any time, and the +REQUIRE script would still work.
You can keep the script in a location other than
/usr/ports/devel/bar/pkg-req, just by using something like:
.if${.CURDIR:M*/usr/ports/devel/bar*}
PKGREQ="insert full path to script here"
.endif
in /etc/make.conf, because /usr/ports/Mk/bsd.port.mk will use PKGREQ
along with the -r flag in the "do-package" target.
You are always free to tie a string around your finger. Just don't
tie it too tightly.
Regards,
b.
More information about the freebsd-ports
mailing list