Herr Bischoff

Dump All Set FreeBSD Port Options

Today I needed to dump all options set or unset for FreeBSD ports on one machine, as part of troubleshooting a build.

The script and command below prints out all previously set options in a make.conf compatible format. This enables you to create pre-configured option setups that can easily be ported from one machine or jail to the next by copying only make.conf instead of the whole /var/db/ports folder structure. Obviously only set the ones you absolutely require, otherwise it will easily break on changes.

# process.sh

#!/bin/sh

FILE=$1

NAME=`echo $FILE | sed -E 's#/var/db/ports/(.*)/.*#\1#'`

cat $FILE | \
    sed -E '/^_|^#/d' | \
    sed -E "s/OPTIONS_FILE/$NAME/"
find '/var/db/ports/' -name 'options' -exec ./process.sh '{}' \;

The resulting variables look like this

x11-toolkits_gtk30_UNSET += ATK_BRIDGE

as opposed to the global variable

OPTIONS_UNSET += ATK_BRIDGE

When you provide a port-specific option variable, you can greatly increase the granularity of port options. To the best of my knowledge, this is not documented in the FreeBSD handbook, the make.conf man page or usr/share/examples/etc/make.conf.

Finally, it is certainly possible to cram all this into a one-liner but having to manually unpack and parse what it does is not worth the effort. I like minimal cognitive overhead at the expense of compactness or cleverness.