.\" man page for prt-auf .\" last edited June 2022 by John McQuah, jmcquah at disroot dot org .\" .\" based on original work by Johannes Winkelmann, jw at tks6 dot net .\" .\" .PU .TH "prt-auf" "8" "" "" "" .SH "NAME" .LP prt\-auf \- add/upgrade frontend to the CRUX pkgutils, inspired by \fBprt\-get\fP(8). (see http://www.crux.nu for an overview of CRUX ports and pkgutils) .SH "SYNOPSIS" .B prt\-auf subcommand [options] .br .SH "DESCRIPTION" prt\-auf is a frontend to the CRUX pkgutils, orchestrating their operation behind the scenes and letting the user focus on higher-level objectives. It scans both the local ports tree and the installed package database, to resolve dependency relationships and to determine which installed packages are out of date. \fBprt\-auf\fP is especially relevant when you want to: .PP .TP \ \ \ \(bu add/update a package without first determining where in the ports tree its build instructions and dependencies are located .TP \ \ \ \(bu pass multiple packages on one command line for an add/update operation .TP \ \ \ \(bu show all the dependencies that would be needed by a set of packages .TP \ \ \ \(bu search for ports by name, by description, or by the files they provide .TP \ \ \ \(bu show the upstream url or the maintainer contact information .PP \fBprt\-auf\fP basically serves as an intermediary between your high-level objectives and the specific calls to pkgmk, pkgadd, and pkgrm that would achieve them. prt\-auf will search for the necessary information itself in all the port collections specified in its config file. This allows you to just request a package for installation, without caring where it actually is located on your file system. prt\-auf was inspired by \fBprt\-get\fP(8) and offers an essentially identical user experience. .PP prt\-auf automates the process of tracking down dependencies of the ports you want to install. The result of these recursive calculations can be printed as a space- or newline-separated list, or with indentation to represent the tree structure. Note that prt\-auf trusts the port maintainer to provide an accurate list of dependencies; if this list is incomplete for any of the ports in your collections, the build might fail. .PP prt\-auf has a test mode so you can see what effect an install/update operation would have. Use the \-\-test switch for this (more details in the \fBOPTIONS\fP section below). .SH "RETURN VALUE" Calling prt\-auf within a shell script sometimes requires you to check its exit status. Like most Unix tools, prt\-auf returns 0 on success and a non-zero value otherwise. A typical usage is: .B if prt\-auf isinst $SOME_PORT; then $TAKE_THIS_ACTION; fi .SH "SUBCOMMANDS" prt\-auf uses so\-called subcommands, which always have to be the first non-option argument passed. This is very similar to .B git(1). \fBsubcommand\fP can be one of the following: .TP .B install [\-\-margs=] [\-\-aargs=] [ ...] install/update all packages and their dependencies. Any currently-installed dependency is left at its current version unless explicitly given on the command line, in which case prt-auf will bring it up to date. If there have been major version changes in shared libraries since your last update, it might be advisable to run 'prt-auf update' instead. .TP .B depinst [\-\-margs=] [\-\-aargs=] [ ...] essentially a synonym for \fBinstall\fP. This subcommand is provided for the convenience of long-time \fBprt\-get\fP users, who might find it counterintuitive to see automatic dependency resolution with \fBinstall\fP. .TP .B update [\-\-margs=] [\-\-aargs=] [ ...] bring all the listed packages and their dependencies up to date. Among 'install', 'update', and 'grpinst', this action is the most permissive, exempting from updates only the locked ports in the dependency chain. You might use 'install' instead if you want a speedier compilation time, but if any dependencies have a rapid release cycle and you haven't updated in a while, there is no guarantee that your old installed dependency will provide all the functionality needed by the desired package. .TP .B grpinst [\-\-margs=] [\-\-aargs=] [ ...] install/update all packages in the listed order, but stop if pkgmk or pkgadd was unsuccessful. 'prt-auf grpinst' can be used to override the automatic dependency resolution. Among 'install', 'update', and 'grpinst', this action is the most literal, building only the requested packages and no others. Yet 'grpinst' is still smart enough to call \fBpkgadd\fP(8) with the '-u' switch, if one of the packages passed as argument is already installed. .TP .B remove [\-\-rargs=] [ ...] remove packages listed in this order. The only relevant option you might want to pass to \fBpkgrm\fP(8) is --root (or -r), used when you're managing a CRUX installation on a temporarily mounted filesystem. In order not to confuse the argument parser (which splits on whitespace), you should format such a request as .B prt\-auf remove \-\-rargs=\-\-root=/path/to/mounted/crux [ ...] and \fBprt\-auf\fP will clean up the -r switch so that \fBpkgrm\fP(8) does what you want. .TP .B sysup Update all installed packages which are outdated and not locked. .TP .B lock [...] Exempt these packages from any subsequent .B sysup operation (i.e., keep them at their currently-installed version) .TP .B unlock [...] Remove lock from these packages .TP .B listlocked List names of packages which are locked. .TP .B diff [--all] Show differences between installed packages and ports in the ports tree. Locked packages are only displayed if you use the --all switch. .TP .B quickdiff Print a simple list of packages which have a different version in the ports tree than what is installed. .TP .B search [\-\-path] [\-\-regex] Search the ports tree for .B expr in their name .TP .B dsearch [\-\-path] [\-\-regex] Search the ports tree (both name and description) for the pattern \fBexpr\fP. The search in the description is not case sensitive. Note that this requires prt\-auf to read every Pkgfile, which makes it rather slow; if you like this, consider using the cache functionality, so you only have to spend this time once after updating the ports tree has been updated. .TP .B fsearch [\-\-path] [\-\-regex] Search the ports tree for file names that match \fBpattern\fP. .SH "" When using the --regex switch with 'search', 'dsearch', or 'fsearch', \fIpattern\fP should be a Perl-compatible regular expression (e.g. prt-auf fsearch --regex 'liblz(o2|ma).*'). You can omit the --regex switch if your search pattern contains no metacharacters (such as: +, *, ., / ). Shell globbing (with the * and ? wildcards) is \fINOT\fP supported. The 'fsearch' action looks for matches against the full path, not just the filename, so if you're looking for a filename that begins with 'liblz', you should use '\\/liblz' rather than '^liblz'. .TP .B info Print available info for a port .TP .B path Print the path of a port .TP .B readme Print the port's README file if it exists .SH "" The subcommands 'info', 'path', and 'readme' expect as their argument an exact match for one of the ports in the active repositories. If you are not sure that a port by that name exists, you should first use 'search', 'dsearch', or 'fsearch' to generate a list of possible arguments. The info or readme will come from the highest-priority port in the active repositories (the same port that would be built by an 'install' command). .TP .B depends [ ...] print a recursive list of dependencies needed to install the packages passed as argument. It shows a list of the dependencies that were found in the ports tree, plus a list of the dependencies that could not be found. .TP .B quickdep [ ...] print a simple list of recursive dependencies for all the packages passed as argument. The output is formatted to be useful in command substitution, e.g. instead of running .B prt\-auf depinst xorg-server you might obfuscate your intentions with a gratuitous loop: .B for i in $(prt\-auf quickdep xorg-server); do prt\-auf isinst $i || prt\-auf install $i; done Note: output is restricted to those dependencies that can be found in the ports tree. It might be useful to run .B prt\-auf depends | grep \(dq\-\- missing packages\(dq as a first step, in order to ensure that your ports tree has everything needed for successful builds. .TP .B deptree print a tree of the dependencies of .B package. .SH "" Note that soft (optional) dependencies are NOT considered when running prt\-auf depends, prt\-auf quickdep, or prt\-auf deptree. The port maintainer often provides a README if significant loss of functionality might result from not having an optional dependency present when building, so be sure to interpret the output of .B prt\-auf in light of the information provided in such a README. .TP .B dependent print a list of ports which have .B package in their "Depends on:" line. As with .B depends, quickdep, deptree, the Pkgfile line for soft (optional) dependencies is NOT parsed during this operation, so the output might omit some of the ports that were linked against .B package during compilation. By default, output is restricted to ports that are installed. To see all hard dependencies, add the --all switch; use --recursive to get a recursive list (without duplication), and --tree to get a nicely indented one (note that --tree implies --recursive). .TP .B ls [--path] Prints out a listing of the port's directory .TP .B cat [] Prints out the file to stdout. If is not specified, 'Pkgfile' is used. .TP .B edit [] Edit the file using the editor specified in the $EDITOR environment variable. If is not specified, 'Pkgfile' is used. .SH "" Similar to 'info', 'path', and 'readme', a non-exhaustive search is performed to satisfy an 'edit', 'cat', or 'ls' command. This behaviour ensures that your edits or directory listings pertain to the port that would be built by a 'prt-auf install' command. Meanwhile, 'prt-auf dup' will let you know if any port in the active repositories is hidden by another port of the same name, but the 'dup' command offers convenient access to only some of the fields that 'info' or 'readme' would print. .TP .B dup [format string] List ports which can be found in multiple directories configured in .B /etc/prt-get.conf The optional format string can contain any of the following variables, allowing you to see at a glance how the ports differ. .TP \ \ \ \(bu %n \-> name .TP \ \ \ \(bu %p1, %p2 \-> path to the {higher, lower}-priority port .TP \ \ \ \(bu %v1, %v2 \-> version of the {higher, lower}-priority port .TP \ \ \ \(bu %u1, %u2 \-> upstream URL of the {higher, lower}-priority port .TP \ \ \ \(bu %M1, %M2 \-> maintainer of the {higher, lower}-priority port .TP .B list [\-v|\-vv] List ports available in the ports tree. It's basically the same as .B ports \-l but looks in all directories specified in the config file. .TP .B printf [\-\-regex] [\-\-filter=] Print formatted port list. can contain variables, which are replaced like this: .TP \ \ \ \(bu %n \-> name .TP \ \ \ \(bu %p \-> path .TP \ \ \ \(bu %v \-> version .TP \ \ \ \(bu %r \-> release .TP \ \ \ \(bu %d \-> description .TP \ \ \ \(bu %e \-> dependencies .TP \ \ \ \(bu %u \-> URL .TP \ \ \ \(bu %P -> Packager .TP \ \ \ \(bu %M -> Maintainer .TP \ \ \ \(bu %R -> Readme ("yes"/"no") .TP \ \ \ \(bu %E -> pre-install script ("yes"/"no") .TP \ \ \ \(bu %O -> post-install script ("yes"/"no") .TP \ \ \ \(bu %l -> is locked ("yes"/"no") .TP \ \ \ \(bu %i \-> "no" if not installed, "yes" if it's installed and up to date and "diff" if it's installed and a new version is in the ports tree. Use "\\n" and "\\t" to format your output. To restrict the list to package names matching a desired pattern, you can specify \fB\fP. Metacharacters in the filter are only respected if you pass the --regex option, in which case your filter should be a Perl-compatible regular expression. .TP .B listinst [\-v|\-vv] List installed ports. It's basically the same as .B pkginfo \-i, but omits version when called without verbose (\-v, \-vv) switch. \-v adds version information, \-vv adds version and description. .TP .B listorphans List installed ports which do not appear in the "Depends on:" line of any other port currently installed. Output is sorted first by repository and then alphabetically, so you should pipe it to \fBsort\fP(1) if you plan to use it in a \fBcomm\fP(1) command as in the .B EXAMPLES section below. Note that some core ports might be runtime dependencies despite their absence in the "Depends on:" line; see \fBPkgfile(5)\fP for an explanation of this practice. Also remember that this operation does NOT account for soft (optional) dependencies. Removing a non-core package returned by this command might require a rebuild of other packages; use revdep(1) to locate such breakage. .TP .B isinst [ ...] Check whether each package given on the command line is installed. Output in the case of multiple arguments is separated by newlines, suitable for processing by awk or grep. Similar to .B pkginfo \-i|grep \-E '^(package1|package2|...)' but does not print the version information. This command has a return value of 0 if all packages given as argument are installed, otherwise a return value greater than 0. .TP .B current [ ...] Show the currently-installed version of , or a message that is not installed. Also takes more than one package as argument. .TP .B help Show a help screen .TP .B version Show the current version of prt\-auf .TP .B cache Create a cache file from the ports tree, which will be used whenever \fBprt\-auf\fP is invoked with the --cache option. Remember to run \fBprt\-auf cache\fP each time you update the ports tree, or automate this step by appending a line to the \fBports\fP(8) script. If you invoke \fBprt\-auf\fP from a symbolic link that ends in 'cache', \fBprt\-auf\fP will act as if it saw the --cache option on the command line, so the symbolic link \fBprt\-cache\fP -> \fBprt\-auf\fP will save you the hassle of typing '--cache' each time. Cache files generated by \fBprt\-auf\fP are fully compatible with those generated by \fBprt\-get\fP(8). .SH "OPTIONS" The following options are primarily useful for install/update transactions. .TP .B \-\-test Do not actually run pkgmk/pkgadd/pkgrm, just print the commands that would have run .TP .B \-fr Force rebuild, Implies 'pkgmk -f'; same as --margs=-f .TP .B \-us Update signature, implies 'pkgmk -us'; same as --margs=-us .TP .B \-is Ignore signature, implies 'pkgmk -is'; same as --margs=-is .TP .B \-uf Update footprint, implies 'pkgmk -uf'; same as --margs=-uf .TP .B \-if Ignore footprint, implies 'pkgmk -if'; same as --margs=-if .TP .B \-ns No stripping, implies 'pkgmk -ns'; same as --margs=-ns .TP .B \-kw Keep working directory, implies 'pkgmk -kw'; same as --margs=-kw .TP .B \-\-margs="...", e.g. \-\-margs="\-im" Pass these additional arguments to pkgmk; note that \-d is already passed to pkgmk anyway. .TP .B \-\-aargs="...", e.g. \-\-aargs="\-f" Pass these additional arguments to pkgadd .TP .B \-\-cache Use cache file for this command .SH "" The following options affect the output of non-install (information-seeking) transactions. .TP .B \-v, \-vv (verbosity level) Show version of a port (\-v), or show both version and description (\-vv). Passing more than one of these options is equivalent to \-vv. .TP .B \-\-path Show path info for the ports found by a search or a dependency calculation .TP .B \-\-regex Interpret filter and search pattern as regular expression .SH "CONFIGURATION" Most of the directives available in prt\-get.conf(5) are also recognized and respected by \fBprt\-auf\fP. Notably, you can specify the active port collections by ensuring that they appear on lines beginning with 'prtdir '. You can also toggle the running of pre-/post-install scripts by editing the line that contains 'runscripts'. You can specify alternatives to the default pkgutils programs ( /usr/bin/pkgmk, /usr/bin/pkgadd, and /usr/bin/pkgrm ) by editing the lines for 'makecommand', 'addcommand', and 'removecommand', respectively. Lastly, you can control whether the pkgmk output is saved in a log file, using the directives 'writelog ', 'logmode ', and 'logfile '. The in a 'logfile' directive can contain any of the variables "%n", "%v", "%r", and "%p", which are automatically replaced by the port's name, version, release, and full path in the ports tree, respectively. .SH "TECHNICAL DETAILS" \fBprt\-auf\fP aims to recreate the familiar experience of \fBprt\-get\fP(8), in a tidy Perl program that novice CRUX hackers would find less intimidating. By keeping its inner workings entirely within one file, \fBprt\-auf\fP makes it easier for CRUX newcomers to understand the architecture of the \fBports\fP(8) system and the \fBpkgutils\fP. One intended consequence of the less-intimidating code base is that bug reports and feature requests can receive the attention of more CRUX users, rather than just the handful of developers who have C++ experience. In order to facilitate the insertion of new code to satisfy any feature requests, this section provides an outline of the \fBprt\-auf\fP design. The program begins by declaring all the variables that are shared among subroutines. Some of these variables are initialized right away, but other variables are only initialized once the program knows the requested action. After all the arguments are parsed (and screened for validity), the hash maps \fI%opkg\fP, \fI%odepends\fP, \fI%osearch\fP, and \fI%olog\fP will retain in memory the user's desired settings. Then the relevant data structures are populated from the files on disk (the cache, if \-\-cache was passed on the command line, the database of installed packages in /var/lib/pkg, the list of locked ports, the list of aliases, or each \fBPkgfile\fP(5) found in the ports tree). Control is now passed to the subroutine that satisfies the given request. Many of these subroutines return a simple array of strings, most notably the subroutions \fIlist_ports()\fP, \fIdeporder()\fP, and \fIport_diff()\fP. But the \fIup_inst()\fP subroutine returns references to five different arrays, so that post-processing can provide informative output regarding which ports were successfully installed, and which ports failed. The final section of the main program (post-processing) considers the distinctive output of each subroutine and customizes the handling of the \fI@results\fP array accordingly. This section is also where the verbose switch (-v|-vv) is taken into account, appending to each element of \fI@results\fP the version or description of the ports found in the search. .SH "CONTRASTS BETWEEN PRT-AUF and PRT-GET" Although taking inspiration from \fBprt\-get\fP for its interface and configuration, \fBprt\-auf\fP diverges from its predecessor in a few notable ways. Some of these differences are mere omissions, which can easily be incorporated at a later date. Long-time users of \fBprt\-get\fP will quickly observe the following differences: .PP .TP .B mixed install/update mode. Packages given on the command line can be present or not, and \fBprt\-auf\fP will figure out the right way to call \fBpkgadd\fP(8) for each one. The key distinction is that 'install' mode will not try to update an out-of-date package found in the dependency chain unless that package also appears on the command line. .TP .B merged install and depinst. For the convenience of new users who might find it surprising to have an 'install' command fail due to missing dependencies, the 'install' subcommand now does exactly what 'depinst' used to do in \fBprt\-get\fP. The original behaviour of \fBprt\-get install\fP can be approximated by the 'grpinst' action of \fBprt\-auf\fP, except that a 'grpinst' action will not proceed to the next package if a build fails. .TP .B no version comparator. One of the main reasons to run CRUX is to stay current with the latest stable versions endorsed by the port maintainers. (They subscribe to the upstream mailing lists so you don't have to.) If you want to keep a particular piece of software at a different version than the one chosen by its original maintainer, you can maintain a shadow port in your own overlay (and put that overlay higher in the config file). .TP .B no wildcards or shell globbing in the search commands. Being written in Perl, \fBprt\-auf\fP automatically inherits a rich set of routines for dealing with regular expressions. When paired with the case-insensitive pattern matching of purely-alphanumeric queries, the Perl regexp engine offers CRUX users enough flexibility to find any port they're looking for, without needing to clutter the code base by reimplementing shell wildcards. .TP .B no "--ignore" switch. This feature is easy enough to add at a later date, but a newcomer to CRUX will likely be confused at having such fine-grained control over the automatic dependency resolution. The two main reasons to use "--ignore" (an erroneous "Depends on" line, or a satisfaction of the dependency by manual installations that pkgutils is not aware of), are both more properly addressed by a long-term solution rather than a one-time fix. If the "Depends on" line is truly in error, the CRUX user should contact the port maintainer and get it fixed for everybody, rather than passing the "--ignore" option and letting the error go uncorrected. If the dependency was satisfied by a manual installation outside of pkgutils, a better response is to make a dummy port and create an entry in the aliases file. That way prt-auf will treat the dependency as satisfied for any subsequent installations on the same machine, and passing the "--ignore" option will be unnecessary for all future ports with the same dependency. The canonical example of a line in the aliases file is \ \ \ \ \ rust-bin: rust which tells \fBprt\-auf\fP that an installed copy of rust-bin is sufficient to proceed with the compilation of a port that mentions rust in its "Depends on" line. .SH "EXAMPLES" .TP .B prt\-auf install irssi Download, build and install irssi, with one simple command .TP .B prt\-auf install paper yasm Install paper and yasm (and any needed dependencies). .TP .B prt\-auf update bmake cmake Update bmake and cmake. Abort with an informative error message if either package is not yet installed, allowing you to issue a revised command. .TP .B prt\-auf update -fr openssh Update your current version of openssh, forcing a rebuild even if no version difference is detected. Useful if there was a major version change in one of its dependencies, and \fBrevdep openssh\fP indicates a broken package. :\-) .TP .B prt\-auf info glib-networking Show info about glib-networking .TP .B MISSLIBS=$(revdep -vvv mpv | awk -F ':' '/(missing library)/ {print $3}'); [ -n \(dq${MISSLIBS[@]}\(dq ] && for i in ${MISSLIBS[@]}; do prt\-auf fsearch $i; done (adapted from a script by ppetrov^) Check for the presence of the runtime libraries needed by mpv. If any are absent, search the footprints to determine which ports provide the missing libraries. .TP .B prt\-get search --regex '^(m|n|p)c.*' Return a list of all ports whose names start with "mc", "nc", or "pc" .TP .B prt\-auf dsearch irc Return a list of all ports having "irc" in their name or description .TP .B comm -13 <(ls /usr/ports/core) <(prt-auf listorphans) (based on comments from Romster and jue) Filter out the core ports from the list of orphans, in shells (like bash) that support process substitution .TP .B comm -13 <(cat ~/.keepers <(ls /usr/ports/core) | sort) <(prt\-auf listorphans) | xargs prt\-auf remove (system-hosing extension of the above) A one-liner inspired by \fBpkg\-clean\fP and \fBpkgfoster\fP, but without the safeguard of interactivity. \fBDo not try this on a mission-critical system.\fP .TP .B prt\-auf isinst $(prt\-auf quickdep $(prt\-auf quickdiff)) | awk '/not installed/ {print $2}' (adapted from a comment by Fun) After updating your ports tree, print out a list of dependencies that were not needed the last time you built your currently-installed ports, but are needed now by the newer versions of these ports. The output of this command is sorted by dependencies, therefore suitable for piping to \fBxargs prt\-auf install\fP or \fBxargs prt\-auf grpinst\fP. .TP .B prt\-auf grpinst $(prt\-auf quickdep graphviz) Installed all packages needed for graphviz . Remember that grpinst stops installing when one package installation fails. .TP .B prt\-auf listinst | xargs prt\-auf depends | xargs prt-auf grpinst \-\-aargs="\-r=/mnt" Sort the list of installed packages by dependencies, and then install all those packages onto a backup filesystem (mounted at /mnt). If you have a customized pkgadd.conf that you want applied to this operation, either copy it to /mnt/etc where pkgadd will be looking for it, or pass the additional option \-\-aargs=\(dq\-c /etc/pkgadd.conf\(dq to the grpinst command. .TP .B prt\-auf list --path --regex '^xorg.*' | grep -v "/usr/ports/xorg" Show the ports whose names begin with xorg, but which appear outside the xorg port collection. (At the time of writing, this command returned at least two font ports.) .SH "AUTHORS" John McQuah , based on the prt\-get manpage by Johannes Winkelmann, and other sources cited inline. .SH "SEE ALSO" prt\-get.conf(5), Pkgfile(5), pkgmk(8), pkgadd(8), pkgrm(8), ports(8)