The Bad Build System Drinking Game

Software build systems. A lot of them are bad, but how bad is yours? Play the build system drinking game and find out.

build_system_drink
  • Take a shot if your build system takes more than 2 minutes to do an incremental build. Take 2 shots if it takes more than 5 minutes.
  • Take a shot if your build system takes more than 10 minutes to do a full build. Take two shots if it takes a long time to do a full build, and there are no incremental builds.
  • Take a shot if your build system downloads things from the internet without being asked to. This could be either because your build system is trying to act as a package manager, or because your build system invokes your operating system's package manager. Or perhaps it just invokes wget! Take two shots if it downloads things using an unauthenticated protocol (such as HTTP) by default.
  • Take a shot if your build system only works on one platform. Take two shots if it only works on a specific release (or narrow range of releases) of that platform. For example, if it only works on Windows XP, or Ubuntu 12.04, but not later or earlier releases of those platforms, you have to take two shots.
  • Take a shot if your build system makes very specific assumptions about the build environment, such as "the current username is bob" or "the build directory is always /opt/build." Take two shots if those very specific assumptions require more than two pages of documentation. Take three shots if those assumptions are undocumented.
  • Take a shot if any part of your build system is proprietary. Take three shots if it's proprietary and the company that made it went out of business or lost the source code. This still happens sometimes in the embedded systems world.
  • Take a shot if you get mysterious errors if you don't run "make clean" (or something like it) after certain things have changed in the source tree. Take two shots if make clean sometimes doesn't do enough and you have to "manually" clean the source directory with "git clean" or "rm -rf".
  • Take a shot if you can't parallelize your build by running "make -j", "mvn -T 2" or a similar option. This could be because of poorly written Makefiles (or other build files), or because the build system itself doesn't support parallelization. Take two shots if the same user can't launch two builds in parallel in different source directories on same computer. This could happen if the build system creates a lockfile somewhere-- for example, the Scala Build Tool ("sbt") does this.
  • Take a shot if your build system dumps the build products into the source directory (i.e. doesn't support out-of-tree builds.). Take two shots if the build products aren't in the git or svn ignore list, and create noise when running "git diff" or "svn diff."
  • Take a shot if your build system was not designed to be run from the command line. For example, if it requires you to visit a web site or click buttons in a dialog box, take a shot.
  • Take a shot if your build system recursively invokes itself. Take a shot if your build system generates build files and then invokes a different build system. Take two shots if your build system generates shell scripts or m4 scripts, like automake does.
  • Take a shot if your build system writes more than a screen or two (24 or 48 lines) of output to standard output or standard error for a simple incremental build. Take two shots if it generates more than a megabyte of output. Take three shots if it generates more than a megabyte of output, but leaves out the exception text from failing unit tests (like Maven does.)
  • Take a shot if your build system does more than build the software by default. For example, if it runs tests by default (especially really long tests), take a shot. If it starts a web server or SQL server by default, take a shot. Take two shots if there is no way to skip running tests. Take three shots if your build system deploys software to production by default when run without any additional options.
  • Take a shot if your project contains build files for more than one build system. For example, if your project has build files for both automake and cmake, or both Maven and sbt, take a shot. Take two shots if there are things that you can only do with one build system or the other. Take three shots if nobody knows exactly what can be done with one build system or the other.
  • Take a shot if your project's dependencies are undocumented... for example, if it depends on the bash shell or curl being installed but that isn't documented anywhere. Take two shots if it depends on an older version of a certain dependency being installed, but this isn't documented anywhere.
  • Take three shots if your project has conflicting dependencies. For example, if your project pulls in Guava 11, but also pulls in another dependency that itself requires Guava 8, take three shots.
  • Take a shot if your build system interacts with source control in any way other than just getting a commit revision to identify the version-- for example, if it runs a git or subversion checkout as part of the build process.
  • Take a shot if your build system is based on XML. Take a shot if your build system is based on any external scripting language that the user has to install separately. Take two shots if your build system is based on Perl.
  • Take a shot if your project's build files don't work with the latest version of the build system. For example, if your project uses automake and it doesn't work with the latest automake version, take a shot. Take two shots if you informed someone on the project about this and he or she told you to downgrade your build system's version.
  • Take a shot if your builds sometimes mysteriously fail and nobody knows why. Take two shots if people know why but are too lazy to fix it.
  • Take two shots if your project can't get repeatable builds. This could happen because your build system has a dependency manager which periodically refetches the latest versions of dependencies without being explicitly asked to do so-- like Maven does. Or it could be because your Makefiles are poorly written and pull in too much from the environment. Either way, take two shots.
  • Take a shot if your project's build spews warnings messages. Take two shots if months go by and the warnings still aren't fixed.
  • Take a shot if you can't build your project without building other bundled projects. Take a shot recursively for every bad thing that appears in the build system of those other projects.
  • Take a shot if you are the only one who knows how the build system works. Take two shots if nobody knows how the build system works.
  • Take a shot if you think that your build system might have started as a prank that got way out of hand. Take two shots if you're sure of it.