An Empirical Study of Unspecified Dependencies in Make-Based Build Systems

Authors - Cor-Paul Bezemer, Shane McIntosh, Bram Adams, Daniel M. German, Ahmed E. Hassan
Venue - Empirical Software Engineering, pp. To appear, 2017

Related Tags - EMSE 2017 build systems

Abstract - Software developers rely on a build system to compile their source code changes and produce deliverables for testing and deployment. Since the full build of large software systems can take hours, the incremental build is a cornerstone of modern build systems. Incremental builds should only recompile deliverables whose dependencies have been changed by a developer. However, in many organizations, such dependencies still are identified by build rules that are specified and maintained (mostly) manually, typically using technologies like make. Incomplete rules lead to unspecified dependencies that can prevent certain deliverables from being rebuilt, yielding incomplete results, which leave sources and deliverables out-of-sync.

In this paper, we present a case study on unspecified dependencies in the make-based build systems of the GLib, OpenLDAP, Linux and Qt open source projects. To uncover unspecified dependencies in make-based build systems, we use an approach that combines a conceptual model of the dependencies specified in the build system with a concrete model of the files and processes that are actually exercised during the build. Our approach provides an overview of the dependencies that are used throughout the build system and reveals unspecified dependencies that are not yet expressed in the build system rules.

During our analysis, we find that unspecified dependencies are common. We identify 6 common causes in more than 1.2 million unspecified dependencies.

Preprint - PDF


  Author = {Cor-Paul Bezemer and Shane McIntosh and Bram Adams and Daniel M. German and Ahmed E. Hassan},
  Title = {{An Empirical Study of Unspecified Dependencies in Make-Based Build Systems}},
  Year = {2017},
  Journal = {Empirical Software Engineering},
  Pages = {To appear}