Skip to content
scicalculator edited this page Jan 8, 2013 · 6 revisions

What is Superenv?

Superenv is an attempt to improve build-reliability and end-build-quality. It is:

  • The user’s PATH is ignored. Thus, only tools we authorize can be used during builds1.
  • PATH is reconstructed. For example: /usr/local/Library/$ENV/4.3:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin.
  • /usr/local/Library/$ENV/4.3 (superbin2) contains wrapper-scripts for cc, etc.)
  • We unset all build-related ENV variables.
  • Build systems now pick their preferred compilers from superbin.
  • superbin scripts are smart. They forcibly insert all include-paths and library-paths that Homebrew formulae need to compile, as well as remove flags that break builds.

Rationale & Benefits

Because we are working with a practically virgin environment, we are essentially giving build-systems the kind of environments that the developers are using to building with. This makes them more reliable. By stepping into the toolchain between the build-system and the compiler, we have complete control over the toolchain. We can prevent a good deal of breakage, and it ensures that Homebrew uses the same executables that the compiler sees (and not those bundled with the system).

So:

  • We no longer worry about MacPorts/Fink being installed
  • We no longer worry about system duplicates
  • We override common tools and fix them—we no longer have to do so with workarounds in affected formula, waiting for a fix from Apple.
  • Builds are forcibly optimized how we want, and debug info forcibly removed.

Footnotes

  • : Nearly as much, anyway.
  • 1: Formula can opt-into re-adding the user’s PATH again. Some formulae need this.
  • 2: Indeed; this is selected based on Xcode version.
Clone this wiki locally