A developer working with a single package needs to
-
Download the source code, usually from a version control system.
-
Determine the dependencies of the package.
-
Install missing packages.
-
Configure the package build system so that it can locate the dependent packages.
All of this can be accomplished manually, if tediously. Doing things manually allows the developer to, among other things:
-
Install the source wherever s/he sees fit.
-
Work on a package that may or may not already be installed on the system.
-
Use an IDE to work with the package.
-
Perform incremental builds, clean builds, etc., as he s/he sees fit.
-
Throw up his or her hands, delete the source directory, and start over.
The developer takes all these things for granted.
A developer may need to work with more than one package at a time. Doing so involves all the issues of single-package development. In addition:
-
Incremental builds of multiple packages are potentially complex and error-prone. Although single-package incremental builds have multiple common solutions, e.g., hand-written make files, autotools and CMake, there are no multiple-package build systems with similarly widespread adoption.
-
Developing multiple packages potentially requires re-building intermediate packages not under development. Consider the simplest case: A depends on B depends on C. If the developer is working on A and C, s/he will also have to include B in order to propagate C's changes to A.
Spack compiles packages in a very particular way. In particular, Spack uses compiler wrappers to pass extra flags to the compilers. Developers may need/want to understand how their packages behave when compiled by Spack.