Gentoo Development Guide

Configuring Build Environment

Sometimes it is necessary to manipulate certain aspects of the user's build environment before running ./configure. The flag-o-matic eclass is the best choice for manipulating CFLAGS, LDFLAGS and suchlike.

Note

Except where otherwise specified, any function which operates on CFLAGS also operates on CXXFLAGS.

Ebuilds must not simply ignore user CFLAGS, CXXFLAGS or LDFLAGS — see Not Filtering Variables.

Guidelines for Flag Filtering

If a package breaks with any reasonable CFLAGS, it is best to filter the problematic flag if a bug report is received. Reasonable CFLAGS are -march=, -mcpu=, -mtune= (depending upon arch), -O2, -Os and -fomit-frame-pointer. Note that -Os should usually be replaced with -O2 rather than being stripped entirely. The -fstack-protector flag should probably be in this group too, although our hardened team claim that this flag never ever breaks anything...

The -pipe flag doesn't affect the generated code, so it's not really relevant here, but it's a sensible flag to have set globally.

If a package breaks with other (insane) CFLAGS, it is perfectly OK to close the bug with a WONTFIX suggesting that the user picks more sensible global CFLAGS. Similarly, if you suspect that a bug is caused by insane CFLAGS, an INVALID resolution is suitable.

All of the following assumes that the ebuild has an inherit flag-o-matic line in the correct place.

Simple Flag Stripping

The filter-flags function can be used to remove a particular flag from CFLAGS. Multiple arguments can be supplied; each is the name of a flag to remove.

    # -fomit-frame-pointer leads to nasty broken code on sparc thanks to a
    # rather icky asm function
    use sparc && filter-flags -fomit-frame-pointer

There is a filter-ldflags function available which does the equivalent for LDFLAGS.

If a package is known to be very CFLAGS sensitive, the strip-flags function will remove most flags, leaving only a minimal conservative set of flags.

    # Our app hates screwy flags
    strip-flags

Flag Replacement

To replace a flag with a different one, use replace-flags. This is most commonly used to replace -Os with -O2 (or -O3 with -O2 if you are feeling kind).

    # Seems to have issues with -Os, switch to -O2
    replace-flags -Os -O2

There is also a special function named replace-cpu-flags for replacing CPU (-mtune, -mcpu, -march) designation flags. The last argument is the flag to use; previous arguments are the flags to be replaced.

    # Can't use ultrasparc or ultrasparc3 code, drop to v9
    replace-cpu-flags ultrasparc ultrasparc3 v9

Adding Additional Flags

Sometimes it is necessary to add in additional CFLAGS or LDFLAGS. The append-flags and append-ldflags functions can be used here.

    # If we're using selinux, we need to add a -D
    use selinux && append-flags "-DWITH_SELINUX"

    # Secure linking needed, since we're setuid root
    append-ldflags -Wl,-z,now

See flag-o-matic.eclass for a full reference.