skalibs
Software
skarnet.org

# skalibs configuration flags

The skalibs `./configure` script comes with a few uncommon options; this page explains what they are for.

### --enable-slashpackage[=sproot]

This flag tells configure that you want to install skalibs according to the slashpackage convention. If you enable it, and $v is the version of skalibs you're compiling, `make install` will install the skalibs header files in `/package/prog/skalibs-$v/include`, the static libraries in `/package/prog/skalibs-$v/library`, the dynamic libraries in `/package/prog/skalibs-$v/library.so` and the data files in `/package/prog/skalibs-$v/etc`, all prefixed by sproot if present.

It will also prepend the default path with `/command`, unless an explicit default path has been given via the `--with-default-path` option.

Additionally, it will add two more "make" targets:

- `make update` will update the `/package/prog/skalibs` symbolic link to point to `skalibs-$v`
- `make -L global-links` will make links from `/library.so` to the installed skalibs shared libraries.

If this option is not given, no slashpackage support will be provided.

### --enable-tai-clock

To understand what this flag is about - and the next two flags too - you should start by reading this page about Unix time, which David Madore wrote after a long and fairly complete discussion we had on the subject. You can also read what DJB says about Unix time. Unfortunately, when he says "the POSIX rules are so outrageously dumb (...) that no self-respecting engineer would obey them", DJB is wrong: a lot of people follow the POSIX rules. Or maybe he's right... and there are very, very few self-respecting engineers.

Basically, when you configure a Unix system, there are essentially two ways to deal with your system clock.

1. You can set your system clock to TAI-10, which is the "right", but uncommon, thing to do:
   - ↑ The main advantage of this setup is that it makes your system clock linear. In other words, gettimeofday() becomes suitable for both timestamping (which needs absolute time) and timeout computations (which need reliable interval measurements); if your clock is accurate enough, it can function as both a wall clock and a stopwatch. This simplifies keeping track of the current time considerably, and makes event loop handling (with functions such as iopause()) trivial.
   - ↑ skalibs uses TAI internally; setting your system clock to TAI-10 saves a lot of conversions and makes time computations with skalibs more efficient.
   - → skalibs-aware software will display GMT or local time properly in every case, but you have to use the `right/` timezones, from Arthur David Olson's timezone library, to prevent your other software from being confused by a TAI-10 system clock. If you do not use `right/` timezones, utilities such as `date` will not compute the proper time - they will have an offset of 24 seconds or so.
   - ↓ This setup is arguably not SUSv4 conformant (a strict interpretation of Single Unix requires the system clock to be set to UTC).
   - ↓ This setup is not compatible with ntpd. `ntpd`'s design is flawed: it makes the mistake of setting the system clock itself - instead of simply making the computed time available to other programs, one of which could set the system clock - and it always sets it to UTC. (The s6-networking package provides alternate ways to synchronize your clock, though.)
2. You can set your system clock to UTC, which is the common, strictly POSIX setup:
   - ↑ This is strictly SUSv4-compliant. Most Unix machines all over the world are set up like this.
   - ↑ This is compatible with ntpd.
   - → You should use `posix/` time zones in that case, not `right/` time zones.
   - ↓ skalibs time computations will take a bit more processing power.
   - ↓ Most importantly, you forsake all linearity - and even monotonicity - on your system clock, which can now only be used as a wall clock, not as a stopwatch. skalibs will try its best to do accurate time computations, but there's no way `gettimeofday()` can be relied on when a leap second is nearby; you have to use CLOCK_MONOTONIC as a stopwatch for accurate interval measurement.

Use `--enable-tai-clock` if your system clock is set to TAI-10. I generally recommend this setup for computers you have full control on, on which you install and tweak the software your way, like manually administered servers or embedded boxes. If you do not run ntpd and do not mind breaking POSIX, it is the sensible choice.

Do not use this option if your system clock is set to UTC, i.e. if you're in none of the above cases: you are a POSIX freak, or your Unix distribution is running ntpd for you, or other software is assuming you're on UTC. This is the default.

### --disable-ipv6

If you set this option, then skalibs will be compiled without IPv6 support, even if your target architecture supports it. This can significantly reduce the size of your networking applications if they don't need IPv6 support.

If you don't set this option, then skalibs will include IPv6 support in the relevant networking functions if and only if the target architecture supports it. This is the default, and it is safe.

### --with-default-path=path

The execvep() function uses the value of the PATH environment variable as its executable search path. Specifying this option to configure tells execvep() what executable search path to use when PATH is undefined (which should not happen often anyway). The default is `/usr/bin:/bin`, which is usually safe.

### --with-sysdep-devurandom=yes

When compiling natively, skalibs probes the build system for sysdeps, i.e. system-specific behaviours that influence the way skalibs must implement certain interfaces. This autodetection can be overriden on the configure command line: for a sysdep named K, if you want to enforce the value V, you can use `--with-sysdep-K=V` as a configure option.

(This is similar to the `ac_cv_foobar_K=V` environment variable mechanism in autotools.)

When cross-compiling, there are a few sysdeps that cannot be autodetected and have to be provided manually on the command line. The `devurandom` sysdep, which encodes the existence of a functional `/dev/urandom` device on the target, is one of those. `--with-sysdep-devurandom=yes` tells skalibs to assume that there is such a device it can rely on for random number generation.