brew/docs/How-to-Build-Software-Outside-Homebrew-with-Homebrew-keg-only-Dependencies.md
Issy Long 31d7bcc583
Add a last_reviewed_date to docs metadata
- At the AGM we formed an ad-hoc documentation working group.
- One of our ideas was that we should have a last reviewed date for
  documentation, so that we can periodically implement a review
  mechanism (GitHub Actions posts to Slack for a regular documentation
  outdatedness check?) to track how old docs are and ensure they're
  still relevant.
- This is a first step towards that goal, by adding a `last_review_date`
  to the metadata of all docs with a date of earlier than Homebrew's
  inception because everything needs reviewing so that we start from a
  good base!
2025-02-03 11:56:07 +00:00

72 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
last_review_date: "1970-01-01"
---
# How to Build Software Outside Homebrew with Homebrew `keg_only` Dependencies
## What does "keg-only" mean?
The [FAQ](FAQ.md#what-does-keg-only-mean) briefly explains this.
As an example:
*OpenSSL isnt symlinked into my `PATH` and non-Homebrew builds cant find it!*
This is because Homebrew isolates it within its individual prefix, rather than symlinking to the publicly available location.
## 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 youve linked something and theres 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:
```sh
./configure --prefix=/Users/Dave/Downloads CFLAGS="-I$(brew --prefix openssl)/include" LDFLAGS="-L$(brew --prefix openssl)/lib"
```
An example using `pip`:
```sh
CFLAGS="-I$(brew --prefix icu4c)/include" LDFLAGS="-L$(brew --prefix icu4c)/lib" pip install pyicu
```
### `PATH` modification
You can temporarily prepend your `PATH` with the tools `bin` directory, such as:
```sh
export PATH="$(brew --prefix openssl)/bin:${PATH}"
```
This will prepend the directory to your `PATH`, ensuring any build script that searches the `PATH` will find it first.
Changing your `PATH` using this command ensures the change only exists for the duration of the shell session. Once the current session ends, the `PATH` reverts to its prior state.
### `pkg-config` detection
If the tool you are attempting to build is [pkg-config](https://en.wikipedia.org/wiki/Pkg-config) aware, you can amend your `PKG_CONFIG_PATH` to find a keg-only utilitys `.pc` files, if it has any. Not all formulae ship with these files.
An example of this is:
```sh
export PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig"
```
If youre curious about the `PKG_CONFIG_PATH` variable, `man pkg-config` goes into more detail.
You can get `pkg-config` to print the default search path with:
```sh
pkg-config --variable pc_path pkg-config
```