Empirical Software Engineering

, Volume 22, Issue 6, pp 3117–3148 | Cite as

An empirical study of unspecified dependencies in make-based build systems

  • Cor-Paul Bezemer
  • Shane McIntosh
  • Bram Adams
  • Daniel M. German
  • Ahmed E. Hassan


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.


Build systems Unspecified dependencies 


  1. Adams B, Tromp H, De Schutter K, De Meuter W (2007) Design recovery and maintenance of build systems. In: IEEE international conference on software maintenance (ICSM), pp 114–123Google Scholar
  2. Adams B, De Schutter K, Tromp H, De Meuter W (2008) The evolution of the linux build system. Electronic Communications of the EASST 8Google Scholar
  3. Banerjee M, Capozzoli M, McSweeney L, Sinha D (1999) Beyond kappa: a review of interrater agreement measures. Can J Stat 27(1):3–23. doi: 10.2307/3315487 MathSciNetCrossRefzbMATHGoogle Scholar
  4. Chastain ME (1999) Re: corrupt modversions.h built in 2.2.13., [Online; accessed December 21, 2016]
  5. Coetzee D, Bhaskar A, Necula G (2011) apmake: A reliable parallel build manager. In: 2011 USENIX Annual Technical Conference (USENIX)Google Scholar
  6. Feldman SI (1979) Make – a program for maintaining computer programs. Softw Pract Experience 9(4):255–265CrossRefzbMATHGoogle Scholar
  7. Germaschewski K (2002) fixdep.c Source Code. [Online; accessed December 21, 2016]
  8. Google (2015a) Bazel., [Online; accessed December 21, 2016]
  9. Google (2015b) Bazel: Concepts and terminology. [Online; accessed December 21, 2016]
  10. Gunter CA (2000) Abstracting dependencies between software configuration items. ACM Trans Softw Eng Methodol 9(1):94–131CrossRefGoogle Scholar
  11. Hassan A, Zhang K (2006) Using decision trees to predict the certification result of a build. In: 21st IEEE/ACM International Conference on Automated Software Engineering (ASE), pp 189–198Google Scholar
  12. Hoyt B (2009) Fabricate - the better build tool., [Online; accessed December 21, 2016]Google Scholar
  13. Jørgensen N (2002) Safeness of make-based incremental recompilation, vol 2391. Springer, Berlin Heidelberg, pp 126–145Google Scholar
  14. Leslie B (2008) Memoize: a build tool framework., [Online; accessed December 21, 2016]
  15. McIntosh S, Adams B, Nguyen TH, Kamei Y, Hassan AE (2011) An empirical study of build maintenance effort. In: Proceedings of the 33rd international conference on software engineering (ICSE). ACM, New York, pp 141–150Google Scholar
  16. McIntosh S, Adams B, Nagappan M, Hassan A (2014a) Mining co-change information to understand when build changes are necessary. In: IEEE International Conference on Software Maintenance and Evolution (ICSME), pp 241–250Google Scholar
  17. McIntosh S, Nagappan M, Adams B, Mockus A, Hassan A (2014b) A large-scale empirical study of the relationship between build technology and build maintenance. Empir Softw Eng pp 1–47Google Scholar
  18. Miller P (1998) Recursive make considered harmful. AUUGN Journal of AUUG Inc 19(1):14–25MathSciNetGoogle Scholar
  19. Nadi S, Holt R (2011) Make it or break it: Mining anomalies from linux kbuild. In: 18th Working Conference on Reverse Engineering (WCRE), pp 315–324Google Scholar
  20. Nadi S, Holt R (2012) Mining kbuild to detect variability anomalies in linux. In: 16th European Conference on Software Maintenance and Reengineering (CSMR), pp 107–116Google Scholar
  21. Neitsch A, Wong K, Godfrey M (2012) Build system issues in multilanguage software. In: 28th IEEE International Conference on Software Maintenance (ICSM), pp 140–149Google Scholar
  22. OCaml Community (2013) Dependencies are missing in makefiles - MantisBT., [Online; accessed December 21, 2016]
  23. Qt Wiki (2015) Qt-Version-Compatibility., [Online; accessed December 21, 2016]
  24. Seo H, Sadowski C, Elbaum S, Aftandilian E, Bowdidge R (2014) Programmers’ Build errors: A case study (at google). In: Proceedings of the 36th international conference on software engineering (ICSE). ACM, New York, pp 724–734Google Scholar
  25. Tamrawi A, Nguyen HA, Nguyen HV, Nguyen T (2012) Build code analysis with symbolic evaluation. In: 34th International Conference on Software Engineering (ICSE), pp 650–660Google Scholar
  26. Tarski A (1941) On the calculus of relations. J Symb Log 6(3):73–89MathSciNetCrossRefzbMATHGoogle Scholar
  27. Tu Q, Godfrey MW (2001) The build-time software architecture view. In: Proceedings of the IEEE International Conference on Software Maintenance (ICSM), IEEE Computer Society, Washington, DC, USA, pp 398–Google Scholar
  28. Xia X, Lo D, Wang X, Zhou B (2014) Build system analysis with link prediction. In: Proceedings of the 29th annual ACM symposium on applied computing (SAC). ACM, New York, pp 1184–1186Google Scholar
  29. Yamada M (2015) [PATCH v2] ARM: add boot image dependencies to not generate invalid images.!topic/fa.linux.kernel/00v6OF3KaSM, [Online; accessed December 21, 2016]
  30. Zhou B, Xia X, Lo D, Wang X (2014) Build predictor: More accurate missed dependency prediction in build configuration files. In: IEEE 38th Annual Computer Software and Applications Conference (COMPSAC), pp 53–58Google Scholar

Copyright information

© Springer Science+Business Media New York 2017

Authors and Affiliations

  1. 1.Queen’s UniversityKingstonCanada
  2. 2.McGill UniversityMontrealCanada
  3. 3.Polytechnique MontréalMontrealCanada
  4. 4.University of VictoriaVictoriaCanada

Personalised recommendations