Dependencies of Freeradius 2.0.5

David Wood david at
Mon Jun 23 22:43:51 CEST 2008

Hi Leander,

In message <485EF043.70208 at>, Leander S. 
<leander.schaefer at> writes
>Thank you very much for your work David!
>But I rather want to compile it by myself, because:

>a) I don't want to update all my ports, because than I am "supposed" to 
>update my RELEASE version of FreeBSD to an STABLE version and reinstall 
>all packages and re-check my configuration files in etc ... bla bla ... 
>(it's a production server)

What I was suggesting is nothing like as drastic as that.

You do not need to update your operating system at all. You can leave 
your OS on any supported version for the ports tree - that's any -STABLE 
branch that isn't End of Life, or any -RELEASE that isn't End of Life. 
7.0-RELEASE is supported. The ports tree only drops support for a 
particular version once that version of FreeBSD reaches its End of Life 
date, which is when the FreeBSD Security Officer ceases security support 
for that release or branch of the operating system.

You only need to update those ports that have changed - not every port 
on the system. portupgrade or portmaster make the task of keeping your 
ports up to date easy. I recommend portmaster where possible, as it has 
no dependencies (it's a shell script, rather than the Ruby of 
portupgrade), also it's much more modern and better maintained. However, 
it lacks some of the features of portupgrade.

The only reason that I warned you that a substantial portion of your 
ports would need to be rebuilt (but not necessarily upgraded to a new 
version) is because the version of gettext in the ports tree has been 
upgraded. This means the version of the libintl shared library has been 
bumped - and the only way to ensure everything is using that new version 
is to rebuild everything that depends on gettext.

You should get into the habit of reading /usr/ports/UPDATING every time 
you upgrade your ports tree before you rebuild or upgrade anything; that 
is where you are alerted to anything you need to be aware of - like the 
change in gettext and what it means.

As a system administrator, you can choose your own trade off between how 
often you update your ports tree and upgrade your ports. You might get 
away with cherry picking one port and upgrading just that - but that 
gets increasingly less likely to work the longer it is since you rebuilt 
your ports tree. Eventually important build dependencies are too old and 
need to be rebuilt, or a new version of a port requires a feature or bug 
fix in a dependency that you haven't built, at which point you really 
need to bring all your ports up to date. If you haven't brought your 
ports up to date for some time, you may then be facing a huge number of 
updates. Arguably the more conservative option is to update your ports 
on a schedule, so that the process of change is more gradual.

There's a philosophical point here. The ultra conservative option is 
that adopted by the likes of RedHat Enterprise Linux. RHEL ships with 
particular versions of third party software that are essentially frozen 
for the lifetime of a particular version of the OS. RedHat takes it upon 
themselves to back port any necessary fixes.

This stops the system administrator being surprised by changes in third 
party software as they keep their system up to date. However, it means 
that the versions used get increasingly out of date with respect to 
releases from the third party vendors. The problem you're experiencing 
may have been fixed in a later version than is supported for your 
particular OS.

In other words, the ultra conservative option might actually be a 
liability - because you can finish up building software by yourself to 
get fixes that you need. Some of the versions supplied on old but still 
maintained versions of these operating systems are ancient - look at the 
number of threads on this mailing list that finish up with 'that version 
is old and buggy - upgrade'. It also means that when you do upgrade your 
OS, all your software goes through a significant version jump.

FreeBSD doesn't have the developer and maintainer time available to keep 
a versioned ports tree in the RedHat Enterprise Linux type model. There 
is one ports tree. You can try to cherry pick individual ports to 
upgrade, but if you come unstuck, you will probably receive no support 
beyond the advice to 'upgrade to the latest version of the ports tree 
and try again'.

To help the system administrator, ports are not allowed to touch 
configuration files that the user has changed when you upgrade them. The 
only problem comes if the upgraded port doesn't understand your 
customised configuration for an old version - but that's a problem with 
the ported software, not FreeBSD or the ports tree.

My personal strategy to keep proper version control of configurations, 
and to back-port changes in port configurations when I upgrade from one 
version to another is to use Subversion. I keep sample port 
configurations in vendor branches in Subversion, and svn merge any 
changes back to my live configurations. See the bit in the Subversion 
book (available free online) about Vendor Branches for more details.

There's no need to use a version control system. You can handle this any 
way you like, including ignoring any changes in the sample 
configurations of your ports until you hit problems - though I do not 
recommend this, not least as some of the bug fixes or new functionality 
may depend on changes in the sample configuration.

Alan de Kok has recommended keeping FreeRADIUS configurations in a 
version control system several times to my memory.

Clean copies of the sample configuration are installed elsewhere for 
your reference - if there's one or two files, they may be installed in 
/usr/local/etc with .sample or .example added to the file name. As 
FreeRADIUS has such an extensive configuration, it puts the sample 
configuration in its examples folder - by default, that's 

There is a particular problem for the 2.0.3 to 2.0.5 upgrade that I'm 
solving once and once only in this version.

Historically the behaviour of the FreeRADIUS port on uninstallation has 
been to go through /usr/local/etc/raddb and remove any individual files 
that are the same as the sample file installed. What is left behind in 
this system are just the files you have changed. When you install a new 
version of the port, any missing files in /usr/local/etc/raddb are 
copied from the sample configuration.

The advantage of this is that you get updated versions of files you 
haven't customised. That is also a disadvantage - in that you finish up 
with a configuration based on mixed versions of sample files that may 
have weird compatibility issues.

With the move to modules having their own configuration files in 2.0.5, 
the old behaviour is untenable - anyone who has configured the server 
would finish up with two configurations for the modules (one in 
radiusd.conf, one in the modules directory), and the configurations in 
the modules directory not linked in to the server. That is confusing, to 
put it mildly.

 From 2.0.5 onwards, the port will remove the entire configuration when 
it is uninstalled - but only if it's unmodified (it does make allowance 
for the certs folder being bootstrapped). If any part of the 
configuration has been modified, it is left alone. On installation, the 
port installs a clean configuration if you don't already have one in 
/usr/local/etc/raddb - otherwise it does nothing.

