Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.

How to build software outside Homebrew with Homebrew keg_only dependencies

What does "keg-only" mean?

The FAQ briefly explains this.

As an example:

OpenSSL isn’t symlinked into my $PATH and non-Homebrew builds can’t find it!

This is because Homebrew keeps it locked inside its individual prefix, rather than symlinking to the publicly-available location, usually /usr/local.

Advice on potential workarounds

A number of people in this situation are either forcefully linking keg_only tools with brew link --force or moving default system utilities out of the $PATH and replacing them with manually-created symlinks to the Homebrew-provided tool.

Please do not remove macOS native tools and forcefully replace them with symlinks back to the Homebrew-provided tool. Doing so can and likely will cause significant breakage when attempting to build software.

brew link --force creates a warning in brew doctor to let both you and maintainers know that a link exists that could be causing issues. If you’ve linked something and there’s no problems at all? Feel free to ignore the brew doctor error.

How do I use those tools outside of Homebrew?

Useful, reliable alternatives exist should you wish to use keg_only tools outside of Homebrew.

Build flags

You can set flags to give configure scripts or Makefiles a nudge in the right direction. An example of flag setting:

./configure --prefix=/Users/Dave/Downloads CFLAGS=-I$(brew --prefix)/opt/openssl/include LDFLAGS=-L$(brew --prefix)/opt/openssl/lib

An example using pip:

CFLAGS=-I$(brew --prefix)/opt/icu4c/include LDFLAGS=-L$(brew --prefix)/opt/icu4c/lib pip install pyicu

$PATH modification

You can temporarily prepend your $PATH with the tool’s bin directory, such as:

export PATH=$(brew --prefix)/opt/openssl/bin:$PATH

This will prepend that folder to your $PATH, ensuring any build script that searches the $PATH will find it first.

Changing your $PATH using that command ensures the change only exists for the duration of that shell session. Once you are no longer in that session, the $PATH reverts to the prior state.

pkg-config detection

If the tool you are attempting to build is pkg-config aware, you can amend your PKG_CONFIG_PATH to find that keg_only utility’s .pc file, if it has them. Not all formulae ship with those files.

An example of this is:

export PKG_CONFIG_PATH=$(brew --prefix)/opt/openssl/lib/pkgconfig

If you’re curious about the PKG_CONFIG_PATH variable man pkg-config goes into more detail.

You can get pkg-config to detail the default search path with:

pkg-config --variable pc_path pkg-config