However, I can't change the behaviour of older versions of the port on 
uninstallation - they will remove unmodified files in 
/usr/local/etc/raddb. The only way out of this is a message in 
/usr/ports/UPDATING to tell users to back up their configuration (or 
move it to another location than the default) whilst they upgrade the 
port. After upgrading to 2.0.5 (or later), you can then delete the newly 
installed configuration in /usr/local/etc/raddb and put their old 
configuration back. It's a one-time operation - the problem will not 
recur because of changing the behaviour of the port.

If you land up with a partial configuration, you still have your changed 
files; the problem is just missing unchanged files.

You can try to cherry pick individual ports to upgrade, but this can be 
problematic. There isn't sufficient effort available within the FreeBSD 
project to branch the ports tree. In particular, there is no notion of 
-RELEASE branches of the ports tree.

FreeBSD adopts a different model to the likes of RedHat Enterprise 
Linux, where RedHat takes on the support of the versions of third party 
software they shipped. The vendor back-ports security patches and any 
essential bug fixes to the versions they shipped. This is a conservative 
option, in that you won't be surprised by changes in third party 
software, but it leads to increasing divergence from the 'state of the 
art' in that software.

To help reduce the overhead of updating ports, no port is allowed to 
touch configuration files that the user has changed.

>b) I might need to upgrade FreeRADIUServer in future ... and _only_ 
>FreeRADIUServer .. so it might be a good exercise for me to get know 
>about how to compile FreeRADIUServer and also of the dependencies I'll 
>need in my case to be a little more independent and flexible of the 
>provided binary packages of FreeBSD.

I suggest not using the binary packages - I'm talking about ports 
really. You can't use a binary package if you want PostgreSQL support.

FreeRADIUS is relatively awkward to build correctly on FreeBSD.

FreeBSD uses -pthread for threading libraries. You should not use 
-lpthread on FreeBSD, as the toolchain and dynamic linker do the right 
thing with -pthread alone.

The issue here is that there are several threading libraries on FreeBSD 
(up to three, depending on the OS version) and you should leave the 
dynamic loader to follow its configuration rather than force dependency 
on libpthread.

files/patch-pthread in the port patches three files to fix 
this, which then need rebuilding with autoconf. It also patches the for rlm_python to deal with libpython being threaded by 
default on FreeBSD - that really needs rebuilding with autoconf, too.

I have offered this patch to the FreeRADIUS developers, but Nicolas 
Baradakis rejected it - if I remember rightly with a comment along the 
lines of not wanting to obfuscate the autoconf stuff for one operating 
system. I had hoped that the patch was clear, transparent and properly 
commented <sniff>.

I hereby offer it again - will bring up a 
clean copy of the patch from FreeBSD's CVSweb that should apply cleanly 
against FreeRADIUS HEAD. I would be very grateful if this was applied to 
the FreeRADIUS CVS. Maybe I should open a bug for it on

I'm going to leave it out of the instructions below, because it's rather 
tricky to get the autoconf port working outside the ports framework.

You must use GNU make, not BSD make - this can come from the devel/gmake 
port. BSD make has a different syntax for conditionals that is 
incompatible with FreeRADIUS's makefiles.

configure needs quite a few arguments passed to it to be compliant with 
hier(7) and to find all the libraries. Your inability to build the 
PostgreSQL module indicates you haven't understood this, despite the 
advice you have been given several times.

After untarring the FreeRADIUS 2.0.5 tarball and changing directory to 
the root of the untarred tarball, these steps are roughly what you need:

LDFLAGS="-L/usr/local/lib -pthread" ; \
  CFLAGS+="-I/usr/local/include -L/usr/local/lib" ; \
  ./configure --prefix=/usr/local --libdir=/usr/local/lib \
  --localstatedir=/var --with-docdir=/usr/local/share/doc/freeradius \
  --with-logdir=/var/log \
  --with-openssl-includes=/usr/local/include/openssl \

gmake install

You must add --with-pic to the first command if using FreeBSD amd64. You 
should omit the two openssl lines if you don't have the OpenSSL port 

I don't recommend this - I really do believe it's better to use the 

Best wishes,

David Wood
david at

More information about the Freeradius-Users mailing list